lkml.org 
[lkml]   [2004]   [Jun]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH][RFC] Spinlock-timeout
On Sat, 2004-06-05 15:31:26 -0500, Jake Moilanen <moilanen@austin.ibm.com>
wrote in message <1086467486.20906.59.camel@dhcp-client215.upt.austin.ibm.com>:
> Here's a patch that will BUG() when a spinlock is held for longer then X
> seconds. It is useful for catching deadlocks since not all archs have a
> NMI watchdog.

I like the idea. However, I don't like touching all arch's Kconfig
files. I think it's better to either put this into ./lib/Kconfig (well,
doesn't really fit there), ot (even better:) put it into the Debug
Kconfig file.

> diff -Nru a/include/linux/spinlock.h b/include/linux/spinlock.h
> --- a/include/linux/spinlock.h Sat Jun 5 14:25:51 2004
> +++ b/include/linux/spinlock.h Sat Jun 5 14:25:51 2004
> @@ -38,6 +38,16 @@
> #ifdef CONFIG_SMP
> #include <asm/spinlock.h>
>
> +#if defined(CONFIG_SPINLOCK_TIMEOUT)
> +
> +#include <asm/param.h>
> +
> +#define SPINLOCK_TIMEOUT CONFIG_SPINLOCK_TIMEOUT_TIME
> +extern unsigned long volatile jiffies;
> +
> +#endif /* CONFIG_SPINLOCK_TIMEOUT */
> +
> +
> #else
>
> #define _raw_spin_lock_flags(lock, flags) _raw_spin_lock(lock)

I'd say just include <linux/jiffies.h> and drop the whole #ifdef/#endif
block.

> @@ -218,11 +228,27 @@
> } while (0)
>
> #else
> +#if defined(CONFIG_SPINLOCK_TIMEOUT)
> +
> +static inline void spin_lock(spinlock_t * lock) {
> + unsigned long jiffy_timeout = jiffies + (SPINLOCK_TIMEOUT * HZ);
> +
> + preempt_disable();
> + do {
> + if (jiffies >= jiffy_timeout)
> + BUG();
> + } while (!_raw_spin_trylock(lock));
> +}
> +
> +#else /* CONFIG_SPINLOCK_TIMEOUT */
> +
> #define spin_lock(lock) \
> do { \
> preempt_disable(); \
> _raw_spin_lock(lock); \
> } while(0)
> +
> +#endif /* CONFIG_SPINLOCK_TIMEOUT */
>
> #define write_lock(lock) \
> do { \

Also, printing out ->module, ->owner and ->oline might help additionally
to just BUG()ing. So you see the (former) owner of the lock.

> @@ -3967,6 +3971,10 @@
> while (spin_is_locked(lock))
> cpu_relax();
> preempt_disable();
> +#if defined(CONFIG_SPINLOCK_TIMEOUT)
> + if (jiffies > = jiffy_timeout)
> + BUG();
> +#endif
> } while (!_raw_spin_trylock(lock));
> }
>

Dito.

MfG, JBG

--
Jan-Benedict Glaw jbglaw@lug-owl.de . +49-172-7608481
"Eine Freie Meinung in einem Freien Kopf | Gegen Zensur | Gegen Krieg
fuer einen Freien Staat voll Freier Bürger" | im Internet! | im Irak!
ret = do_actions((curr | FREE_SPEECH) & ~(NEW_COPYRIGHT_LAW | DRM | TCPA));
[unhandled content-type:application/pgp-signature]
\
 
 \ /
  Last update: 2005-03-22 14:03    [W:0.143 / U:0.220 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site