In kernel/sched.c the return value from preempt_count() is cast to an int. That made sense when preempt_count was defined as different types on is not needed and should go away. The patch removes the cast. In kernel/timer.c the return value from preempt_count() is assigned to a variable of type u32 and then that unsigned value is later compared to preempt_count(). Since preempt_count() returns an int, an int is what should be used to store its return value. Storing the result in an unsigned 32bit integer made a tiny bit of sense back when preempt_count was different types on different archs, but no more - let's not play signed vs unsigned comparison games when we don't have to. The patch modifies the code to use an int to hold the value. While I was around that bit of code I also made two changes to a nearby (related) printk() - I modified it to specify the loglevel explicitly and also broke the line into a few pieces to avoid it being longer than 80 chars and clarified the text a bit.
Unified · Split
| @@ -2576,7 +2576,7 @@ void fastcall add_preempt_count(int val) · 2575 unmodified lines | |||
| 2576 | /* | 2576 | /* |
| 2577 | * Underflow? | 2577 | * Underflow? |
| 2578 | */ | 2578 | */ |
| 2579 | BUG_ON(((int)preempt_count() < 0)); | 2579 | BUG_ON((preempt_count() < 0)); |
| 2580 | preempt_count() += val; | 2580 | preempt_count() += val; |
| 2581 | /* | 2581 | /* |
| 2582 | * Spinlock count overflowing soon? | 2582 | * Spinlock count overflowing soon? |
| @@ -489,10 +489,14 @@ static inline void __run_timers(tvec_base_t *base) · 488 unmodified lines | |||
| 489 | detach_timer(timer, 1); | 489 | detach_timer(timer, 1); |
| 490 | spin_unlock_irq(&base->t_base.lock); | 490 | spin_unlock_irq(&base->t_base.lock); |
| 491 | { | 491 | { |
| 492 | u32 preempt_count = preempt_count(); | 492 | int preempt_count = preempt_count(); |
| 493 | fn(data); | 493 | fn(data); |
| 494 | if (preempt_count != preempt_count()) { | 494 | if (preempt_count != preempt_count()) { |
| 495 | printk("huh, entered %p with %08x, exited with %08x?\n", fn, preempt_count, preempt_count()); | 495 | printk(KERN_WARNING "huh, entered %p " |
| 496 | "with preempt_count %08x, exited" | ||
| 497 | " with %08x?\n", | ||
| 498 | fn, preempt_count, | ||
| 499 | preempt_count()); | ||
| 496 | BUG(); | 500 | BUG(); |
| 497 | } | 501 | } |
| 498 | } | 502 | } |