| From stable-bounces@linux.kernel.org Sat Aug 5 12:14:36 2006 |
| Message-Id: <200608051913.k75JDlTV010898@shell0.pdx.osdl.net> |
| To: torvalds@osdl.org |
| From: akpm@osdl.org |
| Date: Sat, 05 Aug 2006 12:13:47 -0700 |
| Cc: akpm@osdl.org, greg@kroah.com, mingo@elte.hu, stable@kernel.org, olson@unixfolk.com |
| Subject: disable debugging version of write_lock() |
| |
| From: Andrew Morton <akpm@osdl.org> |
| |
| We've confirmed that the debug version of write_lock() can get stuck for long |
| enough to cause NMI watchdog timeouts and hence a crash. |
| |
| We don't know why, yet. Disable it for now. |
| |
| Also disable the similar read_lock() code. Just in case. |
| |
| Thanks to Dave Olson <olson@unixfolk.com> for reporting and testing. |
| |
| Acked-by: Ingo Molnar <mingo@elte.hu> |
| Signed-off-by: Andrew Morton <akpm@osdl.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| lib/spinlock_debug.c | 10 ++++++---- |
| 1 file changed, 6 insertions(+), 4 deletions(-) |
| |
| --- linux-2.6.17.8.orig/lib/spinlock_debug.c |
| +++ linux-2.6.17.8/lib/spinlock_debug.c |
| @@ -137,6 +137,7 @@ static void rwlock_bug(rwlock_t *lock, c |
| |
| #define RWLOCK_BUG_ON(cond, lock, msg) if (unlikely(cond)) rwlock_bug(lock, msg) |
| |
| +#if 0 /* __write_lock_debug() can lock up - maybe this can too? */ |
| static void __read_lock_debug(rwlock_t *lock) |
| { |
| int print_once = 1; |
| @@ -159,12 +160,12 @@ static void __read_lock_debug(rwlock_t * |
| } |
| } |
| } |
| +#endif |
| |
| void _raw_read_lock(rwlock_t *lock) |
| { |
| RWLOCK_BUG_ON(lock->magic != RWLOCK_MAGIC, lock, "bad magic"); |
| - if (unlikely(!__raw_read_trylock(&lock->raw_lock))) |
| - __read_lock_debug(lock); |
| + __raw_read_lock(&lock->raw_lock); |
| } |
| |
| int _raw_read_trylock(rwlock_t *lock) |
| @@ -210,6 +211,7 @@ static inline void debug_write_unlock(rw |
| lock->owner_cpu = -1; |
| } |
| |
| +#if 0 /* This can cause lockups */ |
| static void __write_lock_debug(rwlock_t *lock) |
| { |
| int print_once = 1; |
| @@ -232,12 +234,12 @@ static void __write_lock_debug(rwlock_t |
| } |
| } |
| } |
| +#endif |
| |
| void _raw_write_lock(rwlock_t *lock) |
| { |
| debug_write_lock_before(lock); |
| - if (unlikely(!__raw_write_trylock(&lock->raw_lock))) |
| - __write_lock_debug(lock); |
| + __raw_write_lock(&lock->raw_lock); |
| debug_write_lock_after(lock); |
| } |
| |