highmem: Fix race in debug_kmap_atomic() which could cause warn_count to underflow
authorSoeren Sandmann <[email protected]>
Wed, 28 Oct 2009 17:55:36 +0000 (18:55 +0100)
committerIngo Molnar <[email protected]>
Tue, 10 Nov 2009 03:15:32 +0000 (04:15 +0100)
debug_kmap_atomic() tries to prevent ever printing more than 10
warnings, but it does so by testing whether an unsigned integer
is equal to 0. However, if the warning is caused by a nested
IRQ, then this counter may underflow and the stream of warnings
will never end.

Fix that by using a signed integer instead.

Signed-off-by: Soeren Sandmann Pedersen <[email protected]>
Cc: Linus Torvalds <[email protected]>
Cc: [email protected]
Cc: <[email protected]> # .31.x
LKML-Reference: <[email protected]>
Signed-off-by: Ingo Molnar <[email protected]>
mm/highmem.c

index 25878cc49daa268806f46dfa4e05af8d6f8f3998..33587de6b8715cad25ee17254e1b82a4fa3454a3 100644 (file)
@@ -426,9 +426,9 @@ void __init page_address_init(void)
 
 void debug_kmap_atomic(enum km_type type)
 {
-       static unsigned warn_count = 10;
+       static int warn_count = 10;
 
-       if (unlikely(warn_count == 0))
+       if (unlikely(warn_count < 0))
                return;
 
        if (unlikely(in_interrupt())) {