* [PATCH][RFC] Spinlock-timeout
@ 2004-06-05 20:31 Jake Moilanen
2004-06-05 20:51 ` Jan-Benedict Glaw
` (2 more replies)
0 siblings, 3 replies; 16+ messages in thread
From: Jake Moilanen @ 2004-06-05 20:31 UTC (permalink / raw)
To: linux-kernel
[-- Attachment #1: Type: text/plain, Size: 259 bytes --]
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.
It is also helpful to find locks that are held too long.
Please send comments.
Thanks,
Jake
[-- Attachment #2: spinlock-timeout-2.6-1.patch --]
[-- Type: text/x-patch, Size: 19915 bytes --]
# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
# ChangeSet 1.1613 -> 1.1614
# arch/sparc/Kconfig 1.29 -> 1.30
# arch/ia64/defconfig 1.28 -> 1.29
# arch/mips/defconfig 1.12 -> 1.13
# arch/i386/Kconfig 1.113 -> 1.114
# arch/arm26/defconfig 1.3 -> 1.4
# arch/ppc64/defconfig 1.53 -> 1.54
# arch/arm/defconfig 1.6 -> 1.7
# arch/sparc64/defconfig 1.127 -> 1.128
# arch/s390/Kconfig 1.26 -> 1.27
# arch/mips/Kconfig 1.27 -> 1.28
# arch/um/Kconfig 1.16 -> 1.17
# include/linux/spinlock.h 1.29 -> 1.30
# arch/alpha/defconfig 1.26 -> 1.27
# arch/arm/Kconfig 1.51 -> 1.52
# arch/sh/defconfig 1.10 -> 1.11
# arch/ppc64/Kconfig 1.64 -> 1.65
# arch/arm26/Kconfig 1.12 -> 1.13
# arch/i386/defconfig 1.113 -> 1.114
# arch/x86_64/defconfig 1.39 -> 1.40
# arch/sparc/defconfig 1.20 -> 1.21
# arch/x86_64/Kconfig 1.48 -> 1.49
# kernel/sched.c 1.252 -> 1.253
# arch/ppc/defconfig 1.28 -> 1.29
# arch/s390/defconfig 1.36 -> 1.37
# arch/sparc64/Kconfig 1.55 -> 1.56
# arch/ia64/Kconfig 1.66 -> 1.67
# arch/ppc/Kconfig 1.52 -> 1.53
# arch/sh/Kconfig 1.31 -> 1.32
# arch/um/defconfig 1.9 -> 1.10
# arch/alpha/Kconfig 1.37 -> 1.38
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 04/06/05 moilanen@zippy.ltc.austin.ibm.com 1.1614
# Spinlock timeout
# --------------------------------------------
#
diff -Nru a/arch/alpha/Kconfig b/arch/alpha/Kconfig
--- a/arch/alpha/Kconfig Sat Jun 5 14:25:51 2004
+++ b/arch/alpha/Kconfig Sat Jun 5 14:25:51 2004
@@ -664,6 +664,20 @@
best used in conjunction with the NMI watchdog so that spinlock
deadlocks are also debuggable.
+config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout checking"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config DEBUG_RWLOCK
bool "Read-write spinlock debugging"
depends on DEBUG_KERNEL
diff -Nru a/arch/alpha/defconfig b/arch/alpha/defconfig
--- a/arch/alpha/defconfig Sat Jun 5 14:25:51 2004
+++ b/arch/alpha/defconfig Sat Jun 5 14:25:51 2004
@@ -868,6 +868,7 @@
# CONFIG_DEBUG_SLAB is not set
CONFIG_MAGIC_SYSRQ=y
# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_SPINLOCK_TIMEOUT is not set
# CONFIG_DEBUG_RWLOCK is not set
# CONFIG_DEBUG_SEMAPHORE is not set
CONFIG_DEBUG_INFO=y
diff -Nru a/arch/arm/Kconfig b/arch/arm/Kconfig
--- a/arch/arm/Kconfig Sat Jun 5 14:25:51 2004
+++ b/arch/arm/Kconfig Sat Jun 5 14:25:51 2004
@@ -721,6 +721,20 @@
best used in conjunction with the NMI watchdog so that spinlock
deadlocks are also debuggable.
+config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout checking"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config DEBUG_WAITQ
bool "Wait queue debugging"
depends on DEBUG_KERNEL
diff -Nru a/arch/arm/defconfig b/arch/arm/defconfig
--- a/arch/arm/defconfig Sat Jun 5 14:25:51 2004
+++ b/arch/arm/defconfig Sat Jun 5 14:25:51 2004
@@ -507,5 +507,6 @@
CONFIG_DEBUG_ERRORS=y
CONFIG_DEBUG_USER=y
# CONFIG_DEBUG_INFO is not set
+# CONFIG_SPINLOCK_TIMEOUT is not set
CONFIG_MAGIC_SYSRQ=y
CONFIG_DEBUG_LL=y
diff -Nru a/arch/arm26/Kconfig b/arch/arm26/Kconfig
--- a/arch/arm26/Kconfig Sat Jun 5 14:25:51 2004
+++ b/arch/arm26/Kconfig Sat Jun 5 14:25:51 2004
@@ -284,6 +284,20 @@
best used in conjunction with the NMI watchdog so that spinlock
deadlocks are also debuggable.
+config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout checking"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config DEBUG_WAITQ
bool "Wait queue debugging"
depends on DEBUG_KERNEL
diff -Nru a/arch/arm26/defconfig b/arch/arm26/defconfig
--- a/arch/arm26/defconfig Sat Jun 5 14:25:51 2004
+++ b/arch/arm26/defconfig Sat Jun 5 14:25:51 2004
@@ -344,6 +344,7 @@
CONFIG_DEBUG_SLAB=y
CONFIG_MAGIC_SYSRQ=y
CONFIG_DEBUG_SPINLOCK=y
+CONFIG_SPINLOCK_TIMEOUT=y
CONFIG_DEBUG_WAITQ=y
CONFIG_DEBUG_BUGVERBOSE=y
CONFIG_DEBUG_ERRORS=y
diff -Nru a/arch/i386/Kconfig b/arch/i386/Kconfig
--- a/arch/i386/Kconfig Sat Jun 5 14:25:51 2004
+++ b/arch/i386/Kconfig Sat Jun 5 14:25:51 2004
@@ -1247,6 +1247,20 @@
best used in conjunction with the NMI watchdog so that spinlock
deadlocks are also debuggable.
+config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout checking"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config DEBUG_PAGEALLOC
bool "Page alloc debugging"
depends on DEBUG_KERNEL
diff -Nru a/arch/i386/defconfig b/arch/i386/defconfig
--- a/arch/i386/defconfig Sat Jun 5 14:25:51 2004
+++ b/arch/i386/defconfig Sat Jun 5 14:25:51 2004
@@ -1216,6 +1216,7 @@
# CONFIG_DEBUG_KERNEL is not set
CONFIG_EARLY_PRINTK=y
CONFIG_DEBUG_SPINLOCK_SLEEP=y
+# CONFIG_SPINLOCK_TIMEOUT is not set
# CONFIG_FRAME_POINTER is not set
CONFIG_X86_FIND_SMP_CONFIG=y
CONFIG_X86_MPPARSE=y
diff -Nru a/arch/ia64/Kconfig b/arch/ia64/Kconfig
--- a/arch/ia64/Kconfig Sat Jun 5 14:25:51 2004
+++ b/arch/ia64/Kconfig Sat Jun 5 14:25:51 2004
@@ -459,6 +459,20 @@
If you say Y here, various routines which may sleep will become very
noisy if they are called with a spinlock held.
+config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout checking"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config IA64_DEBUG_CMPXCHG
bool "Turn on compare-and-exchange bug checking (slow!)"
depends on DEBUG_KERNEL
diff -Nru a/arch/ia64/defconfig b/arch/ia64/defconfig
--- a/arch/ia64/defconfig Sat Jun 5 14:25:51 2004
+++ b/arch/ia64/defconfig Sat Jun 5 14:25:51 2004
@@ -1093,6 +1093,7 @@
# CONFIG_DEBUG_SLAB is not set
# CONFIG_DEBUG_SPINLOCK is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_SPINLOCK_TIMEOUT is not set
# CONFIG_IA64_DEBUG_CMPXCHG is not set
# CONFIG_IA64_DEBUG_IRQ is not set
CONFIG_DEBUG_INFO=y
diff -Nru a/arch/mips/Kconfig b/arch/mips/Kconfig
--- a/arch/mips/Kconfig Sat Jun 5 14:25:51 2004
+++ b/arch/mips/Kconfig Sat Jun 5 14:25:51 2004
@@ -1360,6 +1360,20 @@
If you say Y here, various routines which may sleep will become very
noisy if they are called with a spinlock held.
+config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout checking"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config RTC_DS1742
bool "DS1742 BRAM/RTC support"
depends on TOSHIBA_JMR3927 || TOSHIBA_RBTX4927
diff -Nru a/arch/mips/defconfig b/arch/mips/defconfig
--- a/arch/mips/defconfig Sat Jun 5 14:25:51 2004
+++ b/arch/mips/defconfig Sat Jun 5 14:25:51 2004
@@ -125,6 +125,7 @@
CONFIG_CPU_HAS_SYNC=y
# CONFIG_PREEMPT is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_SPINLOCK_TIMEOUT is not set
#
# Bus options (PCI, PCMCIA, EISA, ISA, TC)
diff -Nru a/arch/ppc/Kconfig b/arch/ppc/Kconfig
--- a/arch/ppc/Kconfig Sat Jun 5 14:25:51 2004
+++ b/arch/ppc/Kconfig Sat Jun 5 14:25:51 2004
@@ -1166,6 +1166,20 @@
If you say Y here, various routines which may sleep will become very
noisy if they are called with a spinlock held.
+config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout checking"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config KGDB
bool "Include kgdb kernel debugger"
depends on DEBUG_KERNEL
diff -Nru a/arch/ppc/defconfig b/arch/ppc/defconfig
--- a/arch/ppc/defconfig Sat Jun 5 14:25:51 2004
+++ b/arch/ppc/defconfig Sat Jun 5 14:25:51 2004
@@ -1223,6 +1223,7 @@
# Kernel hacking
#
# CONFIG_DEBUG_KERNEL is not set
+# CONFIG_SPINLOCK_TIMEOUT is not set
CONFIG_BOOTX_TEXT=y
#
diff -Nru a/arch/ppc64/Kconfig b/arch/ppc64/Kconfig
--- a/arch/ppc64/Kconfig Sat Jun 5 14:25:51 2004
+++ b/arch/ppc64/Kconfig Sat Jun 5 14:25:51 2004
@@ -465,7 +465,21 @@
help
If you say Y here, various routines which may sleep will become very
noisy if they are called with a spinlock held.
-
+
+config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout checking"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
endmenu
source "security/Kconfig"
diff -Nru a/arch/ppc64/defconfig b/arch/ppc64/defconfig
--- a/arch/ppc64/defconfig Sat Jun 5 14:25:51 2004
+++ b/arch/ppc64/defconfig Sat Jun 5 14:25:51 2004
@@ -1067,6 +1067,7 @@
# CONFIG_PPCDBG is not set
# CONFIG_DEBUG_INFO is not set
CONFIG_DEBUG_SPINLOCK_SLEEP=y
+# CONFIG_SPINLOCK_TIMEOUT is not set
#
# Security options
diff -Nru a/arch/s390/Kconfig b/arch/s390/Kconfig
--- a/arch/s390/Kconfig Sat Jun 5 14:25:51 2004
+++ b/arch/s390/Kconfig Sat Jun 5 14:25:51 2004
@@ -423,6 +423,20 @@
If you say Y here, various routines which may sleep will become very
noisy if they are called with a spinlock held.
+config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout checking"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
endmenu
source "security/Kconfig"
diff -Nru a/arch/s390/defconfig b/arch/s390/defconfig
--- a/arch/s390/defconfig Sat Jun 5 14:25:51 2004
+++ b/arch/s390/defconfig Sat Jun 5 14:25:51 2004
@@ -476,6 +476,7 @@
# CONFIG_DEBUG_SLAB is not set
# CONFIG_DEBUG_INFO is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_SPINLOCK_TIMEOUT is not set
#
# Security options
diff -Nru a/arch/sh/Kconfig b/arch/sh/Kconfig
--- a/arch/sh/Kconfig Sat Jun 5 14:25:51 2004
+++ b/arch/sh/Kconfig Sat Jun 5 14:25:51 2004
@@ -675,6 +675,20 @@
best used in conjunction with the NMI watchdog so that spinlock
deadlocks are also debuggable.
+config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout checking"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config SH_STANDARD_BIOS
bool "Use LinuxSH standard BIOS"
help
diff -Nru a/arch/sh/defconfig b/arch/sh/defconfig
--- a/arch/sh/defconfig Sat Jun 5 14:25:51 2004
+++ b/arch/sh/defconfig Sat Jun 5 14:25:51 2004
@@ -351,6 +351,7 @@
#
# CONFIG_MAGIC_SYSRQ is not set
# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_SPINLOCK_TIMEOUT is not set
CONFIG_SH_STANDARD_BIOS=y
CONFIG_SH_EARLY_PRINTK=y
# CONFIG_KGDB is not set
diff -Nru a/arch/sparc/Kconfig b/arch/sparc/Kconfig
--- a/arch/sparc/Kconfig Sat Jun 5 14:25:51 2004
+++ b/arch/sparc/Kconfig Sat Jun 5 14:25:51 2004
@@ -440,6 +440,20 @@
If you say Y here, various routines which may sleep will become very
noisy if they are called with a spinlock held.
+config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout checking"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config DEBUG_BUGVERBOSE
bool "Verbose BUG() reporting (adds 70K)"
depends on DEBUG_KERNEL
diff -Nru a/arch/sparc/defconfig b/arch/sparc/defconfig
--- a/arch/sparc/defconfig Sat Jun 5 14:25:51 2004
+++ b/arch/sparc/defconfig Sat Jun 5 14:25:51 2004
@@ -611,6 +611,7 @@
# CONFIG_DEBUG_SLAB is not set
CONFIG_MAGIC_SYSRQ=y
# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_SPINLOCK_TIMEOUT is not set
# CONFIG_DEBUG_HIGHMEM is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
# CONFIG_DEBUG_BUGVERBOSE is not set
diff -Nru a/arch/sparc64/Kconfig b/arch/sparc64/Kconfig
--- a/arch/sparc64/Kconfig Sat Jun 5 14:25:51 2004
+++ b/arch/sparc64/Kconfig Sat Jun 5 14:25:51 2004
@@ -658,6 +658,20 @@
If you say Y here, various routines which may sleep will become very
noisy if they are called with a spinlock held.
+config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout checking"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config DEBUG_BUGVERBOSE
bool "Verbose BUG() reporting (adds 70K)"
depends on DEBUG_KERNEL
diff -Nru a/arch/sparc64/defconfig b/arch/sparc64/defconfig
--- a/arch/sparc64/defconfig Sat Jun 5 14:25:51 2004
+++ b/arch/sparc64/defconfig Sat Jun 5 14:25:51 2004
@@ -1718,6 +1718,7 @@
CONFIG_MAGIC_SYSRQ=y
# CONFIG_DEBUG_SPINLOCK is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_SPINLOCK_TIMEOUT is not set
# CONFIG_DEBUG_BUGVERBOSE is not set
# CONFIG_DEBUG_DCFLUSH is not set
# CONFIG_DEBUG_INFO is not set
diff -Nru a/arch/um/Kconfig b/arch/um/Kconfig
--- a/arch/um/Kconfig Sat Jun 5 14:25:51 2004
+++ b/arch/um/Kconfig Sat Jun 5 14:25:51 2004
@@ -222,6 +222,20 @@
config DEBUG_SPINLOCK
bool "Debug spinlocks usage"
+config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout checking"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config DEBUG_INFO
bool "Enable kernel debugging symbols"
help
diff -Nru a/arch/um/defconfig b/arch/um/defconfig
--- a/arch/um/defconfig Sat Jun 5 14:25:51 2004
+++ b/arch/um/defconfig Sat Jun 5 14:25:51 2004
@@ -399,6 +399,7 @@
#
# CONFIG_DEBUG_SLAB is not set
# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_SPINLOCK_TIMEOUT is not set
CONFIG_DEBUG_INFO=y
CONFIG_FRAME_POINTER=y
CONFIG_PT_PROXY=y
diff -Nru a/arch/x86_64/Kconfig b/arch/x86_64/Kconfig
--- a/arch/x86_64/Kconfig Sat Jun 5 14:25:51 2004
+++ b/arch/x86_64/Kconfig Sat Jun 5 14:25:51 2004
@@ -437,6 +437,20 @@
best used in conjunction with the NMI watchdog so that spinlock
deadlocks are also debuggable.
+config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout checking"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
# !SMP for now because the context switch early causes GPF in segment reloading
# and the GS base checking does the wrong thing then, causing a hang.
config CHECKING
diff -Nru a/arch/x86_64/defconfig b/arch/x86_64/defconfig
--- a/arch/x86_64/defconfig Sat Jun 5 14:25:51 2004
+++ b/arch/x86_64/defconfig Sat Jun 5 14:25:51 2004
@@ -814,6 +814,7 @@
# CONFIG_DEBUG_SLAB is not set
CONFIG_MAGIC_SYSRQ=y
# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_SPINLOCK_TIMEOUT is not set
# CONFIG_INIT_DEBUG is not set
# CONFIG_DEBUG_INFO is not set
# CONFIG_FRAME_POINTER is not set
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)
@@ -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 { \
diff -Nru a/kernel/sched.c b/kernel/sched.c
--- a/kernel/sched.c Sat Jun 5 14:25:51 2004
+++ b/kernel/sched.c Sat Jun 5 14:25:51 2004
@@ -3958,6 +3958,10 @@
*/
void __sched __preempt_spin_lock(spinlock_t *lock)
{
+#if defined(CONFIG_SPINLOCK_TIMEOUT)
+ unsigned long jiffy_timeout = jiffies + (SPINLOCK_TIMEOUT * HZ);
+#endif
+
if (preempt_count() > 1) {
_raw_spin_lock(lock);
return;
@@ -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));
}
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH][RFC] Spinlock-timeout
2004-06-05 20:31 [PATCH][RFC] Spinlock-timeout Jake Moilanen
@ 2004-06-05 20:51 ` Jan-Benedict Glaw
2004-06-10 18:44 ` Jake Moilanen
2004-06-06 10:13 ` Paul Mackerras
2004-06-06 22:23 ` Benjamin Herrenschmidt
2 siblings, 1 reply; 16+ messages in thread
From: Jan-Benedict Glaw @ 2004-06-05 20:51 UTC (permalink / raw)
To: linux-kernel
[-- Attachment #1: Type: text/plain, Size: 2581 bytes --]
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));
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH][RFC] Spinlock-timeout
2004-06-05 20:31 [PATCH][RFC] Spinlock-timeout Jake Moilanen
2004-06-05 20:51 ` Jan-Benedict Glaw
@ 2004-06-06 10:13 ` Paul Mackerras
2004-06-06 22:23 ` Benjamin Herrenschmidt
2 siblings, 0 replies; 16+ messages in thread
From: Paul Mackerras @ 2004-06-06 10:13 UTC (permalink / raw)
To: Jake Moilanen; +Cc: linux-kernel
Jake Moilanen writes:
> 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.
[snip]
> + if (jiffies >= jiffy_timeout)
> + BUG();
Don't you need to use time_after()?
Regards,
Paul.
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH][RFC] Spinlock-timeout
2004-06-05 20:31 [PATCH][RFC] Spinlock-timeout Jake Moilanen
2004-06-05 20:51 ` Jan-Benedict Glaw
2004-06-06 10:13 ` Paul Mackerras
@ 2004-06-06 22:23 ` Benjamin Herrenschmidt
2004-06-11 14:05 ` Jake Moilanen
2004-06-11 14:08 ` Jake Moilanen
2 siblings, 2 replies; 16+ messages in thread
From: Benjamin Herrenschmidt @ 2004-06-06 22:23 UTC (permalink / raw)
To: Jake Moilanen; +Cc: Linux Kernel list
On Sat, 2004-06-05 at 15:31, Jake Moilanen wrote:
> 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.
>
> It is also helpful to find locks that are held too long.
>
> Please send comments.
It would be better to use the timebase on CPUs that have one, no ? Or
you'll miss cases where either irqs are disabled or you are on a code
path issued by the timer interrupt, and thus jiffies isn't updated
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH][RFC] Spinlock-timeout
2004-06-05 20:51 ` Jan-Benedict Glaw
@ 2004-06-10 18:44 ` Jake Moilanen
2004-06-10 19:24 ` Jan-Benedict Glaw
0 siblings, 1 reply; 16+ messages in thread
From: Jake Moilanen @ 2004-06-10 18:44 UTC (permalink / raw)
To: Jan-Benedict Glaw; +Cc: linux-kernel
On Sat, 2004-06-05 at 15:51, Jan-Benedict Glaw wrote:
> 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.
>
I think you're right that lib/Kconfig would not be the right place, but
I don't think there is a debug Kconfig. I tried keeping the Kconfig
additions w/ CONFIG_DEBUG_SPINLOCK. The other option is to make a debug
Kconfig, but every arch seems pretty different in what they have for
their debug section.
> I'd say just include <linux/jiffies.h> and drop the whole #ifdef/#endif
> block.
You're right, I'll take this out.
> > @@ -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.
I think this would give us some extra info, but ->module, ->owner, and
->oline is only used for !SMP. I could add that in for all the arch's
spinlock_t in their asm/spinlock.h. I'm not sure how well that would be
received to increase the size of everyones spinlock_t even though it
would only be when CONFIG_DEBUG_SPINLOCK is on.
Thanks,
Jake
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH][RFC] Spinlock-timeout
2004-06-10 18:44 ` Jake Moilanen
@ 2004-06-10 19:24 ` Jan-Benedict Glaw
2004-06-10 21:00 ` Randy.Dunlap
0 siblings, 1 reply; 16+ messages in thread
From: Jan-Benedict Glaw @ 2004-06-10 19:24 UTC (permalink / raw)
To: linux-kernel
[-- Attachment #1: Type: text/plain, Size: 1628 bytes --]
On Thu, 2004-06-10 13:44:52 -0500, Jake Moilanen <moilanen@austin.ibm.com>
wrote in message <1086893091.3476.37.camel@dyn95394175.austin.ibm.com>:
> On Sat, 2004-06-05 at 15:51, Jan-Benedict Glaw wrote:
> > 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.
>
> I think you're right that lib/Kconfig would not be the right place, but
> I don't think there is a debug Kconfig. I tried keeping the Kconfig
Not yet:) Somebody is working towards getting all the different debug
options into a central Kconfig file. This was on LKML some four weeks
ago...
> additions w/ CONFIG_DEBUG_SPINLOCK. The other option is to make a debug
> Kconfig, but every arch seems pretty different in what they have for
> their debug section.
As I said, it's been worked on:)
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));
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH][RFC] Spinlock-timeout
2004-06-10 19:24 ` Jan-Benedict Glaw
@ 2004-06-10 21:00 ` Randy.Dunlap
0 siblings, 0 replies; 16+ messages in thread
From: Randy.Dunlap @ 2004-06-10 21:00 UTC (permalink / raw)
To: Jan-Benedict Glaw; +Cc: linux-kernel, moilanen
On Thu, 10 Jun 2004 21:24:30 +0200 Jan-Benedict Glaw wrote:
| On Thu, 2004-06-10 13:44:52 -0500, Jake Moilanen <moilanen@austin.ibm.com>
| wrote in message <1086893091.3476.37.camel@dyn95394175.austin.ibm.com>:
| > On Sat, 2004-06-05 at 15:51, Jan-Benedict Glaw wrote:
| > > 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.
| >
| > I think you're right that lib/Kconfig would not be the right place, but
| > I don't think there is a debug Kconfig. I tried keeping the Kconfig
|
| Not yet:) Somebody is working towards getting all the different debug
| options into a central Kconfig file. This was on LKML some four weeks
| ago...
|
| > additions w/ CONFIG_DEBUG_SPINLOCK. The other option is to make a debug
| > Kconfig, but every arch seems pretty different in what they have for
| > their debug section.
|
| As I said, it's been worked on:)
Yes, I'll make a new version soon....
--
~Randy
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH][RFC] Spinlock-timeout
2004-06-06 22:23 ` Benjamin Herrenschmidt
@ 2004-06-11 14:05 ` Jake Moilanen
2004-06-11 15:49 ` Benjamin Herrenschmidt
2004-06-11 14:08 ` Jake Moilanen
1 sibling, 1 reply; 16+ messages in thread
From: Jake Moilanen @ 2004-06-11 14:05 UTC (permalink / raw)
To: Linux Kernel list
Cc: Benjamin Herrenschmidt, Paul Mackerras, Jan-Benedict Glaw
[-- Attachment #1: Type: text/plain, Size: 1026 bytes --]
On Sun, 2004-06-06 at 17:23, Benjamin Herrenschmidt wrote:
> On Sat, 2004-06-05 at 15:31, Jake Moilanen wrote:
> > 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.
> >
> > It is also helpful to find locks that are held too long.
> >
> > Please send comments.
>
> It would be better to use the timebase on CPUs that have one, no ? Or
> you'll miss cases where either irqs are disabled or you are on a code
> path issued by the timer interrupt, and thus jiffies isn't updated
Here's a revision to the patch that uses a HAVE_ARCH_GET_TB to allow
archs use their timebases if they have one, and if they don't, it uses
jiffies. time_after_eq() is used to do the jiffy checking.
I also left all of the arch/*/Kconfig changes in until a debug Kconfig
is done. I pretty much added in the spinlock timeout on all archs that
have CONFIG_DEBUG_SPINLOCK. If I missed your arch, I'm sorry.
Thanks,
Jake
[-- Attachment #2: spinlock-timeout-2.6-v2.patch --]
[-- Type: text/x-patch, Size: 22734 bytes --]
===== arch/alpha/Kconfig 1.37 vs edited =====
*** /home/moilanen/sbx/linux-2.6/BitKeeper/tmp/bk_Kconfig-1.37_BUiPrR 2004-05-18 15:22:12 +00:00
--- arch/alpha/Kconfig 2004-06-09 16:38:19 +00:00
*************** config DEBUG_SPINLOCK
*** 664,669 ****
--- 664,683 ----
best used in conjunction with the NMI watchdog so that spinlock
deadlocks are also debuggable.
+ config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+ config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config DEBUG_RWLOCK
bool "Read-write spinlock debugging"
depends on DEBUG_KERNEL
===== arch/alpha/defconfig 1.25 vs edited =====
*** /home/moilanen/sbx/linux-2.6/BitKeeper/tmp/bk_defconfig-1.25_bRXYlh 2004-03-23 18:24:34 +00:00
--- arch/alpha/defconfig 2004-06-09 16:38:20 +00:00
*************** CONFIG_MATHEMU=y
*** 868,873 ****
--- 868,874 ----
# CONFIG_DEBUG_SLAB is not set
CONFIG_MAGIC_SYSRQ=y
# CONFIG_DEBUG_SPINLOCK is not set
+ # CONFIG_SPINLOCK_TIMEOUT is not set
# CONFIG_DEBUG_RWLOCK is not set
# CONFIG_DEBUG_SEMAPHORE is not set
CONFIG_DEBUG_INFO=y
===== arch/arm/Kconfig 1.62 vs edited =====
*** /home/moilanen/sbx/linux-2.6/BitKeeper/tmp/bk_Kconfig-1.62_2gdtiH 2004-05-24 11:14:29 +00:00
--- arch/arm/Kconfig 2004-06-09 16:38:20 +00:00
*************** config DEBUG_SPINLOCK
*** 728,733 ****
--- 728,747 ----
best used in conjunction with the NMI watchdog so that spinlock
deadlocks are also debuggable.
+ config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+ config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config DEBUG_WAITQ
bool "Wait queue debugging"
depends on DEBUG_KERNEL
===== arch/arm/defconfig 1.5 vs edited =====
*** /home/moilanen/sbx/linux-2.6/BitKeeper/tmp/bk_defconfig-1.5_HTP3h7 2003-08-02 19:59:32 +00:00
--- arch/arm/defconfig 2004-06-09 16:38:20 +00:00
*************** CONFIG_FRAME_POINTER=y
*** 507,511 ****
--- 507,512 ----
CONFIG_DEBUG_ERRORS=y
CONFIG_DEBUG_USER=y
# CONFIG_DEBUG_INFO is not set
+ # CONFIG_SPINLOCK_TIMEOUT is not set
CONFIG_MAGIC_SYSRQ=y
CONFIG_DEBUG_LL=y
===== arch/arm26/Kconfig 1.12 vs edited =====
*** /home/moilanen/sbx/linux-2.6/BitKeeper/tmp/bk_Kconfig-1.12_fHaOkx 2004-03-13 11:47:59 +00:00
--- arch/arm26/Kconfig 2004-06-09 16:38:20 +00:00
*************** config DEBUG_SPINLOCK
*** 284,289 ****
--- 284,303 ----
best used in conjunction with the NMI watchdog so that spinlock
deadlocks are also debuggable.
+ config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+ config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config DEBUG_WAITQ
bool "Wait queue debugging"
depends on DEBUG_KERNEL
===== arch/arm26/defconfig 1.3 vs edited =====
*** /home/moilanen/sbx/linux-2.6/BitKeeper/tmp/bk_defconfig-1.3_BiEksX 2004-03-25 17:57:00 +00:00
--- arch/arm26/defconfig 2004-06-09 16:38:21 +00:00
*************** CONFIG_DEBUG_KERNEL=y
*** 344,349 ****
--- 344,350 ----
CONFIG_DEBUG_SLAB=y
CONFIG_MAGIC_SYSRQ=y
CONFIG_DEBUG_SPINLOCK=y
+ # CONFIG_SPINLOCK_TIMEOUT is not set
CONFIG_DEBUG_WAITQ=y
CONFIG_DEBUG_BUGVERBOSE=y
CONFIG_DEBUG_ERRORS=y
===== arch/i386/Kconfig 1.122 vs edited =====
*** /home/moilanen/sbx/linux-2.6/BitKeeper/tmp/bk_Kconfig-1.122_GpRUBn 2004-06-03 08:46:43 +00:00
--- arch/i386/Kconfig 2004-06-09 16:38:21 +00:00
*************** config DEBUG_SPINLOCK
*** 1247,1252 ****
--- 1247,1266 ----
best used in conjunction with the NMI watchdog so that spinlock
deadlocks are also debuggable.
+ config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+ config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config DEBUG_PAGEALLOC
bool "Page alloc debugging"
depends on DEBUG_KERNEL
===== arch/i386/defconfig 1.112 vs edited =====
*** /home/moilanen/sbx/linux-2.6/BitKeeper/tmp/bk_defconfig-1.112_lLqTPN 2004-06-07 13:29:17 +00:00
--- arch/i386/defconfig 2004-06-09 16:38:21 +00:00
*************** CONFIG_OPROFILE=y
*** 1220,1225 ****
--- 1220,1226 ----
# CONFIG_DEBUG_KERNEL is not set
CONFIG_EARLY_PRINTK=y
CONFIG_DEBUG_SPINLOCK_SLEEP=y
+ # CONFIG_SPINLOCK_TIMEOUT is not set
# CONFIG_FRAME_POINTER is not set
CONFIG_4KSTACKS=y
CONFIG_X86_FIND_SMP_CONFIG=y
===== arch/ia64/Kconfig 1.74 vs edited =====
*** /home/moilanen/sbx/linux-2.6/BitKeeper/tmp/bk_Kconfig-1.74_cbpL7d 2004-05-24 23:05:32 +00:00
--- arch/ia64/Kconfig 2004-06-09 16:38:21 +00:00
*************** config DEBUG_SPINLOCK_SLEEP
*** 468,473 ****
--- 468,487 ----
If you say Y here, various routines which may sleep will become very
noisy if they are called with a spinlock held.
+ config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+ config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config IA64_DEBUG_CMPXCHG
bool "Turn on compare-and-exchange bug checking (slow!)"
depends on DEBUG_KERNEL
===== arch/ia64/defconfig 1.30 vs edited =====
*** /home/moilanen/sbx/linux-2.6/BitKeeper/tmp/bk_defconfig-1.30_JLmbuE 2004-05-21 21:03:19 +00:00
--- arch/ia64/defconfig 2004-06-09 16:38:22 +00:00
*************** CONFIG_MAGIC_SYSRQ=y
*** 1089,1094 ****
--- 1089,1095 ----
# CONFIG_DEBUG_SLAB is not set
# CONFIG_DEBUG_SPINLOCK is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+ # CONFIG_SPINLOCK_TIMEOUT is not set
# CONFIG_IA64_DEBUG_CMPXCHG is not set
# CONFIG_IA64_DEBUG_IRQ is not set
CONFIG_DEBUG_INFO=y
===== arch/mips/Kconfig 1.26 vs edited =====
*** /home/moilanen/sbx/linux-2.6/BitKeeper/tmp/bk_Kconfig-1.26_TFCFU4 2004-05-10 11:25:30 +00:00
--- arch/mips/Kconfig 2004-06-09 16:38:22 +00:00
*************** config DEBUG_SPINLOCK_SLEEP
*** 1360,1365 ****
--- 1360,1379 ----
If you say Y here, various routines which may sleep will become very
noisy if they are called with a spinlock held.
+ config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+ config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config RTC_DS1742
bool "DS1742 BRAM/RTC support"
depends on TOSHIBA_JMR3927 || TOSHIBA_RBTX4927
===== arch/mips/defconfig 1.11 vs edited =====
*** /home/moilanen/sbx/linux-2.6/BitKeeper/tmp/bk_defconfig-1.11_dfmkrv 2004-05-10 11:25:30 +00:00
--- arch/mips/defconfig 2004-06-09 16:38:22 +00:00
*************** CONFIG_CPU_HAS_LLDSCD=y
*** 125,130 ****
--- 125,131 ----
CONFIG_CPU_HAS_SYNC=y
# CONFIG_PREEMPT is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+ # CONFIG_SPINLOCK_TIMEOUT is not set
#
# Bus options (PCI, PCMCIA, EISA, ISA, TC)
===== arch/ppc/Kconfig 1.64 vs edited =====
*** /home/moilanen/sbx/linux-2.6/BitKeeper/tmp/bk_Kconfig-1.64_vJsX1V 2004-05-31 12:28:12 +00:00
--- arch/ppc/Kconfig 2004-06-09 16:38:22 +00:00
*************** config DEBUG_SPINLOCK_SLEEP
*** 1199,1204 ****
--- 1199,1218 ----
If you say Y here, various routines which may sleep will become very
noisy if they are called with a spinlock held.
+ config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+ config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config KGDB
bool "Include kgdb kernel debugger"
depends on DEBUG_KERNEL
===== arch/ppc/defconfig 1.28 vs edited =====
*** /home/moilanen/sbx/linux-2.6/BitKeeper/tmp/bk_defconfig-1.28_40DsJm 2004-05-18 14:48:09 +00:00
--- arch/ppc/defconfig 2004-06-09 16:38:23 +00:00
*************** CONFIG_ZLIB_DEFLATE=y
*** 1318,1323 ****
--- 1318,1324 ----
# Kernel hacking
#
# CONFIG_DEBUG_KERNEL is not set
+ # CONFIG_SPINLOCK_TIMEOUT is not set
CONFIG_BOOTX_TEXT=y
#
===== arch/ppc64/Kconfig 1.56 vs edited =====
*** /home/moilanen/sbx/linux-2.6/BitKeeper/tmp/bk_Kconfig-1.56_5CbvuN 2004-05-25 07:31:51 +00:00
--- arch/ppc64/Kconfig 2004-06-09 16:38:23 +00:00
*************** config MAGIC_SYSRQ
*** 387,392 ****
--- 387,406 ----
keys are documented in <file:Documentation/sysrq.txt>. Don't say Y
unless you really know what this hack does.
+ config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+ config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config DEBUGGER
bool "Enable debugger hooks"
depends on DEBUG_KERNEL
===== arch/ppc64/defconfig 1.37 vs edited =====
*** /home/moilanen/sbx/linux-2.6/BitKeeper/tmp/bk_defconfig-1.37_O87Bje 2004-03-31 22:27:07 +00:00
--- arch/ppc64/defconfig 2004-06-09 16:38:23 +00:00
*************** CONFIG_DEBUG_STACKOVERFLOW=y
*** 1054,1059 ****
--- 1054,1060 ----
CONFIG_DEBUG_STACK_USAGE=y
# CONFIG_DEBUG_SLAB is not set
CONFIG_MAGIC_SYSRQ=y
+ # CONFIG_SPINLOCK_TIMEOUT is not set
CONFIG_DEBUGGER=y
CONFIG_XMON=y
CONFIG_XMON_DEFAULT=y
===== arch/s390/Kconfig 1.27 vs edited =====
*** /home/moilanen/sbx/linux-2.6/BitKeeper/tmp/bk_Kconfig-1.27_xMQxUo 2004-04-29 09:41:09 +00:00
--- arch/s390/Kconfig 2004-06-09 16:38:25 +00:00
*************** config DEBUG_SPINLOCK_SLEEP
*** 423,428 ****
--- 423,442 ----
If you say Y here, various routines which may sleep will become very
noisy if they are called with a spinlock held.
+ config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+ config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
endmenu
source "security/Kconfig"
===== arch/s390/defconfig 1.45 vs edited =====
*** /home/moilanen/sbx/linux-2.6/BitKeeper/tmp/bk_defconfig-1.45_TiY8TP 2004-06-03 08:46:41 +00:00
--- arch/s390/defconfig 2004-06-09 16:38:25 +00:00
*************** CONFIG_MAGIC_SYSRQ=y
*** 474,479 ****
--- 474,480 ----
# CONFIG_DEBUG_SLAB is not set
# CONFIG_DEBUG_INFO is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+ # CONFIG_SPINLOCK_TIMEOUT is not set
#
# Security options
===== arch/sh/Kconfig 1.29 vs edited =====
*** /home/moilanen/sbx/linux-2.6/BitKeeper/tmp/bk_Kconfig-1.29_YVtFVg 2004-03-23 10:05:27 +00:00
--- arch/sh/Kconfig 2004-06-09 16:38:25 +00:00
*************** config DEBUG_SPINLOCK
*** 675,680 ****
--- 675,694 ----
best used in conjunction with the NMI watchdog so that spinlock
deadlocks are also debuggable.
+ config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+ config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config SH_STANDARD_BIOS
bool "Use LinuxSH standard BIOS"
help
===== arch/sh/defconfig 1.9 vs edited =====
*** /home/moilanen/sbx/linux-2.6/BitKeeper/tmp/bk_defconfig-1.9_Rt2WZH 2004-03-23 18:18:46 +00:00
--- arch/sh/defconfig 2004-06-09 16:38:25 +00:00
*************** CONFIG_MSDOS_PARTITION=y
*** 351,356 ****
--- 351,357 ----
#
# CONFIG_MAGIC_SYSRQ is not set
# CONFIG_DEBUG_SPINLOCK is not set
+ # CONFIG_SPINLOCK_TIMEOUT is not set
CONFIG_SH_STANDARD_BIOS=y
CONFIG_SH_EARLY_PRINTK=y
# CONFIG_KGDB is not set
===== arch/sparc/Kconfig 1.28 vs edited =====
*** /home/moilanen/sbx/linux-2.6/BitKeeper/tmp/bk_Kconfig-1.28_iel758 2004-03-19 06:04:54 +00:00
--- arch/sparc/Kconfig 2004-06-09 16:38:26 +00:00
*************** config DEBUG_SPINLOCK_SLEEP
*** 440,445 ****
--- 440,459 ----
If you say Y here, various routines which may sleep will become very
noisy if they are called with a spinlock held.
+ config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+ config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config DEBUG_BUGVERBOSE
bool "Verbose BUG() reporting (adds 70K)"
depends on DEBUG_KERNEL
===== arch/sparc/defconfig 1.19 vs edited =====
*** /home/moilanen/sbx/linux-2.6/BitKeeper/tmp/bk_defconfig-1.19_L7AnfA 2004-03-31 06:40:57 +00:00
--- arch/sparc/defconfig 2004-06-09 16:38:26 +00:00
*************** CONFIG_DEBUG_KERNEL=y
*** 611,616 ****
--- 611,617 ----
# CONFIG_DEBUG_SLAB is not set
CONFIG_MAGIC_SYSRQ=y
# CONFIG_DEBUG_SPINLOCK is not set
+ # CONFIG_SPINLOCK_TIMEOUT is not set
# CONFIG_DEBUG_HIGHMEM is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
# CONFIG_DEBUG_BUGVERBOSE is not set
===== arch/sparc64/Kconfig 1.52 vs edited =====
*** /home/moilanen/sbx/linux-2.6/BitKeeper/tmp/bk_Kconfig-1.52_VPYCq1 2004-05-24 17:09:14 +00:00
--- arch/sparc64/Kconfig 2004-06-09 16:38:26 +00:00
*************** config DEBUG_SPINLOCK_SLEEP
*** 658,663 ****
--- 658,677 ----
If you say Y here, various routines which may sleep will become very
noisy if they are called with a spinlock held.
+ config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+ config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config DEBUG_BUGVERBOSE
bool "Verbose BUG() reporting (adds 70K)"
depends on DEBUG_KERNEL
===== arch/sparc64/defconfig 1.128 vs edited =====
*** /home/moilanen/sbx/linux-2.6/BitKeeper/tmp/bk_defconfig-1.128_DpO8Es 2004-06-03 21:54:05 +00:00
--- arch/sparc64/defconfig 2004-06-09 16:38:26 +00:00
*************** CONFIG_DEBUG_KERNEL=y
*** 1727,1732 ****
--- 1727,1733 ----
CONFIG_MAGIC_SYSRQ=y
# CONFIG_DEBUG_SPINLOCK is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+ # CONFIG_SPINLOCK_TIMEOUT is not set
# CONFIG_DEBUG_BUGVERBOSE is not set
# CONFIG_DEBUG_DCFLUSH is not set
# CONFIG_DEBUG_INFO is not set
===== arch/um/Kconfig 1.14 vs edited =====
*** /home/moilanen/sbx/linux-2.6/BitKeeper/tmp/bk_Kconfig-1.14_MUJWWT 2004-04-12 17:53:57 +00:00
--- arch/um/Kconfig 2004-06-09 16:38:27 +00:00
*************** config DEBUG_SLAB
*** 222,227 ****
--- 222,241 ----
config DEBUG_SPINLOCK
bool "Debug spinlocks usage"
+ config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+ config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config DEBUG_INFO
bool "Enable kernel debugging symbols"
help
===== arch/um/defconfig 1.8 vs edited =====
*** /home/moilanen/sbx/linux-2.6/BitKeeper/tmp/bk_defconfig-1.8_hSaMgl 2003-06-20 20:19:15 +00:00
--- arch/um/defconfig 2004-06-09 16:38:27 +00:00
*************** CONFIG_MTD_BLKMTD=m
*** 399,404 ****
--- 399,405 ----
#
# CONFIG_DEBUG_SLAB is not set
# CONFIG_DEBUG_SPINLOCK is not set
+ # CONFIG_SPINLOCK_TIMEOUT is not set
CONFIG_DEBUG_INFO=y
CONFIG_FRAME_POINTER=y
CONFIG_PT_PROXY=y
===== arch/x86_64/Kconfig 1.51 vs edited =====
*** /home/moilanen/sbx/linux-2.6/BitKeeper/tmp/bk_Kconfig-1.51_34XYCM 2004-05-15 13:32:23 +00:00
--- arch/x86_64/Kconfig 2004-06-09 16:38:27 +00:00
*************** config DEBUG_SPINLOCK
*** 436,441 ****
--- 436,455 ----
best used in conjunction with the NMI watchdog so that spinlock
deadlocks are also debuggable.
+ config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+ config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
# !SMP for now because the context switch early causes GPF in segment reloading
# and the GS base checking does the wrong thing then, causing a hang.
config CHECKING
===== arch/x86_64/defconfig 1.39 vs edited =====
*** /home/moilanen/sbx/linux-2.6/BitKeeper/tmp/bk_defconfig-1.39_kfNq3d 2004-06-05 07:25:22 +00:00
--- arch/x86_64/defconfig 2004-06-09 16:38:27 +00:00
*************** CONFIG_DEBUG_KERNEL=y
*** 910,915 ****
--- 910,916 ----
# CONFIG_DEBUG_SLAB is not set
CONFIG_MAGIC_SYSRQ=y
# CONFIG_DEBUG_SPINLOCK is not set
+ # CONFIG_SPINLOCK_TIMEOUT is not set
# CONFIG_INIT_DEBUG is not set
# CONFIG_DEBUG_INFO is not set
# CONFIG_FRAME_POINTER is not set
===== include/linux/jiffies.h 1.9 vs edited =====
*** /home/moilanen/sbx/linux-2.6/BitKeeper/tmp/bk_jiffies.h-1.9_ezvDfY 2003-12-29 21:38:06 +00:00
--- include/linux/jiffies.h 2004-06-09 16:38:29 +00:00
***************
*** 3,10 ****
#include <linux/kernel.h>
#include <linux/types.h>
- #include <linux/spinlock.h>
- #include <linux/seqlock.h>
#include <asm/system.h>
#include <asm/param.h> /* for HZ */
--- 3,8 ----
===== include/linux/spinlock.h 1.28 vs edited =====
*** /home/moilanen/sbx/linux-2.6/BitKeeper/tmp/bk_spinlock.h-1.28_TZkdjr 2004-05-10 11:25:44 +00:00
--- include/linux/spinlock.h 2004-06-10 14:17:37 +00:00
***************
*** 38,43 ****
--- 38,69 ----
#ifdef CONFIG_SMP
#include <asm/spinlock.h>
+ #if defined(CONFIG_SPINLOCK_TIMEOUT)
+
+ #include <linux/jiffies.h>
+
+ #define SPINLOCK_TIMEOUT CONFIG_SPINLOCK_TIMEOUT_TIME
+
+ /*
+ * There are paths where jiffies won't be updated and
+ * SPINLOCK_TIMEOUT will not work. To ensure they work, it is best
+ * to have every arch implement a get_tb() that can pull from the
+ * hardware for the time update.
+ */
+ #ifdef HAVE_ARCH_GET_TB
+ #include <asm/time.h>
+ #define get_spinlock_timeout() (get_tb() + (tb_ticks_per_jiffy * SPINLOCK_TIMEOUT * HZ))
+ #define check_spinlock_timeout(timeout) (get_tb() >= timeout ? 1 : 0)
+
+ #else /* HAVE_ARCH_GET_TB */
+
+ #define get_spinlock_timeout() (jiffies + (SPINLOCK_TIMEOUT * HZ))
+ #define check_spinlock_timeout(timeout) (time_after_eq(jiffies, timeout))
+ #endif /* HAVE_ARCH_GET_TB */
+
+ #endif /* CONFIG_SPINLOCK_TIMEOUT */
+
+
#else
#define _raw_spin_lock_flags(lock, flags) _raw_spin_lock(lock)
*************** do { \
*** 218,228 ****
--- 244,270 ----
} while (0)
#else
+ #if defined(CONFIG_SPINLOCK_TIMEOUT)
+
+ static inline void spin_lock(spinlock_t * lock) {
+ unsigned long timeout = get_spinlock_timeout();
+
+ preempt_disable();
+ do {
+ if (check_spinlock_timeout(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 { \
===== kernel/sched.c 1.309 vs edited =====
*** /home/moilanen/sbx/linux-2.6/BitKeeper/tmp/bk_sched.c-1.309_8DCjsU 2004-06-06 00:00:00 +00:00
--- kernel/sched.c 2004-06-10 15:13:16 +00:00
*************** EXPORT_SYMBOL(__might_sleep);
*** 3998,4011 ****
*/
void __sched __preempt_spin_lock(spinlock_t *lock)
{
if (preempt_count() > 1) {
_raw_spin_lock(lock);
return;
}
do {
preempt_enable();
! while (spin_is_locked(lock))
cpu_relax();
preempt_disable();
} while (!_raw_spin_trylock(lock));
}
--- 3998,4020 ----
*/
void __sched __preempt_spin_lock(spinlock_t *lock)
{
+ #if defined(CONFIG_SPINLOCK_TIMEOUT)
+ unsigned long timeout = get_spinlock_timeout();
+ #endif
+
if (preempt_count() > 1) {
_raw_spin_lock(lock);
return;
}
do {
preempt_enable();
! while (spin_is_locked(lock)) {
! #if defined(CONFIG_SPINLOCK_TIMEOUT)
! if (check_spinlock_timeout(timeout))
! BUG();
! #endif
cpu_relax();
+ }
preempt_disable();
} while (!_raw_spin_trylock(lock));
}
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH][RFC] Spinlock-timeout
2004-06-06 22:23 ` Benjamin Herrenschmidt
2004-06-11 14:05 ` Jake Moilanen
@ 2004-06-11 14:08 ` Jake Moilanen
1 sibling, 0 replies; 16+ messages in thread
From: Jake Moilanen @ 2004-06-11 14:08 UTC (permalink / raw)
To: Linux Kernel list
Cc: Benjamin Herrenschmidt, Paul Mackerras, Jan-Benedict Glaw
[-- Attachment #1: Type: text/plain, Size: 665 bytes --]
On Sun, 2004-06-06 at 17:23, Benjamin Herrenschmidt wrote:
> On Sat, 2004-06-05 at 15:31, Jake Moilanen wrote:
> > 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.
> >
> > It is also helpful to find locks that are held too long.
> >
> > Please send comments.
>
> It would be better to use the timebase on CPUs that have one, no ? Or
> you'll miss cases where either irqs are disabled or you are on a code
> path issued by the timer interrupt, and thus jiffies isn't updated
Here is the ppc64 add-on for the HAVE_ARCH_GET_TB.
Thanks,
Jake
[-- Attachment #2: spinlock-timeout-2.6-v2-ppc64.patch --]
[-- Type: text/x-patch, Size: 2750 bytes --]
===== arch/ppc64/kernel/chrp_setup.c 1.47 vs edited =====
*** /home/moilanen/sbx/linux-2.6/BitKeeper/tmp/bk_chrp_setup.c-1.47_T8bKaF 2004-04-27 05:07:31 +00:00
--- arch/ppc64/kernel/chrp_setup.c 2004-06-09 16:38:23 +00:00
*************** chrp_progress(char *s, unsigned short he
*** 405,414 ****
extern void setup_default_decr(void);
- /* Some sane defaults: 125 MHz timebase, 1GHz processor */
- #define DEFAULT_TB_FREQ 125000000UL
- #define DEFAULT_PROC_FREQ (DEFAULT_TB_FREQ * 8)
-
void __init pSeries_calibrate_decr(void)
{
struct device_node *cpu;
--- 405,410 ----
===== arch/ppc64/kernel/time.c 1.30 vs edited =====
*** /home/moilanen/sbx/linux-2.6/BitKeeper/tmp/bk_time.c-1.30_TupeZw 2004-05-31 17:41:03 +00:00
--- arch/ppc64/kernel/time.c 2004-06-09 16:38:24 +00:00
*************** static unsigned long first_settimeofday
*** 81,87 ****
#define XSEC_PER_SEC (1024*1024)
! unsigned long tb_ticks_per_jiffy;
unsigned long tb_ticks_per_usec;
unsigned long tb_ticks_per_sec;
unsigned long next_xtime_sync_tb;
--- 81,87 ----
#define XSEC_PER_SEC (1024*1024)
! unsigned long tb_ticks_per_jiffy = DEFAULT_TB_FREQ / HZ;
unsigned long tb_ticks_per_usec;
unsigned long tb_ticks_per_sec;
unsigned long next_xtime_sync_tb;
===== include/asm-ppc64/eeh.h 1.10 vs edited =====
*** /home/moilanen/sbx/linux-2.6/BitKeeper/tmp/bk_eeh.h-1.10_XhZlsA 2004-06-01 09:27:13 +00:00
--- include/asm-ppc64/eeh.h 2004-06-09 16:38:28 +00:00
***************
*** 24,29 ****
--- 24,30 ----
#include <linux/init.h>
struct pci_dev;
+ struct device_node;
/* I/O addresses are converted to EEH "tokens" such that a driver will cause
* a bad page fault if the address is used directly (i.e. these addresses are
===== include/asm-ppc64/processor.h 1.45 vs edited =====
*** /home/moilanen/sbx/linux-2.6/BitKeeper/tmp/bk_processor.h-1.45_nCcpY2 2004-06-01 09:27:47 +00:00
--- include/asm-ppc64/processor.h 2004-06-09 16:38:28 +00:00
*************** GLUE(.,name):
*** 440,445 ****
--- 440,448 ----
#endif /* __ASSEMBLY__ */
+ /* Some sane defaults: 125 MHz timebase, 1GHz processor */
+ #define DEFAULT_TB_FREQ 125000000UL
+ #define DEFAULT_PROC_FREQ (DEFAULT_TB_FREQ * 8)
/* Macros for setting and retrieving special purpose registers */
===== include/asm-ppc64/time.h 1.7 vs edited =====
*** /home/moilanen/sbx/linux-2.6/BitKeeper/tmp/bk_time.h-1.7_ZyJHwv 2002-06-10 02:37:26 +00:00
--- include/asm-ppc64/time.h 2004-06-09 16:38:28 +00:00
***************
*** 20,26 ****
--- 20,30 ----
#include <asm/processor.h>
#include <asm/paca.h>
+ #ifdef CONFIG_PPC_ISERIES
#include <asm/iSeries/HvCall.h>
+ #endif
+
+ #define HAVE_ARCH_GET_TB
/* time.c */
extern unsigned long tb_ticks_per_jiffy;
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH][RFC] Spinlock-timeout
2004-06-11 14:05 ` Jake Moilanen
@ 2004-06-11 15:49 ` Benjamin Herrenschmidt
2004-06-11 21:19 ` moilanen
2004-06-11 21:22 ` moilanen
0 siblings, 2 replies; 16+ messages in thread
From: Benjamin Herrenschmidt @ 2004-06-11 15:49 UTC (permalink / raw)
To: Jake Moilanen; +Cc: Linux Kernel list, Paul Mackerras, Jan-Benedict Glaw
> Here's a revision to the patch that uses a HAVE_ARCH_GET_TB to allow
> archs use their timebases if they have one, and if they don't, it uses
> jiffies. time_after_eq() is used to do the jiffy checking.
>
> I also left all of the arch/*/Kconfig changes in until a debug Kconfig
> is done. I pretty much added in the spinlock timeout on all archs that
> have CONFIG_DEBUG_SPINLOCK. If I missed your arch, I'm sorry.
Nah, that's not how the abstraction should be done. Much simpler in
fact. Just do something like this in the generic code:
#ifndef ARCH_HAS_SPINLOCK_TIMEOUT
#define get_spinlock_timeout() (jiffies + (SPINLOCK_TIMEOUT * HZ))
#define check_spinlock_timeout(timeout) (time_after_eq(jiffies, timeout))
#endif
That's all. Then, any arch who has it's own implementation of these 2
function will #define ARCH_HAS_SPINLOCK_TIMEOUT and implement them the
way it wants. We shouldn't let anything like get_tb() slip into a common
file, it's totally PPC specific. Other archs may have different counters
they can use to impement the same thing. That part should be entirely
self contained in asm-xxx
Ben.
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH][RFC] Spinlock-timeout
2004-06-11 15:49 ` Benjamin Herrenschmidt
@ 2004-06-11 21:19 ` moilanen
2004-06-11 22:08 ` Benjamin Herrenschmidt
2004-06-11 21:22 ` moilanen
1 sibling, 1 reply; 16+ messages in thread
From: moilanen @ 2004-06-11 21:19 UTC (permalink / raw)
To: Benjamin Herrenschmidt
Cc: Andrew Morton, Linus Torvalds, Linux Kernel list, Paul Mackerras,
Jan-Benedict Glaw
> > Here's a revision to the patch that uses a HAVE_ARCH_GET_TB to allow
> > archs use their timebases if they have one, and if they don't, it uses
> > jiffies. time_after_eq() is used to do the jiffy checking.
> >
> > I also left all of the arch/*/Kconfig changes in until a debug Kconfig
> > is done. I pretty much added in the spinlock timeout on all archs that
> > have CONFIG_DEBUG_SPINLOCK. If I missed your arch, I'm sorry.
>
> Nah, that's not how the abstraction should be done. Much simpler in
> fact. Just do something like this in the generic code:
>
> #ifndef ARCH_HAS_SPINLOCK_TIMEOUT
> #define get_spinlock_timeout() (jiffies + (SPINLOCK_TIMEOUT * HZ))
> #define check_spinlock_timeout(timeout) (time_after_eq(jiffies, timeout))
> #endif
>
> That's all. Then, any arch who has it's own implementation of these 2
> function will #define ARCH_HAS_SPINLOCK_TIMEOUT and implement them the
> way it wants. We shouldn't let anything like get_tb() slip into a common
> file, it's totally PPC specific. Other archs may have different counters
> they can use to impement the same thing. That part should be entirely
> self contained in asm-xxx
That's much better. Here's hopefully a version that could be merged.
Thanks,
Jake
===== arch/alpha/Kconfig 1.37 vs edited =====
*** /tmp/Kconfig-1.37-23470 Tue May 18 10:22:12 2004
--- arch/alpha/Kconfig Fri Jun 11 10:56:36 2004
*************** config DEBUG_SPINLOCK
*** 664,669 ****
--- 664,683 ----
best used in conjunction with the NMI watchdog so that spinlock
deadlocks are also debuggable.
+ config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+ config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config DEBUG_RWLOCK
bool "Read-write spinlock debugging"
depends on DEBUG_KERNEL
===== arch/alpha/defconfig 1.25 vs edited =====
*** /tmp/defconfig-1.25-23470 Tue Mar 23 12:24:34 2004
--- arch/alpha/defconfig Fri Jun 11 10:56:36 2004
*************** CONFIG_MATHEMU=y
*** 868,873 ****
--- 868,874 ----
# CONFIG_DEBUG_SLAB is not set
CONFIG_MAGIC_SYSRQ=y
# CONFIG_DEBUG_SPINLOCK is not set
+ # CONFIG_SPINLOCK_TIMEOUT is not set
# CONFIG_DEBUG_RWLOCK is not set
# CONFIG_DEBUG_SEMAPHORE is not set
CONFIG_DEBUG_INFO=y
===== arch/arm/Kconfig 1.62 vs edited =====
*** /tmp/Kconfig-1.62-23470 Mon May 24 06:14:29 2004
--- arch/arm/Kconfig Fri Jun 11 10:56:37 2004
*************** config DEBUG_SPINLOCK
*** 728,733 ****
--- 728,747 ----
best used in conjunction with the NMI watchdog so that spinlock
deadlocks are also debuggable.
+ config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+ config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config DEBUG_WAITQ
bool "Wait queue debugging"
depends on DEBUG_KERNEL
===== arch/arm/defconfig 1.5 vs edited =====
*** /tmp/defconfig-1.5-23470 Sat Aug 2 14:59:32 2003
--- arch/arm/defconfig Fri Jun 11 10:56:37 2004
*************** CONFIG_FRAME_POINTER=y
*** 507,511 ****
--- 507,512 ----
CONFIG_DEBUG_ERRORS=y
CONFIG_DEBUG_USER=y
# CONFIG_DEBUG_INFO is not set
+ # CONFIG_SPINLOCK_TIMEOUT is not set
CONFIG_MAGIC_SYSRQ=y
CONFIG_DEBUG_LL=y
===== arch/arm26/Kconfig 1.12 vs edited =====
*** /tmp/Kconfig-1.12-23470 Sat Mar 13 05:47:59 2004
--- arch/arm26/Kconfig Fri Jun 11 10:56:37 2004
*************** config DEBUG_SPINLOCK
*** 284,289 ****
--- 284,303 ----
best used in conjunction with the NMI watchdog so that spinlock
deadlocks are also debuggable.
+ config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+ config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config DEBUG_WAITQ
bool "Wait queue debugging"
depends on DEBUG_KERNEL
===== arch/arm26/defconfig 1.3 vs edited =====
*** /tmp/defconfig-1.3-23470 Thu Mar 25 11:57:00 2004
--- arch/arm26/defconfig Fri Jun 11 10:56:37 2004
*************** CONFIG_DEBUG_KERNEL=y
*** 344,349 ****
--- 344,350 ----
CONFIG_DEBUG_SLAB=y
CONFIG_MAGIC_SYSRQ=y
CONFIG_DEBUG_SPINLOCK=y
+ # CONFIG_SPINLOCK_TIMEOUT is not set
CONFIG_DEBUG_WAITQ=y
CONFIG_DEBUG_BUGVERBOSE=y
CONFIG_DEBUG_ERRORS=y
===== arch/i386/Kconfig 1.122 vs edited =====
*** /tmp/Kconfig-1.122-23470 Thu Jun 3 03:46:43 2004
--- arch/i386/Kconfig Fri Jun 11 10:56:38 2004
*************** config DEBUG_SPINLOCK
*** 1247,1252 ****
--- 1247,1266 ----
best used in conjunction with the NMI watchdog so that spinlock
deadlocks are also debuggable.
+ config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+ config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config DEBUG_PAGEALLOC
bool "Page alloc debugging"
depends on DEBUG_KERNEL
===== arch/i386/defconfig 1.112 vs edited =====
*** /tmp/defconfig-1.112-23470 Mon Jun 7 08:29:17 2004
--- arch/i386/defconfig Fri Jun 11 10:56:38 2004
*************** CONFIG_OPROFILE=y
*** 1220,1225 ****
--- 1220,1226 ----
# CONFIG_DEBUG_KERNEL is not set
CONFIG_EARLY_PRINTK=y
CONFIG_DEBUG_SPINLOCK_SLEEP=y
+ # CONFIG_SPINLOCK_TIMEOUT is not set
# CONFIG_FRAME_POINTER is not set
CONFIG_4KSTACKS=y
CONFIG_X86_FIND_SMP_CONFIG=y
===== arch/ia64/Kconfig 1.74 vs edited =====
*** /tmp/Kconfig-1.74-23470 Mon May 24 18:05:32 2004
--- arch/ia64/Kconfig Fri Jun 11 10:56:39 2004
*************** config DEBUG_SPINLOCK_SLEEP
*** 468,473 ****
--- 468,487 ----
If you say Y here, various routines which may sleep will become very
noisy if they are called with a spinlock held.
+ config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+ config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config IA64_DEBUG_CMPXCHG
bool "Turn on compare-and-exchange bug checking (slow!)"
depends on DEBUG_KERNEL
===== arch/ia64/defconfig 1.30 vs edited =====
*** /tmp/defconfig-1.30-23470 Fri May 21 16:03:19 2004
--- arch/ia64/defconfig Fri Jun 11 10:56:39 2004
*************** CONFIG_MAGIC_SYSRQ=y
*** 1089,1094 ****
--- 1089,1095 ----
# CONFIG_DEBUG_SLAB is not set
# CONFIG_DEBUG_SPINLOCK is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+ # CONFIG_SPINLOCK_TIMEOUT is not set
# CONFIG_IA64_DEBUG_CMPXCHG is not set
# CONFIG_IA64_DEBUG_IRQ is not set
CONFIG_DEBUG_INFO=y
===== arch/mips/Kconfig 1.26 vs edited =====
*** /tmp/Kconfig-1.26-23470 Mon May 10 06:25:30 2004
--- arch/mips/Kconfig Fri Jun 11 10:56:39 2004
*************** config DEBUG_SPINLOCK_SLEEP
*** 1360,1365 ****
--- 1360,1379 ----
If you say Y here, various routines which may sleep will become very
noisy if they are called with a spinlock held.
+ config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+ config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config RTC_DS1742
bool "DS1742 BRAM/RTC support"
depends on TOSHIBA_JMR3927 || TOSHIBA_RBTX4927
===== arch/mips/defconfig 1.11 vs edited =====
*** /tmp/defconfig-1.11-23470 Mon May 10 06:25:30 2004
--- arch/mips/defconfig Fri Jun 11 10:56:39 2004
*************** CONFIG_CPU_HAS_LLDSCD=y
*** 125,130 ****
--- 125,131 ----
CONFIG_CPU_HAS_SYNC=y
# CONFIG_PREEMPT is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+ # CONFIG_SPINLOCK_TIMEOUT is not set
#
# Bus options (PCI, PCMCIA, EISA, ISA, TC)
===== arch/ppc/Kconfig 1.64 vs edited =====
*** /tmp/Kconfig-1.64-23470 Mon May 31 07:28:12 2004
--- arch/ppc/Kconfig Fri Jun 11 10:56:39 2004
*************** config DEBUG_SPINLOCK_SLEEP
*** 1199,1204 ****
--- 1199,1218 ----
If you say Y here, various routines which may sleep will become very
noisy if they are called with a spinlock held.
+ config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+ config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config KGDB
bool "Include kgdb kernel debugger"
depends on DEBUG_KERNEL
===== arch/ppc/defconfig 1.28 vs edited =====
*** /tmp/defconfig-1.28-23470 Tue May 18 09:48:09 2004
--- arch/ppc/defconfig Fri Jun 11 10:56:39 2004
*************** CONFIG_ZLIB_DEFLATE=y
*** 1318,1323 ****
--- 1318,1324 ----
# Kernel hacking
#
# CONFIG_DEBUG_KERNEL is not set
+ # CONFIG_SPINLOCK_TIMEOUT is not set
CONFIG_BOOTX_TEXT=y
#
===== arch/ppc64/Kconfig 1.56 vs edited =====
*** /tmp/Kconfig-1.56-23470 Tue May 25 02:31:51 2004
--- arch/ppc64/Kconfig Fri Jun 11 10:56:39 2004
*************** config MAGIC_SYSRQ
*** 387,392 ****
--- 387,406 ----
keys are documented in <file:Documentation/sysrq.txt>. Don't say Y
unless you really know what this hack does.
+ config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+ config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config DEBUGGER
bool "Enable debugger hooks"
depends on DEBUG_KERNEL
===== arch/ppc64/defconfig 1.37 vs edited =====
*** /tmp/defconfig-1.37-23470 Wed Mar 31 16:27:07 2004
--- arch/ppc64/defconfig Fri Jun 11 10:56:39 2004
*************** CONFIG_DEBUG_STACKOVERFLOW=y
*** 1054,1059 ****
--- 1054,1060 ----
CONFIG_DEBUG_STACK_USAGE=y
# CONFIG_DEBUG_SLAB is not set
CONFIG_MAGIC_SYSRQ=y
+ # CONFIG_SPINLOCK_TIMEOUT is not set
CONFIG_DEBUGGER=y
CONFIG_XMON=y
CONFIG_XMON_DEFAULT=y
===== arch/s390/Kconfig 1.27 vs edited =====
*** /tmp/Kconfig-1.27-23470 Thu Apr 29 04:41:09 2004
--- arch/s390/Kconfig Fri Jun 11 10:56:39 2004
*************** config DEBUG_SPINLOCK_SLEEP
*** 423,428 ****
--- 423,442 ----
If you say Y here, various routines which may sleep will become very
noisy if they are called with a spinlock held.
+ config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+ config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
endmenu
source "security/Kconfig"
===== arch/s390/defconfig 1.45 vs edited =====
*** /tmp/defconfig-1.45-23470 Thu Jun 3 03:46:41 2004
--- arch/s390/defconfig Fri Jun 11 10:56:39 2004
*************** CONFIG_MAGIC_SYSRQ=y
*** 474,479 ****
--- 474,480 ----
# CONFIG_DEBUG_SLAB is not set
# CONFIG_DEBUG_INFO is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+ # CONFIG_SPINLOCK_TIMEOUT is not set
#
# Security options
===== arch/sh/Kconfig 1.29 vs edited =====
*** /tmp/Kconfig-1.29-23470 Tue Mar 23 04:05:27 2004
--- arch/sh/Kconfig Fri Jun 11 10:56:39 2004
*************** config DEBUG_SPINLOCK
*** 675,680 ****
--- 675,694 ----
best used in conjunction with the NMI watchdog so that spinlock
deadlocks are also debuggable.
+ config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+ config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config SH_STANDARD_BIOS
bool "Use LinuxSH standard BIOS"
help
===== arch/sh/defconfig 1.9 vs edited =====
*** /tmp/defconfig-1.9-23470 Tue Mar 23 12:18:46 2004
--- arch/sh/defconfig Fri Jun 11 10:56:39 2004
*************** CONFIG_MSDOS_PARTITION=y
*** 351,356 ****
--- 351,357 ----
#
# CONFIG_MAGIC_SYSRQ is not set
# CONFIG_DEBUG_SPINLOCK is not set
+ # CONFIG_SPINLOCK_TIMEOUT is not set
CONFIG_SH_STANDARD_BIOS=y
CONFIG_SH_EARLY_PRINTK=y
# CONFIG_KGDB is not set
===== arch/sparc/Kconfig 1.28 vs edited =====
*** /tmp/Kconfig-1.28-23470 Fri Mar 19 00:04:54 2004
--- arch/sparc/Kconfig Fri Jun 11 10:56:39 2004
*************** config DEBUG_SPINLOCK_SLEEP
*** 440,445 ****
--- 440,459 ----
If you say Y here, various routines which may sleep will become very
noisy if they are called with a spinlock held.
+ config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+ config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config DEBUG_BUGVERBOSE
bool "Verbose BUG() reporting (adds 70K)"
depends on DEBUG_KERNEL
===== arch/sparc/defconfig 1.19 vs edited =====
*** /tmp/defconfig-1.19-23470 Wed Mar 31 00:40:57 2004
--- arch/sparc/defconfig Fri Jun 11 10:56:39 2004
*************** CONFIG_DEBUG_KERNEL=y
*** 611,616 ****
--- 611,617 ----
# CONFIG_DEBUG_SLAB is not set
CONFIG_MAGIC_SYSRQ=y
# CONFIG_DEBUG_SPINLOCK is not set
+ # CONFIG_SPINLOCK_TIMEOUT is not set
# CONFIG_DEBUG_HIGHMEM is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
# CONFIG_DEBUG_BUGVERBOSE is not set
===== arch/sparc64/Kconfig 1.52 vs edited =====
*** /tmp/Kconfig-1.52-23470 Mon May 24 12:09:14 2004
--- arch/sparc64/Kconfig Fri Jun 11 10:56:39 2004
*************** config DEBUG_SPINLOCK_SLEEP
*** 658,663 ****
--- 658,677 ----
If you say Y here, various routines which may sleep will become very
noisy if they are called with a spinlock held.
+ config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+ config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config DEBUG_BUGVERBOSE
bool "Verbose BUG() reporting (adds 70K)"
depends on DEBUG_KERNEL
===== arch/sparc64/defconfig 1.128 vs edited =====
*** /tmp/defconfig-1.128-23470 Thu Jun 3 16:54:05 2004
--- arch/sparc64/defconfig Fri Jun 11 10:56:39 2004
*************** CONFIG_DEBUG_KERNEL=y
*** 1727,1732 ****
--- 1727,1733 ----
CONFIG_MAGIC_SYSRQ=y
# CONFIG_DEBUG_SPINLOCK is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+ # CONFIG_SPINLOCK_TIMEOUT is not set
# CONFIG_DEBUG_BUGVERBOSE is not set
# CONFIG_DEBUG_DCFLUSH is not set
# CONFIG_DEBUG_INFO is not set
===== arch/um/Kconfig 1.14 vs edited =====
*** /tmp/Kconfig-1.14-23470 Mon Apr 12 12:53:57 2004
--- arch/um/Kconfig Fri Jun 11 10:56:39 2004
*************** config DEBUG_SLAB
*** 222,227 ****
--- 222,241 ----
config DEBUG_SPINLOCK
bool "Debug spinlocks usage"
+ config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+ config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config DEBUG_INFO
bool "Enable kernel debugging symbols"
help
===== arch/um/defconfig 1.8 vs edited =====
*** /tmp/defconfig-1.8-23470 Fri Jun 20 15:19:15 2003
--- arch/um/defconfig Fri Jun 11 10:56:39 2004
*************** CONFIG_MTD_BLKMTD=m
*** 399,404 ****
--- 399,405 ----
#
# CONFIG_DEBUG_SLAB is not set
# CONFIG_DEBUG_SPINLOCK is not set
+ # CONFIG_SPINLOCK_TIMEOUT is not set
CONFIG_DEBUG_INFO=y
CONFIG_FRAME_POINTER=y
CONFIG_PT_PROXY=y
===== arch/x86_64/Kconfig 1.51 vs edited =====
*** /tmp/Kconfig-1.51-23470 Sat May 15 08:32:23 2004
--- arch/x86_64/Kconfig Fri Jun 11 10:56:39 2004
*************** config DEBUG_SPINLOCK
*** 436,441 ****
--- 436,455 ----
best used in conjunction with the NMI watchdog so that spinlock
deadlocks are also debuggable.
+ config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+ config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
# !SMP for now because the context switch early causes GPF in segment reloading
# and the GS base checking does the wrong thing then, causing a hang.
config CHECKING
===== arch/x86_64/defconfig 1.39 vs edited =====
*** /tmp/defconfig-1.39-23470 Sat Jun 5 02:25:22 2004
--- arch/x86_64/defconfig Fri Jun 11 10:56:39 2004
*************** CONFIG_DEBUG_KERNEL=y
*** 910,915 ****
--- 910,916 ----
# CONFIG_DEBUG_SLAB is not set
CONFIG_MAGIC_SYSRQ=y
# CONFIG_DEBUG_SPINLOCK is not set
+ # CONFIG_SPINLOCK_TIMEOUT is not set
# CONFIG_INIT_DEBUG is not set
# CONFIG_DEBUG_INFO is not set
# CONFIG_FRAME_POINTER is not set
===== include/linux/jiffies.h 1.9 vs edited =====
*** /tmp/jiffies.h-1.9-23470 Mon Dec 29 15:38:06 2003
--- include/linux/jiffies.h Fri Jun 11 10:56:40 2004
***************
*** 3,10 ****
#include <linux/kernel.h>
#include <linux/types.h>
- #include <linux/spinlock.h>
- #include <linux/seqlock.h>
#include <asm/system.h>
#include <asm/param.h> /* for HZ */
--- 3,8 ----
===== include/linux/spinlock.h 1.28 vs edited =====
*** /tmp/spinlock.h-1.28-23470 Mon May 10 06:25:44 2004
--- include/linux/spinlock.h Fri Jun 11 11:02:53 2004
***************
*** 38,43 ****
--- 38,62 ----
#ifdef CONFIG_SMP
#include <asm/spinlock.h>
+ #if defined(CONFIG_SPINLOCK_TIMEOUT)
+
+ #include <linux/jiffies.h>
+
+ #define SPINLOCK_TIMEOUT CONFIG_SPINLOCK_TIMEOUT_TIME
+
+ /*
+ * There are paths where jiffies won't be updated and
+ * SPINLOCK_TIMEOUT will not work. To ensure they work, it is best
+ * to have every arch implement their own SPINLOCK_TIMEOUT routines
+ * that use hardware timers.
+ */
+ #ifndef ARCH_HAS_SPINLOCK_TIMEOUT
+ #define get_spinlock_timeout() (jiffies + (SPINLOCK_TIMEOUT * HZ))
+ #define check_spinlock_timeout(timeout) (time_after_eq(jiffies, timeout))
+ #endif /* !ARCH_HASH_SPINLOCK_TIMEOUT */
+
+ #endif /* CONFIG_SPINLOCK_TIMEOUT */
+
#else
#define _raw_spin_lock_flags(lock, flags) _raw_spin_lock(lock)
*************** do { \
*** 218,228 ****
--- 237,263 ----
} while (0)
#else
+ #if defined(CONFIG_SPINLOCK_TIMEOUT)
+
+ static inline void spin_lock(spinlock_t * lock) {
+ unsigned long timeout = get_spinlock_timeout();
+
+ preempt_disable();
+ do {
+ if (check_spinlock_timeout(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 { \
===== kernel/sched.c 1.309 vs edited =====
*** /tmp/sched.c-1.309-23470 Sat Jun 5 19:00:00 2004
--- kernel/sched.c Fri Jun 11 10:56:40 2004
*************** EXPORT_SYMBOL(__might_sleep);
*** 3998,4011 ****
*/
void __sched __preempt_spin_lock(spinlock_t *lock)
{
if (preempt_count() > 1) {
_raw_spin_lock(lock);
return;
}
do {
preempt_enable();
! while (spin_is_locked(lock))
cpu_relax();
preempt_disable();
} while (!_raw_spin_trylock(lock));
}
--- 3998,4020 ----
*/
void __sched __preempt_spin_lock(spinlock_t *lock)
{
+ #if defined(CONFIG_SPINLOCK_TIMEOUT)
+ unsigned long timeout = get_spinlock_timeout();
+ #endif
+
if (preempt_count() > 1) {
_raw_spin_lock(lock);
return;
}
do {
preempt_enable();
! while (spin_is_locked(lock)) {
! #if defined(CONFIG_SPINLOCK_TIMEOUT)
! if (check_spinlock_timeout(timeout))
! BUG();
! #endif
cpu_relax();
+ }
preempt_disable();
} while (!_raw_spin_trylock(lock));
}
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH][RFC] Spinlock-timeout
2004-06-11 15:49 ` Benjamin Herrenschmidt
2004-06-11 21:19 ` moilanen
@ 2004-06-11 21:22 ` moilanen
2004-06-11 22:09 ` Benjamin Herrenschmidt
1 sibling, 1 reply; 16+ messages in thread
From: moilanen @ 2004-06-11 21:22 UTC (permalink / raw)
To: Benjamin Herrenschmidt
Cc: Andrew Morton, Linus Torvalds, Linux Kernel list, Paul Mackerras,
Jan-Benedict Glaw
> > Here's a revision to the patch that uses a HAVE_ARCH_GET_TB to allow
> > archs use their timebases if they have one, and if they don't, it uses
> > jiffies. time_after_eq() is used to do the jiffy checking.
> >
> > I also left all of the arch/*/Kconfig changes in until a debug Kconfig
> > is done. I pretty much added in the spinlock timeout on all archs that
> > have CONFIG_DEBUG_SPINLOCK. If I missed your arch, I'm sorry.
>
> Nah, that's not how the abstraction should be done. Much simpler in
> fact. Just do something like this in the generic code:
>
> #ifndef ARCH_HAS_SPINLOCK_TIMEOUT
> #define get_spinlock_timeout() (jiffies + (SPINLOCK_TIMEOUT * HZ))
> #define check_spinlock_timeout(timeout) (time_after_eq(jiffies, timeout))
> #endif
>
> That's all. Then, any arch who has it's own implementation of these 2
> function will #define ARCH_HAS_SPINLOCK_TIMEOUT and implement them the
> way it wants. We shouldn't let anything like get_tb() slip into a common
> file, it's totally PPC specific. Other archs may have different counters
> they can use to impement the same thing. That part should be entirely
> self contained in asm-xxx
Here's the ppc64 add-on for using timebase register for the spinlock
timeout. If no one has any issues w/ the base spin-lock timeout patch, or
this one, please apply.
Thanks,
Jake
===== arch/ppc64/kernel/chrp_setup.c 1.47 vs edited =====
*** /tmp/chrp_setup.c-1.47-18066 Tue Apr 27 00:07:31 2004
--- arch/ppc64/kernel/chrp_setup.c Fri Jun 11 11:58:11 2004
*************** chrp_progress(char *s, unsigned short he
*** 405,414 ****
extern void setup_default_decr(void);
- /* Some sane defaults: 125 MHz timebase, 1GHz processor */
- #define DEFAULT_TB_FREQ 125000000UL
- #define DEFAULT_PROC_FREQ (DEFAULT_TB_FREQ * 8)
-
void __init pSeries_calibrate_decr(void)
{
struct device_node *cpu;
--- 405,410 ----
===== arch/ppc64/kernel/time.c 1.30 vs edited =====
*** /tmp/time.c-1.30-18066 Mon May 31 12:41:03 2004
--- arch/ppc64/kernel/time.c Fri Jun 11 14:19:48 2004
*************** static unsigned long first_settimeofday
*** 81,87 ****
#define XSEC_PER_SEC (1024*1024)
! unsigned long tb_ticks_per_jiffy;
unsigned long tb_ticks_per_usec;
unsigned long tb_ticks_per_sec;
unsigned long next_xtime_sync_tb;
--- 81,87 ----
#define XSEC_PER_SEC (1024*1024)
! unsigned long tb_ticks_per_jiffy = DEFAULT_TB_FREQ / HZ;
unsigned long tb_ticks_per_usec;
unsigned long tb_ticks_per_sec;
unsigned long next_xtime_sync_tb;
===== include/asm-ppc64/processor.h 1.45 vs edited =====
*** /tmp/processor.h-1.45-18066 Tue Jun 1 04:27:47 2004
--- include/asm-ppc64/processor.h Fri Jun 11 11:58:44 2004
*************** GLUE(.,name):
*** 440,445 ****
--- 440,448 ----
#endif /* __ASSEMBLY__ */
+ /* Some sane defaults: 125 MHz timebase, 1GHz processor */
+ #define DEFAULT_TB_FREQ 125000000UL
+ #define DEFAULT_PROC_FREQ (DEFAULT_TB_FREQ * 8)
/* Macros for setting and retrieving special purpose registers */
===== include/asm-ppc64/spinlock.h 1.10 vs edited =====
*** /tmp/spinlock.h-1.10-18066 Tue May 25 04:53:02 2004
--- include/asm-ppc64/spinlock.h Fri Jun 11 14:30:57 2004
*************** static __inline__ void _raw_write_lock(r
*** 278,282 ****
--- 278,293 ----
}
#endif /* CONFIG_SPINLINE */
+ #ifdef CONFIG_SPINLOCK_TIMEOUT
+
+ #define ARCH_HAS_SPINLOCK_TIMEOUT
+
+ extern unsigned long tb_ticks_per_jiffy;
+
+ #define get_spinlock_timeout() (mftb() + (tb_ticks_per_jiffy * SPINLOCK_TIMEOUT * HZ))
+ #define check_spinlock_timeout(timeout) (mftb() >= timeout ? 1 : 0)
+
+ #endif /* CONFIG_SPINLOCK_TIMEOUT */
+
#endif /* __KERNEL__ */
#endif /* __ASM_SPINLOCK_H */
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH][RFC] Spinlock-timeout
2004-06-11 21:19 ` moilanen
@ 2004-06-11 22:08 ` Benjamin Herrenschmidt
2004-06-14 13:12 ` Jake Moilanen
0 siblings, 1 reply; 16+ messages in thread
From: Benjamin Herrenschmidt @ 2004-06-11 22:08 UTC (permalink / raw)
To: moilanen
Cc: Andrew Morton, Linus Torvalds, Linux Kernel list, Paul Mackerras,
Jan-Benedict Glaw
On Fri, 2004-06-11 at 16:19, moilanen@austin.ibm.com wrote:
> > > Here's a revision to the patch that uses a HAVE_ARCH_GET_TB to allow
> > > archs use their timebases if they have one, and if they don't, it uses
> > > jiffies. time_after_eq() is used to do the jiffy checking.
> > >
> > > I also left all of the arch/*/Kconfig changes in until a debug Kconfig
> > > is done. I pretty much added in the spinlock timeout on all archs that
> > > have CONFIG_DEBUG_SPINLOCK. If I missed your arch, I'm sorry.
> >
> > Nah, that's not how the abstraction should be done. Much simpler in
> > fact. Just do something like this in the generic code:
> >
> > #ifndef ARCH_HAS_SPINLOCK_TIMEOUT
> > #define get_spinlock_timeout() (jiffies + (SPINLOCK_TIMEOUT * HZ))
> > #define check_spinlock_timeout(timeout) (time_after_eq(jiffies, timeout))
> > #endif
> >
> > That's all. Then, any arch who has it's own implementation of these 2
> > function will #define ARCH_HAS_SPINLOCK_TIMEOUT and implement them the
> > way it wants. We shouldn't let anything like get_tb() slip into a common
> > file, it's totally PPC specific. Other archs may have different counters
> > they can use to impement the same thing. That part should be entirely
> > self contained in asm-xxx
>
> That's much better. Here's hopefully a version that could be merged.
Hehe, almost ;) There's a bit of non-unified diff at the end ...
Ben.
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH][RFC] Spinlock-timeout
2004-06-11 21:22 ` moilanen
@ 2004-06-11 22:09 ` Benjamin Herrenschmidt
2004-06-14 13:13 ` Jake Moilanen
0 siblings, 1 reply; 16+ messages in thread
From: Benjamin Herrenschmidt @ 2004-06-11 22:09 UTC (permalink / raw)
To: moilanen
Cc: Andrew Morton, Linus Torvalds, Linux Kernel list, Paul Mackerras,
Jan-Benedict Glaw
> Here's the ppc64 add-on for using timebase register for the spinlock
> timeout. If no one has any issues w/ the base spin-lock timeout patch, or
> this one, please apply.
Same comment, make sure you produce a unified diff.
Ben.
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH][RFC] Spinlock-timeout
2004-06-11 22:08 ` Benjamin Herrenschmidt
@ 2004-06-14 13:12 ` Jake Moilanen
0 siblings, 0 replies; 16+ messages in thread
From: Jake Moilanen @ 2004-06-14 13:12 UTC (permalink / raw)
To: Benjamin Herrenschmidt
Cc: Andrew Morton, Linus Torvalds, Linux Kernel list, Paul Mackerras,
Jan-Benedict Glaw
> On Fri, 2004-06-11 at 16:19, moilanen@austin.ibm.com wrote:
> > > > Here's a revision to the patch that uses a HAVE_ARCH_GET_TB to allow
> > > > archs use their timebases if they have one, and if they don't, it uses
> > > > jiffies. time_after_eq() is used to do the jiffy checking.
> > > >
> > > > I also left all of the arch/*/Kconfig changes in until a debug Kconfig
> > > > is done. I pretty much added in the spinlock timeout on all archs that
> > > > have CONFIG_DEBUG_SPINLOCK. If I missed your arch, I'm sorry.
> > >
> > > Nah, that's not how the abstraction should be done. Much simpler in
> > > fact. Just do something like this in the generic code:
> > >
> > > #ifndef ARCH_HAS_SPINLOCK_TIMEOUT
> > > #define get_spinlock_timeout() (jiffies + (SPINLOCK_TIMEOUT * HZ))
> > > #define check_spinlock_timeout(timeout) (time_after_eq(jiffies, timeout))
> > > #endif
> > >
> > > That's all. Then, any arch who has it's own implementation of these 2
> > > function will #define ARCH_HAS_SPINLOCK_TIMEOUT and implement them the
> > > way it wants. We shouldn't let anything like get_tb() slip into a common
> > > file, it's totally PPC specific. Other archs may have different counters
> > > they can use to impement the same thing. That part should be entirely
> > > self contained in asm-xxx
> >
> > That's much better. Here's hopefully a version that could be merged.
>
> Hehe, almost ;) There's a bit of non-unified diff at the end ...
Hmm...not sure how that extra -p option got in there. I did it twice!
Here's the unified version.
diff -Nru a/arch/alpha/Kconfig b/arch/alpha/Kconfig
--- a/arch/alpha/Kconfig Mon Jun 14 08:05:25 2004
+++ b/arch/alpha/Kconfig Mon Jun 14 08:05:25 2004
@@ -664,6 +664,20 @@
best used in conjunction with the NMI watchdog so that spinlock
deadlocks are also debuggable.
+config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config DEBUG_RWLOCK
bool "Read-write spinlock debugging"
depends on DEBUG_KERNEL
diff -Nru a/arch/alpha/defconfig b/arch/alpha/defconfig
--- a/arch/alpha/defconfig Mon Jun 14 08:05:25 2004
+++ b/arch/alpha/defconfig Mon Jun 14 08:05:25 2004
@@ -868,6 +868,7 @@
# CONFIG_DEBUG_SLAB is not set
CONFIG_MAGIC_SYSRQ=y
# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_SPINLOCK_TIMEOUT is not set
# CONFIG_DEBUG_RWLOCK is not set
# CONFIG_DEBUG_SEMAPHORE is not set
CONFIG_DEBUG_INFO=y
diff -Nru a/arch/arm/Kconfig b/arch/arm/Kconfig
--- a/arch/arm/Kconfig Mon Jun 14 08:05:25 2004
+++ b/arch/arm/Kconfig Mon Jun 14 08:05:25 2004
@@ -728,6 +728,20 @@
best used in conjunction with the NMI watchdog so that spinlock
deadlocks are also debuggable.
+config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config DEBUG_WAITQ
bool "Wait queue debugging"
depends on DEBUG_KERNEL
diff -Nru a/arch/arm/defconfig b/arch/arm/defconfig
--- a/arch/arm/defconfig Mon Jun 14 08:05:25 2004
+++ b/arch/arm/defconfig Mon Jun 14 08:05:25 2004
@@ -507,5 +507,6 @@
CONFIG_DEBUG_ERRORS=y
CONFIG_DEBUG_USER=y
# CONFIG_DEBUG_INFO is not set
+# CONFIG_SPINLOCK_TIMEOUT is not set
CONFIG_MAGIC_SYSRQ=y
CONFIG_DEBUG_LL=y
diff -Nru a/arch/arm26/Kconfig b/arch/arm26/Kconfig
--- a/arch/arm26/Kconfig Mon Jun 14 08:05:25 2004
+++ b/arch/arm26/Kconfig Mon Jun 14 08:05:25 2004
@@ -284,6 +284,20 @@
best used in conjunction with the NMI watchdog so that spinlock
deadlocks are also debuggable.
+config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config DEBUG_WAITQ
bool "Wait queue debugging"
depends on DEBUG_KERNEL
diff -Nru a/arch/arm26/defconfig b/arch/arm26/defconfig
--- a/arch/arm26/defconfig Mon Jun 14 08:05:25 2004
+++ b/arch/arm26/defconfig Mon Jun 14 08:05:25 2004
@@ -344,6 +344,7 @@
CONFIG_DEBUG_SLAB=y
CONFIG_MAGIC_SYSRQ=y
CONFIG_DEBUG_SPINLOCK=y
+# CONFIG_SPINLOCK_TIMEOUT is not set
CONFIG_DEBUG_WAITQ=y
CONFIG_DEBUG_BUGVERBOSE=y
CONFIG_DEBUG_ERRORS=y
diff -Nru a/arch/i386/Kconfig b/arch/i386/Kconfig
--- a/arch/i386/Kconfig Mon Jun 14 08:05:25 2004
+++ b/arch/i386/Kconfig Mon Jun 14 08:05:25 2004
@@ -1247,6 +1247,20 @@
best used in conjunction with the NMI watchdog so that spinlock
deadlocks are also debuggable.
+config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config DEBUG_PAGEALLOC
bool "Page alloc debugging"
depends on DEBUG_KERNEL
diff -Nru a/arch/i386/defconfig b/arch/i386/defconfig
--- a/arch/i386/defconfig Mon Jun 14 08:05:25 2004
+++ b/arch/i386/defconfig Mon Jun 14 08:05:25 2004
@@ -1220,6 +1220,7 @@
# CONFIG_DEBUG_KERNEL is not set
CONFIG_EARLY_PRINTK=y
CONFIG_DEBUG_SPINLOCK_SLEEP=y
+# CONFIG_SPINLOCK_TIMEOUT is not set
# CONFIG_FRAME_POINTER is not set
CONFIG_4KSTACKS=y
CONFIG_X86_FIND_SMP_CONFIG=y
diff -Nru a/arch/ia64/Kconfig b/arch/ia64/Kconfig
--- a/arch/ia64/Kconfig Mon Jun 14 08:05:25 2004
+++ b/arch/ia64/Kconfig Mon Jun 14 08:05:25 2004
@@ -468,6 +468,20 @@
If you say Y here, various routines which may sleep will become very
noisy if they are called with a spinlock held.
+config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config IA64_DEBUG_CMPXCHG
bool "Turn on compare-and-exchange bug checking (slow!)"
depends on DEBUG_KERNEL
diff -Nru a/arch/ia64/defconfig b/arch/ia64/defconfig
--- a/arch/ia64/defconfig Mon Jun 14 08:05:25 2004
+++ b/arch/ia64/defconfig Mon Jun 14 08:05:25 2004
@@ -1089,6 +1089,7 @@
# CONFIG_DEBUG_SLAB is not set
# CONFIG_DEBUG_SPINLOCK is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_SPINLOCK_TIMEOUT is not set
# CONFIG_IA64_DEBUG_CMPXCHG is not set
# CONFIG_IA64_DEBUG_IRQ is not set
CONFIG_DEBUG_INFO=y
diff -Nru a/arch/mips/Kconfig b/arch/mips/Kconfig
--- a/arch/mips/Kconfig Mon Jun 14 08:05:25 2004
+++ b/arch/mips/Kconfig Mon Jun 14 08:05:25 2004
@@ -1360,6 +1360,20 @@
If you say Y here, various routines which may sleep will become very
noisy if they are called with a spinlock held.
+config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config RTC_DS1742
bool "DS1742 BRAM/RTC support"
depends on TOSHIBA_JMR3927 || TOSHIBA_RBTX4927
diff -Nru a/arch/mips/defconfig b/arch/mips/defconfig
--- a/arch/mips/defconfig Mon Jun 14 08:05:25 2004
+++ b/arch/mips/defconfig Mon Jun 14 08:05:25 2004
@@ -125,6 +125,7 @@
CONFIG_CPU_HAS_SYNC=y
# CONFIG_PREEMPT is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_SPINLOCK_TIMEOUT is not set
#
# Bus options (PCI, PCMCIA, EISA, ISA, TC)
diff -Nru a/arch/ppc/Kconfig b/arch/ppc/Kconfig
--- a/arch/ppc/Kconfig Mon Jun 14 08:05:25 2004
+++ b/arch/ppc/Kconfig Mon Jun 14 08:05:25 2004
@@ -1199,6 +1199,20 @@
If you say Y here, various routines which may sleep will become very
noisy if they are called with a spinlock held.
+config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config KGDB
bool "Include kgdb kernel debugger"
depends on DEBUG_KERNEL
diff -Nru a/arch/ppc/defconfig b/arch/ppc/defconfig
--- a/arch/ppc/defconfig Mon Jun 14 08:05:25 2004
+++ b/arch/ppc/defconfig Mon Jun 14 08:05:25 2004
@@ -1318,6 +1318,7 @@
# Kernel hacking
#
# CONFIG_DEBUG_KERNEL is not set
+# CONFIG_SPINLOCK_TIMEOUT is not set
CONFIG_BOOTX_TEXT=y
#
diff -Nru a/arch/ppc64/Kconfig b/arch/ppc64/Kconfig
--- a/arch/ppc64/Kconfig Mon Jun 14 08:05:25 2004
+++ b/arch/ppc64/Kconfig Mon Jun 14 08:05:25 2004
@@ -387,6 +387,20 @@
keys are documented in <file:Documentation/sysrq.txt>. Don't say Y
unless you really know what this hack does.
+config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config DEBUGGER
bool "Enable debugger hooks"
depends on DEBUG_KERNEL
diff -Nru a/arch/ppc64/defconfig b/arch/ppc64/defconfig
--- a/arch/ppc64/defconfig Mon Jun 14 08:05:25 2004
+++ b/arch/ppc64/defconfig Mon Jun 14 08:05:25 2004
@@ -1054,6 +1054,7 @@
CONFIG_DEBUG_STACK_USAGE=y
# CONFIG_DEBUG_SLAB is not set
CONFIG_MAGIC_SYSRQ=y
+# CONFIG_SPINLOCK_TIMEOUT is not set
CONFIG_DEBUGGER=y
CONFIG_XMON=y
CONFIG_XMON_DEFAULT=y
diff -Nru a/arch/s390/Kconfig b/arch/s390/Kconfig
--- a/arch/s390/Kconfig Mon Jun 14 08:05:25 2004
+++ b/arch/s390/Kconfig Mon Jun 14 08:05:25 2004
@@ -423,6 +423,20 @@
If you say Y here, various routines which may sleep will become very
noisy if they are called with a spinlock held.
+config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
endmenu
source "security/Kconfig"
diff -Nru a/arch/s390/defconfig b/arch/s390/defconfig
--- a/arch/s390/defconfig Mon Jun 14 08:05:25 2004
+++ b/arch/s390/defconfig Mon Jun 14 08:05:25 2004
@@ -474,6 +474,7 @@
# CONFIG_DEBUG_SLAB is not set
# CONFIG_DEBUG_INFO is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_SPINLOCK_TIMEOUT is not set
#
# Security options
diff -Nru a/arch/sh/Kconfig b/arch/sh/Kconfig
--- a/arch/sh/Kconfig Mon Jun 14 08:05:25 2004
+++ b/arch/sh/Kconfig Mon Jun 14 08:05:25 2004
@@ -675,6 +675,20 @@
best used in conjunction with the NMI watchdog so that spinlock
deadlocks are also debuggable.
+config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config SH_STANDARD_BIOS
bool "Use LinuxSH standard BIOS"
help
diff -Nru a/arch/sh/defconfig b/arch/sh/defconfig
--- a/arch/sh/defconfig Mon Jun 14 08:05:25 2004
+++ b/arch/sh/defconfig Mon Jun 14 08:05:25 2004
@@ -351,6 +351,7 @@
#
# CONFIG_MAGIC_SYSRQ is not set
# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_SPINLOCK_TIMEOUT is not set
CONFIG_SH_STANDARD_BIOS=y
CONFIG_SH_EARLY_PRINTK=y
# CONFIG_KGDB is not set
diff -Nru a/arch/sparc/Kconfig b/arch/sparc/Kconfig
--- a/arch/sparc/Kconfig Mon Jun 14 08:05:25 2004
+++ b/arch/sparc/Kconfig Mon Jun 14 08:05:25 2004
@@ -440,6 +440,20 @@
If you say Y here, various routines which may sleep will become very
noisy if they are called with a spinlock held.
+config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config DEBUG_BUGVERBOSE
bool "Verbose BUG() reporting (adds 70K)"
depends on DEBUG_KERNEL
diff -Nru a/arch/sparc/defconfig b/arch/sparc/defconfig
--- a/arch/sparc/defconfig Mon Jun 14 08:05:25 2004
+++ b/arch/sparc/defconfig Mon Jun 14 08:05:25 2004
@@ -611,6 +611,7 @@
# CONFIG_DEBUG_SLAB is not set
CONFIG_MAGIC_SYSRQ=y
# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_SPINLOCK_TIMEOUT is not set
# CONFIG_DEBUG_HIGHMEM is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
# CONFIG_DEBUG_BUGVERBOSE is not set
diff -Nru a/arch/sparc64/Kconfig b/arch/sparc64/Kconfig
--- a/arch/sparc64/Kconfig Mon Jun 14 08:05:25 2004
+++ b/arch/sparc64/Kconfig Mon Jun 14 08:05:25 2004
@@ -658,6 +658,20 @@
If you say Y here, various routines which may sleep will become very
noisy if they are called with a spinlock held.
+config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config DEBUG_BUGVERBOSE
bool "Verbose BUG() reporting (adds 70K)"
depends on DEBUG_KERNEL
diff -Nru a/arch/sparc64/defconfig b/arch/sparc64/defconfig
--- a/arch/sparc64/defconfig Mon Jun 14 08:05:25 2004
+++ b/arch/sparc64/defconfig Mon Jun 14 08:05:25 2004
@@ -1727,6 +1727,7 @@
CONFIG_MAGIC_SYSRQ=y
# CONFIG_DEBUG_SPINLOCK is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_SPINLOCK_TIMEOUT is not set
# CONFIG_DEBUG_BUGVERBOSE is not set
# CONFIG_DEBUG_DCFLUSH is not set
# CONFIG_DEBUG_INFO is not set
diff -Nru a/arch/um/Kconfig b/arch/um/Kconfig
--- a/arch/um/Kconfig Mon Jun 14 08:05:25 2004
+++ b/arch/um/Kconfig Mon Jun 14 08:05:25 2004
@@ -222,6 +222,20 @@
config DEBUG_SPINLOCK
bool "Debug spinlocks usage"
+config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
config DEBUG_INFO
bool "Enable kernel debugging symbols"
help
diff -Nru a/arch/um/defconfig b/arch/um/defconfig
--- a/arch/um/defconfig Mon Jun 14 08:05:25 2004
+++ b/arch/um/defconfig Mon Jun 14 08:05:25 2004
@@ -399,6 +399,7 @@
#
# CONFIG_DEBUG_SLAB is not set
# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_SPINLOCK_TIMEOUT is not set
CONFIG_DEBUG_INFO=y
CONFIG_FRAME_POINTER=y
CONFIG_PT_PROXY=y
diff -Nru a/arch/x86_64/Kconfig b/arch/x86_64/Kconfig
--- a/arch/x86_64/Kconfig Mon Jun 14 08:05:25 2004
+++ b/arch/x86_64/Kconfig Mon Jun 14 08:05:25 2004
@@ -436,6 +436,20 @@
best used in conjunction with the NMI watchdog so that spinlock
deadlocks are also debuggable.
+config SPINLOCK_TIMEOUT
+ bool "Spinlocks timeout"
+ depends on DEBUG_KERNEL && SMP
+ help
+ If you say Y here, the spinlocks will timeout after X number
+ of seconds. This is useful for catching deadlocks, and make sure
+ locks are not held too long.
+
+config SPINLOCK_TIMEOUT_TIME
+ int "Spinlock timeout time in seconds (1-43200)"
+ range 1 43200
+ depends on SPINLOCK_TIMEOUT
+ default "10"
+
# !SMP for now because the context switch early causes GPF in segment reloading
# and the GS base checking does the wrong thing then, causing a hang.
config CHECKING
diff -Nru a/arch/x86_64/defconfig b/arch/x86_64/defconfig
--- a/arch/x86_64/defconfig Mon Jun 14 08:05:25 2004
+++ b/arch/x86_64/defconfig Mon Jun 14 08:05:25 2004
@@ -910,6 +910,7 @@
# CONFIG_DEBUG_SLAB is not set
CONFIG_MAGIC_SYSRQ=y
# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_SPINLOCK_TIMEOUT is not set
# CONFIG_INIT_DEBUG is not set
# CONFIG_DEBUG_INFO is not set
# CONFIG_FRAME_POINTER is not set
diff -Nru a/include/linux/jiffies.h b/include/linux/jiffies.h
--- a/include/linux/jiffies.h Mon Jun 14 08:05:25 2004
+++ b/include/linux/jiffies.h Mon Jun 14 08:05:25 2004
@@ -3,8 +3,6 @@
#include <linux/kernel.h>
#include <linux/types.h>
-#include <linux/spinlock.h>
-#include <linux/seqlock.h>
#include <asm/system.h>
#include <asm/param.h> /* for HZ */
diff -Nru a/include/linux/spinlock.h b/include/linux/spinlock.h
--- a/include/linux/spinlock.h Mon Jun 14 08:05:25 2004
+++ b/include/linux/spinlock.h Mon Jun 14 08:05:25 2004
@@ -38,6 +38,25 @@
#ifdef CONFIG_SMP
#include <asm/spinlock.h>
+#if defined(CONFIG_SPINLOCK_TIMEOUT)
+
+#include <linux/jiffies.h>
+
+#define SPINLOCK_TIMEOUT CONFIG_SPINLOCK_TIMEOUT_TIME
+
+/*
+ * There are paths where jiffies won't be updated and
+ * SPINLOCK_TIMEOUT will not work. To ensure they work, it is best
+ * to have every arch implement their own SPINLOCK_TIMEOUT routines
+ * that use hardware timers.
+ */
+#ifndef ARCH_HAS_SPINLOCK_TIMEOUT
+#define get_spinlock_timeout() (jiffies + (SPINLOCK_TIMEOUT * HZ))
+#define check_spinlock_timeout(timeout) (time_after_eq(jiffies, timeout))
+#endif /* !ARCH_HASH_SPINLOCK_TIMEOUT */
+
+#endif /* CONFIG_SPINLOCK_TIMEOUT */
+
#else
#define _raw_spin_lock_flags(lock, flags) _raw_spin_lock(lock)
@@ -218,11 +237,27 @@
} while (0)
#else
+#if defined(CONFIG_SPINLOCK_TIMEOUT)
+
+static inline void spin_lock(spinlock_t * lock) {
+ unsigned long timeout = get_spinlock_timeout();
+
+ preempt_disable();
+ do {
+ if (check_spinlock_timeout(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 { \
diff -Nru a/kernel/sched.c b/kernel/sched.c
--- a/kernel/sched.c Mon Jun 14 08:05:25 2004
+++ b/kernel/sched.c Mon Jun 14 08:05:25 2004
@@ -3998,14 +3998,23 @@
*/
void __sched __preempt_spin_lock(spinlock_t *lock)
{
+#if defined(CONFIG_SPINLOCK_TIMEOUT)
+ unsigned long timeout = get_spinlock_timeout();
+#endif
+
if (preempt_count() > 1) {
_raw_spin_lock(lock);
return;
}
do {
preempt_enable();
- while (spin_is_locked(lock))
+ while (spin_is_locked(lock)) {
+#if defined(CONFIG_SPINLOCK_TIMEOUT)
+ if (check_spinlock_timeout(timeout))
+ BUG();
+#endif
cpu_relax();
+ }
preempt_disable();
} while (!_raw_spin_trylock(lock));
}
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH][RFC] Spinlock-timeout
2004-06-11 22:09 ` Benjamin Herrenschmidt
@ 2004-06-14 13:13 ` Jake Moilanen
0 siblings, 0 replies; 16+ messages in thread
From: Jake Moilanen @ 2004-06-14 13:13 UTC (permalink / raw)
To: Benjamin Herrenschmidt
Cc: Andrew Morton, Linus Torvalds, Linux Kernel list, Paul Mackerras,
Jan-Benedict Glaw
>
> > Here's the ppc64 add-on for using timebase register for the spinlock
> > timeout. If no one has any issues w/ the base spin-lock timeout patch, or
> > this one, please apply.
>
> Same comment, make sure you produce a unified diff.
Here's the unified ver.
diff -Nru a/arch/ppc64/kernel/chrp_setup.c b/arch/ppc64/kernel/chrp_setup.c
--- a/arch/ppc64/kernel/chrp_setup.c Mon Jun 14 08:07:11 2004
+++ b/arch/ppc64/kernel/chrp_setup.c Mon Jun 14 08:07:11 2004
@@ -405,10 +405,6 @@
extern void setup_default_decr(void);
-/* Some sane defaults: 125 MHz timebase, 1GHz processor */
-#define DEFAULT_TB_FREQ 125000000UL
-#define DEFAULT_PROC_FREQ (DEFAULT_TB_FREQ * 8)
-
void __init pSeries_calibrate_decr(void)
{
struct device_node *cpu;
diff -Nru a/arch/ppc64/kernel/time.c b/arch/ppc64/kernel/time.c
--- a/arch/ppc64/kernel/time.c Mon Jun 14 08:07:11 2004
+++ b/arch/ppc64/kernel/time.c Mon Jun 14 08:07:11 2004
@@ -81,7 +81,7 @@
#define XSEC_PER_SEC (1024*1024)
-unsigned long tb_ticks_per_jiffy;
+unsigned long tb_ticks_per_jiffy = DEFAULT_TB_FREQ / HZ;
unsigned long tb_ticks_per_usec;
unsigned long tb_ticks_per_sec;
unsigned long next_xtime_sync_tb;
diff -Nru a/include/asm-ppc64/processor.h b/include/asm-ppc64/processor.h
--- a/include/asm-ppc64/processor.h Mon Jun 14 08:07:11 2004
+++ b/include/asm-ppc64/processor.h Mon Jun 14 08:07:11 2004
@@ -440,6 +440,9 @@
#endif /* __ASSEMBLY__ */
+/* Some sane defaults: 125 MHz timebase, 1GHz processor */
+#define DEFAULT_TB_FREQ 125000000UL
+#define DEFAULT_PROC_FREQ (DEFAULT_TB_FREQ * 8)
/* Macros for setting and retrieving special purpose registers */
diff -Nru a/include/asm-ppc64/spinlock.h b/include/asm-ppc64/spinlock.h
--- a/include/asm-ppc64/spinlock.h Mon Jun 14 08:07:11 2004
+++ b/include/asm-ppc64/spinlock.h Mon Jun 14 08:07:11 2004
@@ -278,5 +278,16 @@
}
#endif /* CONFIG_SPINLINE */
+#ifdef CONFIG_SPINLOCK_TIMEOUT
+
+#define ARCH_HAS_SPINLOCK_TIMEOUT
+
+extern unsigned long tb_ticks_per_jiffy;
+
+#define get_spinlock_timeout() (mftb() + (tb_ticks_per_jiffy * SPINLOCK_TIMEOUT * HZ))
+#define check_spinlock_timeout(timeout) (mftb() >= timeout ? 1 : 0)
+
+#endif /* CONFIG_SPINLOCK_TIMEOUT */
+
#endif /* __KERNEL__ */
#endif /* __ASM_SPINLOCK_H */
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2004-06-14 13:14 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-06-05 20:31 [PATCH][RFC] Spinlock-timeout Jake Moilanen
2004-06-05 20:51 ` Jan-Benedict Glaw
2004-06-10 18:44 ` Jake Moilanen
2004-06-10 19:24 ` Jan-Benedict Glaw
2004-06-10 21:00 ` Randy.Dunlap
2004-06-06 10:13 ` Paul Mackerras
2004-06-06 22:23 ` Benjamin Herrenschmidt
2004-06-11 14:05 ` Jake Moilanen
2004-06-11 15:49 ` Benjamin Herrenschmidt
2004-06-11 21:19 ` moilanen
2004-06-11 22:08 ` Benjamin Herrenschmidt
2004-06-14 13:12 ` Jake Moilanen
2004-06-11 21:22 ` moilanen
2004-06-11 22:09 ` Benjamin Herrenschmidt
2004-06-14 13:13 ` Jake Moilanen
2004-06-11 14:08 ` Jake Moilanen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox