Re: [PATCH][RFC] Spinlock-timeout

From: Jan-Benedict Glaw
Date: Sat Jun 05 2004 - 15:52:20 EST


On Sat, 2004-06-05 15:31:26 -0500, Jake Moilanen <moilanen@xxxxxxxxxxxxxx>
wrote in message <1086467486.20906.59.camel@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx>:
> 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@xxxxxxxxxx . +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));

Attachment: signature.asc
Description: Digital signature