On Saturday 25 November 2000 22:05, Roger Larsson wrote: > On Saturday 25 November 2000 20:22, Philipp Rumpf wrote: > > On Sat, Nov 25, 2000 at 08:03:49PM +0100, Roger Larsson wrote: > > > > _trylock functions return 0 for success. > > > > > > Not spin_trylock > > > > Argh, I missed the (recent ?) change to make x86 spinlocks use 1 to mean > > unlocked. You're correct, and obviously this should be fixed. Have looked more into this now... tasklet_trylock is also wrong (but there are only four of them) Is this 2.4 only, or where there spin locks earlier too? My suggestion now is a few steps: 1) to release a kernel version that has corrected _trylocks; spin2_trylock and tasklet2_trylock. [with corresponding updates in as many places as possible: s/!spin_trylock/spin2_trylock/g s/spin_trylock/!spin2_trylock/g . . .] (ready for spin trylock, not done for tasklet yet..., attached, hope it got included OK - not fully used to kmail) 2) This will in house only drives or compilations that in some strange way uses this calls... 3a) (DANGEROUS) global rename spin2_trylock to spin_trylock [no logic change this time - only name] 3b) (dangerous) add compatibility interface #define spin_trylock(L) (!spin2_trylock(L)) Probably not necessary since it can not be linked against. Binary modules will contain their own compatibility code :-) Probably preferred by those who maintain drivers for several releases; 2.2, 2.4, ... 3c) do not do anything more... Alternative: 1b) do nothing at all - suffer later /RogerL -- Home page: http://www.norran.net/nra02596/
diff -Naur v2.4.0-test11-linux/arch/alpha/kernel/alpha_ksyms.c linux/arch/alpha/kernel/alpha_ksyms.c --- v2.4.0-test11-linux/arch/alpha/kernel/alpha_ksyms.c Mon Nov 27 21:06:14 2000 +++ linux/arch/alpha/kernel/alpha_ksyms.c Tue Nov 28 00:35:13 2000 @@ -198,7 +198,7 @@ #if DEBUG_SPINLOCK EXPORT_SYMBOL(spin_unlock); EXPORT_SYMBOL(debug_spin_lock); -EXPORT_SYMBOL(debug_spin_trylock); +EXPORT_SYMBOL(debug_spin2_trylock); #endif #if DEBUG_RWLOCK EXPORT_SYMBOL(write_lock); diff -Naur v2.4.0-test11-linux/arch/alpha/kernel/irq_smp.c linux/arch/alpha/kernel/irq_smp.c --- v2.4.0-test11-linux/arch/alpha/kernel/irq_smp.c Thu Sep 21 19:53:32 2000 +++ linux/arch/alpha/kernel/irq_smp.c Tue Nov 28 00:35:31 2000 @@ -96,7 +96,7 @@ if (!local_bh_count(cpu) && spin_is_locked(&global_bh_lock)) continue; - if (spin_trylock(&global_irq_lock)) + if (!spin2_trylock(&global_irq_lock)) break; } } @@ -105,7 +105,7 @@ static inline void get_irqlock(int cpu, void* where) { - if (!spin_trylock(&global_irq_lock)) { + if (spin2_trylock(&global_irq_lock)) { /* Do we already hold the lock? */ if (cpu == global_irq_holder) return; diff -Naur v2.4.0-test11-linux/arch/alpha/kernel/smp.c linux/arch/alpha/kernel/smp.c --- v2.4.0-test11-linux/arch/alpha/kernel/smp.c Fri Oct 13 00:57:30 2000 +++ linux/arch/alpha/kernel/smp.c Tue Nov 28 00:34:59 2000 @@ -1078,10 +1078,10 @@ } int -debug_spin_trylock(spinlock_t * lock, const char *base_file, int line_no) +debug_spin2_trylock(spinlock_t * lock, const char *base_file, int line_no) { int ret; - if ((ret = !test_and_set_bit(0, lock))) { + if ((ret = test_and_set_bit(0, lock))) { lock->on_cpu = smp_processor_id(); lock->previous = __builtin_return_address(0); lock->task = current; diff -Naur v2.4.0-test11-linux/arch/mips64/sgi-ip27/ip27-irq.c linux/arch/mips64/sgi-ip27/ip27-irq.c --- v2.4.0-test11-linux/arch/mips64/sgi-ip27/ip27-irq.c Thu Sep 21 19:53:32 2000 +++ linux/arch/mips64/sgi-ip27/ip27-irq.c Tue Nov 28 00:44:48 2000 @@ -480,7 +480,7 @@ continue; if (!local_bh_count(cpu) && spin_is_locked(&global_bh_lock)) continue; - if (spin_trylock(&global_irq_lock)) + if (!spin2_trylock(&global_irq_lock)) break; } } @@ -497,7 +497,7 @@ static inline void get_irqlock(int cpu) { - if (!spin_trylock(&global_irq_lock)) { + if (spin2_trylock(&global_irq_lock)) { /* do we already hold the lock? */ if ((unsigned char) cpu == global_irq_holder) return; diff -Naur v2.4.0-test11-linux/arch/ppc/kernel/misc.S linux/arch/ppc/kernel/misc.S --- v2.4.0-test11-linux/arch/ppc/kernel/misc.S Mon Nov 27 21:06:14 2000 +++ linux/arch/ppc/kernel/misc.S Tue Nov 28 00:40:02 2000 @@ -434,6 +434,7 @@ * Environments Manual suggests not doing unnecessary stcwx.'s * since they may inhibit forward progress by other CPUs in getting * a lock. + * Returns: 0 on success ??? */ _GLOBAL(__spin_trylock) mr r4,r3 diff -Naur v2.4.0-test11-linux/arch/ppc/kernel/ppc_ksyms.c linux/arch/ppc/kernel/ppc_ksyms.c --- v2.4.0-test11-linux/arch/ppc/kernel/ppc_ksyms.c Mon Nov 27 21:06:14 2000 +++ linux/arch/ppc/kernel/ppc_ksyms.c Tue Nov 28 00:37:23 2000 @@ -197,7 +197,7 @@ EXPORT_SYMBOL(__global_restore_flags); EXPORT_SYMBOL(_spin_lock); EXPORT_SYMBOL(_spin_unlock); -EXPORT_SYMBOL(spin_trylock); +EXPORT_SYMBOL(spin2_trylock); EXPORT_SYMBOL(_read_lock); EXPORT_SYMBOL(_read_unlock); EXPORT_SYMBOL(_write_lock); diff -Naur v2.4.0-test11-linux/arch/ppc/lib/locks.c linux/arch/ppc/lib/locks.c --- v2.4.0-test11-linux/arch/ppc/lib/locks.c Thu Oct 7 19:17:08 1999 +++ linux/arch/ppc/lib/locks.c Tue Nov 28 00:41:25 2000 @@ -43,13 +43,13 @@ lock->owner_cpu = cpu; } -int spin_trylock(spinlock_t *lock) +int spin2_trylock(spinlock_t *lock) { if (__spin_trylock(&lock->lock)) - return 0; + return 1; lock->owner_cpu = smp_processor_id(); lock->owner_pc = (unsigned long)__builtin_return_address(0); - return 1; + return 0; } diff -Naur v2.4.0-test11-linux/arch/sparc/kernel/sparc_ksyms.c linux/arch/sparc/kernel/sparc_ksyms.c --- v2.4.0-test11-linux/arch/sparc/kernel/sparc_ksyms.c Thu Sep 21 19:54:24 2000 +++ linux/arch/sparc/kernel/sparc_ksyms.c Tue Nov 28 00:35:38 2000 @@ -101,7 +101,7 @@ #ifdef SPIN_LOCK_DEBUG EXPORT_SYMBOL(_do_spin_lock); EXPORT_SYMBOL(_do_spin_unlock); -EXPORT_SYMBOL(_spin_trylock); +EXPORT_SYMBOL(_spin2_trylock); EXPORT_SYMBOL(_do_read_lock); EXPORT_SYMBOL(_do_read_unlock); EXPORT_SYMBOL(_do_write_lock); diff -Naur v2.4.0-test11-linux/arch/sparc/lib/debuglocks.c linux/arch/sparc/lib/debuglocks.c --- v2.4.0-test11-linux/arch/sparc/lib/debuglocks.c Fri Sep 10 20:06:19 1999 +++ linux/arch/sparc/lib/debuglocks.c Tue Nov 28 00:36:37 2000 @@ -85,7 +85,7 @@ lock->owner_pc = (cpu & 3) | (caller & ~3); } -int _spin_trylock(spinlock_t *lock) +int _spin2_trylock(spinlock_t *lock) { unsigned long val; unsigned long caller; @@ -98,7 +98,7 @@ /* We got it, record our identity for debugging. */ lock->owner_pc = (cpu & 3) | (caller & ~3); } - return val == 0; + return val != 0; } void _do_spin_unlock(spinlock_t *lock) diff -Naur v2.4.0-test11-linux/arch/sparc64/kernel/sparc64_ksyms.c linux/arch/sparc64/kernel/sparc64_ksyms.c --- v2.4.0-test11-linux/arch/sparc64/kernel/sparc64_ksyms.c Mon Nov 27 21:06:14 2000 +++ linux/arch/sparc64/kernel/sparc64_ksyms.c Tue Nov 28 00:48:13 2000 @@ -99,7 +99,7 @@ #ifdef SPIN_LOCK_DEBUG extern void _do_spin_lock (spinlock_t *lock, char *str); extern void _do_spin_unlock (spinlock_t *lock); -extern int _spin_trylock (spinlock_t *lock); +extern int _spin2_trylock (spinlock_t *lock); extern void _do_read_lock(rwlock_t *rw, char *str); extern void _do_read_unlock(rwlock_t *rw, char *str); extern void _do_write_lock(rwlock_t *rw, char *str); @@ -142,7 +142,7 @@ #ifdef SPIN_LOCK_DEBUG EXPORT_SYMBOL(_do_spin_lock); EXPORT_SYMBOL(_do_spin_unlock); -EXPORT_SYMBOL(_spin_trylock); +EXPORT_SYMBOL(_spin2_trylock); EXPORT_SYMBOL(_do_read_lock); EXPORT_SYMBOL(_do_read_unlock); EXPORT_SYMBOL(_do_write_lock); diff -Naur v2.4.0-test11-linux/arch/sparc64/lib/debuglocks.c linux/arch/sparc64/lib/debuglocks.c --- v2.4.0-test11-linux/arch/sparc64/lib/debuglocks.c Wed May 31 20:13:23 2000 +++ linux/arch/sparc64/lib/debuglocks.c Tue Nov 28 00:44:30 2000 @@ -78,7 +78,7 @@ lock->owner_cpu = cpu; } -int _spin_trylock(spinlock_t *lock) +int _spin2_trylock(spinlock_t *lock) { unsigned long val, caller; int cpu = smp_processor_id(); @@ -93,7 +93,7 @@ lock->owner_pc = ((unsigned int)caller); lock->owner_cpu = cpu; } - return val == 0; + return val != 0; } void _do_spin_unlock(spinlock_t *lock) diff -Naur v2.4.0-test11-linux/drivers/net/ppp_async.c linux/drivers/net/ppp_async.c --- v2.4.0-test11-linux/drivers/net/ppp_async.c Fri Apr 21 22:31:10 2000 +++ linux/drivers/net/ppp_async.c Tue Nov 28 00:34:01 2000 @@ -33,9 +33,9 @@ #include <linux/init.h> #include <asm/uaccess.h> -#ifndef spin_trylock_bh -#define spin_trylock_bh(lock) ({ int __r; local_bh_disable(); \ - __r = spin_trylock(lock); \ +#ifndef spin2_trylock_bh +#define spin2_trylock_bh(lock) ({ int __r; local_bh_disable(); \ + __r = spin2_trylock(lock); \ if (!__r) local_bh_enable(); \ __r; }) #endif @@ -637,7 +637,7 @@ int tty_stuffed = 0; set_bit(XMIT_WAKEUP, &ap->xmit_flags); - if (!spin_trylock_bh(&ap->xmit_lock)) + if (spin2_trylock_bh(&ap->xmit_lock)) return 0; for (;;) { if (test_and_clear_bit(XMIT_WAKEUP, &ap->xmit_flags)) @@ -666,7 +666,7 @@ if (!(test_bit(XMIT_WAKEUP, &ap->xmit_flags) || (!tty_stuffed && ap->tpkt != 0))) break; - if (!spin_trylock_bh(&ap->xmit_lock)) + if (spin2_trylock_bh(&ap->xmit_lock)) break; } return done; diff -Naur v2.4.0-test11-linux/drivers/net/ppp_synctty.c linux/drivers/net/ppp_synctty.c --- v2.4.0-test11-linux/drivers/net/ppp_synctty.c Wed May 31 20:13:26 2000 +++ linux/drivers/net/ppp_synctty.c Tue Nov 28 00:34:32 2000 @@ -44,9 +44,9 @@ #include <linux/init.h> #include <asm/uaccess.h> -#ifndef spin_trylock_bh -#define spin_trylock_bh(lock) ({ int __r; local_bh_disable(); \ - __r = spin_trylock(lock); \ +#ifndef spin2_trylock_bh +#define spin2_trylock_bh(lock) ({ int __r; local_bh_disable(); \ + __r = spin2_trylock(lock); \ if (!__r) local_bh_enable(); \ __r; }) #endif @@ -590,7 +590,7 @@ int tty_stuffed = 0; set_bit(XMIT_WAKEUP, &ap->xmit_flags); - if (!spin_trylock_bh(&ap->xmit_lock)) + if (spin2_trylock_bh(&ap->xmit_lock)) return 0; for (;;) { if (test_and_clear_bit(XMIT_WAKEUP, &ap->xmit_flags)) @@ -615,7 +615,7 @@ if (!(test_bit(XMIT_WAKEUP, &ap->xmit_flags) || (!tty_stuffed && ap->tpkt != 0))) break; - if (!spin_trylock_bh(&ap->xmit_lock)) + if (spin2_trylock_bh(&ap->xmit_lock)) break; } return done; diff -Naur v2.4.0-test11-linux/fs/buffer.c linux/fs/buffer.c --- v2.4.0-test11-linux/fs/buffer.c Mon Nov 27 21:06:27 2000 +++ linux/fs/buffer.c Tue Nov 28 00:12:17 2000 @@ -2364,7 +2364,7 @@ atomic_read(&buffermem_pages) << (PAGE_SHIFT-10)); #ifdef CONFIG_SMP /* trylock does nothing on UP and so we could deadlock */ - if (!spin_trylock(&lru_list_lock)) + if (spin2_trylock(&lru_list_lock)) return; for(nlist = 0; nlist < NR_LIST; nlist++) { found = locked = dirty = used = lastused = protected = 0; diff -Naur v2.4.0-test11-linux/include/asm-alpha/spinlock.h linux/include/asm-alpha/spinlock.h --- v2.4.0-test11-linux/include/asm-alpha/spinlock.h Mon Nov 27 21:06:28 2000 +++ linux/include/asm-alpha/spinlock.h Tue Nov 28 00:22:55 2000 @@ -41,10 +41,10 @@ #if DEBUG_SPINLOCK extern void spin_unlock(spinlock_t * lock); extern void debug_spin_lock(spinlock_t * lock, const char *, int); -extern int debug_spin_trylock(spinlock_t * lock, const char *, int); +extern int debug_spin2_trylock(spinlock_t * lock, const char *, int); #define spin_lock(LOCK) debug_spin_lock(LOCK, __BASE_FILE__, __LINE__) -#define spin_trylock(LOCK) debug_spin_trylock(LOCK, __BASE_FILE__, __LINE__) +#define spin2_trylock(LOCK) debug_spin2_trylock(LOCK, __BASE_FILE__, __LINE__) #define spin_lock_own(LOCK, LOCATION) \ do { \ @@ -84,7 +84,7 @@ : "m"(lock->lock) : "memory"); } -#define spin_trylock(lock) (!test_and_set_bit(0,(lock))) +#define spin2_trylock(lock) (test_and_set_bit(0,(lock))) #define spin_lock_own(LOCK, LOCATION) ((void)0) #endif /* DEBUG_SPINLOCK */ diff -Naur v2.4.0-test11-linux/include/asm-i386/spinlock.h linux/include/asm-i386/spinlock.h --- v2.4.0-test11-linux/include/asm-i386/spinlock.h Fri Oct 13 00:58:05 2000 +++ linux/include/asm-i386/spinlock.h Tue Nov 28 00:21:56 2000 @@ -65,14 +65,14 @@ #define spin_unlock_string \ "movb $1,%0" -static inline int spin_trylock(spinlock_t *lock) +static inline int spin2_trylock(spinlock_t *lock) { char oldval; __asm__ __volatile__( "xchgb %b0,%1" :"=q" (oldval), "=m" (lock->lock) :"0" (0) : "memory"); - return oldval > 0; + return oldval == 0; } static inline void spin_lock(spinlock_t *lock) diff -Naur v2.4.0-test11-linux/include/asm-ia64/spinlock.h linux/include/asm-ia64/spinlock.h --- v2.4.0-test11-linux/include/asm-ia64/spinlock.h Mon Nov 27 21:04:56 2000 +++ linux/include/asm-ia64/spinlock.h Tue Nov 28 00:29:40 2000 @@ -48,7 +48,7 @@ : "ar.ccv", "ar.pfs", "b7", "p15", "r28", "r29", "r30", "memory"); \ } -#define spin_trylock(x) \ +#define spin2_trylock(x) + \ ({ \ register char *addr __asm__ ("r31") = (char *) &(x)->lock; \ register long result; \ @@ -59,7 +59,7 @@ ";;\n" \ IA64_SEMFIX"cmpxchg1.acq %0=[%1],r30,ar.ccv\n" \ : "=r"(result) : "r"(addr) : "ar.ccv", "r30", "memory"); \ - (result == 0); \ + (result != 0); \ }) #define spin_is_locked(x) ((x)->lock != 0) @@ -98,7 +98,7 @@ #define spin_is_locked(x) ((x)->lock != 0) #define spin_unlock(x) do {((spinlock_t *) x)->lock = 0; barrier(); } while (0) -#define spin_trylock(x) (cmpxchg_acq(&(x)->lock, 0, 1) == 0) +#define spin2_trylock(x) (cmpxchg_acq(&(x)->lock, 0, 1) != 0) #define spin_unlock_wait(x) do { barrier(); } while ((x)->lock) #endif /* !NEW_LOCK */ diff -Naur v2.4.0-test11-linux/include/asm-mips/spinlock.h linux/include/asm-mips/spinlock.h --- v2.4.0-test11-linux/include/asm-mips/spinlock.h Wed May 31 20:13:32 2000 +++ linux/include/asm-mips/spinlock.h Tue Nov 28 00:22:05 2000 @@ -62,7 +62,7 @@ : "memory"); } -#define spin_trylock(lock) (!test_and_set_bit(0,(lock))) +#define spin2_trylock(lock) (test_and_set_bit(0,(lock))) /* * Read-write spinlocks, allowing multiple readers but only one writer. diff -Naur v2.4.0-test11-linux/include/asm-mips64/spinlock.h linux/include/asm-mips64/spinlock.h --- v2.4.0-test11-linux/include/asm-mips64/spinlock.h Wed May 31 20:13:33 2000 +++ linux/include/asm-mips64/spinlock.h Tue Nov 28 00:31:05 2000 @@ -65,12 +65,12 @@ : "memory"); } -static inline unsigned int spin_trylock(spinlock_t *lock) +static inline unsigned int spin2_trylock(spinlock_t *lock) { unsigned int temp, res; __asm__ __volatile__( - ".set\tnoreorder\t\t\t# spin_trylock\n\t" + ".set\tnoreorder\t\t\t# spin2_trylock\n\t" "1:\tll\t%0, %1\n\t" "or\t%2, %0, %3\n\t" "sc\t%2, %1\n\t" @@ -81,7 +81,7 @@ :"r" (1), "m" (*lock) : "memory"); - return res == 0; + return res != 0; } /* diff -Naur v2.4.0-test11-linux/include/asm-ppc/spinlock.h linux/include/asm-ppc/spinlock.h --- v2.4.0-test11-linux/include/asm-ppc/spinlock.h Mon Nov 27 21:06:30 2000 +++ linux/include/asm-ppc/spinlock.h Tue Nov 28 00:28:14 2000 @@ -19,12 +19,12 @@ extern void _spin_lock(spinlock_t *lock); extern void _spin_unlock(spinlock_t *lock); -extern int spin_trylock(spinlock_t *lock); +extern int spin2_trylock(spinlock_t *lock); #define spin_lock(lp) _spin_lock(lp) #define spin_unlock(lp) _spin_unlock(lp) -extern unsigned long __spin_trylock(volatile unsigned long *lock); +extern unsigned long __spin2_trylock(volatile unsigned long *lock); /* * Read-write spinlocks, allowing multiple readers diff -Naur v2.4.0-test11-linux/include/asm-s390/spinlock.h linux/include/asm-s390/spinlock.h --- v2.4.0-test11-linux/include/asm-s390/spinlock.h Fri May 12 20:41:44 2000 +++ linux/include/asm-s390/spinlock.h Tue Nov 28 01:04:34 2000 @@ -37,7 +37,7 @@ : "0" (lp->lock) : "0", "1"); } -extern inline int spin_trylock(spinlock_t *lp) +extern inline int spin2_trylock(spinlock_t *lp) { unsigned long result; __asm__ __volatile(" slr %1,%1\n" @@ -45,7 +45,7 @@ "0: cs %1,0,%0" : "=m" (lp->lock), "=&d" (result) : "0" (lp->lock) : "0"); - return !result; + return result != 0; } diff -Naur v2.4.0-test11-linux/include/asm-sparc/spinlock.h linux/include/asm-sparc/spinlock.h --- v2.4.0-test11-linux/include/asm-sparc/spinlock.h Thu Sep 21 19:54:16 2000 +++ linux/include/asm-sparc/spinlock.h Tue Nov 28 00:47:42 2000 @@ -33,10 +33,10 @@ #define spin_unlock_wait(lp) do { barrier(); } while(*(volatile unsigned char *)(&(lp)->lock)) extern void _do_spin_lock(spinlock_t *lock, char *str); -extern int _spin_trylock(spinlock_t *lock); +extern int _spin2_trylock(spinlock_t *lock); extern void _do_spin_unlock(spinlock_t *lock); -#define spin_trylock(lp) _spin_trylock(lp) +#define spin2_trylock(lp) _spin2_trylock(lp) #define spin_lock(lock) _do_spin_lock(lock, "spin_lock") #define spin_unlock(lock) _do_spin_unlock(lock) @@ -115,14 +115,14 @@ : "g2", "memory", "cc"); } -extern __inline__ int spin_trylock(spinlock_t *lock) +extern __inline__ int spin2_trylock(spinlock_t *lock) { unsigned int result; __asm__ __volatile__("ldstub [%1], %0" : "=r" (result) : "r" (lock) : "memory"); - return (result == 0); + return (result != 0); } extern __inline__ void spin_unlock(spinlock_t *lock) diff -Naur v2.4.0-test11-linux/include/asm-sparc64/spinlock.h linux/include/asm-sparc64/spinlock.h --- v2.4.0-test11-linux/include/asm-sparc64/spinlock.h Thu Sep 21 19:54:16 2000 +++ linux/include/asm-sparc64/spinlock.h Tue Nov 28 00:29:10 2000 @@ -55,7 +55,7 @@ : "g7", "memory"); } -extern __inline__ int spin_trylock(spinlock_t *lock) +extern __inline__ int spin2_trylock(spinlock_t *lock) { unsigned int result; __asm__ __volatile__("ldstub [%1], %0\n\t" @@ -63,7 +63,7 @@ : "=r" (result) : "r" (lock) : "memory"); - return (result == 0); + return (result != 0); } extern __inline__ void spin_unlock(spinlock_t *lock) @@ -95,9 +95,9 @@ extern void _do_spin_lock (spinlock_t *lock, char *str); extern void _do_spin_unlock (spinlock_t *lock); -extern int _spin_trylock (spinlock_t *lock); +extern int _spin2_trylock (spinlock_t *lock); -#define spin_trylock(lp) _spin_trylock(lp) +#define spin2_trylock(lp) _spin2_trylock(lp) #define spin_lock(lock) _do_spin_lock(lock, "spin_lock") #define spin_unlock(lock) _do_spin_unlock(lock) diff -Naur v2.4.0-test11-linux/include/linux/spinlock.h linux/include/linux/spinlock.h --- v2.4.0-test11-linux/include/linux/spinlock.h Thu Sep 21 19:53:48 2000 +++ linux/include/linux/spinlock.h Tue Nov 28 01:07:34 2000 @@ -58,7 +58,7 @@ #define spin_lock_init(lock) do { } while(0) #define spin_lock(lock) (void)(lock) /* Not "unused variable". */ #define spin_is_locked(lock) (0) -#define spin_trylock(lock) ({1; }) +#define spin2_trylock(lock) ({0; }) /* Note: returns 0 on success */ #define spin_unlock_wait(lock) do { } while(0) #define spin_unlock(lock) do { } while(0) @@ -71,7 +71,9 @@ #define spin_lock_init(x) do { (x)->lock = 0; } while (0) #define spin_is_locked(lock) (test_bit(0,(lock))) -#define spin_trylock(lock) (!test_and_set_bit(0,(lock))) +#define spin2_trylock(lock) (test_and_set_bit(0,(lock))) /* Note: + returns 0 on + success */ #define spin_lock(x) do { (x)->lock = 1; } while (0) #define spin_unlock_wait(x) do { } while (0) @@ -90,7 +92,8 @@ #define spin_lock_init(x) do { (x)->lock = 0; } while (0) #define spin_is_locked(lock) (test_bit(0,(lock))) -#define spin_trylock(lock) (!test_and_set_bit(0,(lock))) +#define spin2_trylock(lock) (test_and_set_bit(0,(lock))) /* Note: returns + 0 on success */ #define spin_lock(x) do {unsigned long __spinflags; save_flags(__spinflags); cli(); if ((x)->lock&&(x)->babble) {printk("%s:%d: spin_lock(%s:%p) already locked\n", __BASE_FILE__,__LINE__, (x)->module, (x));(x)->babble--;} (x)->lock = 1; restore_flags(__spinflags);} while (0) #define spin_unlock_wait(x) do {unsigned long __spinflags; save_flags(__spinflags); cli(); if ((x)->lock&&(x)->babble) {printk("%s:%d: spin_unlock_wait(%s:%p) deadlock\n", __BASE_FILE__,__LINE__, (x)->module, (x));(x)->babble--;} restore_flags(__spinflags);} while (0) diff -Naur v2.4.0-test11-linux/kernel/softirq.c linux/kernel/softirq.c --- v2.4.0-test11-linux/kernel/softirq.c Fri Oct 13 00:58:09 2000 +++ linux/kernel/softirq.c Tue Nov 28 00:12:31 2000 @@ -246,7 +246,7 @@ { int cpu = smp_processor_id(); - if (!spin_trylock(&global_bh_lock)) + if (spin2_trylock(&global_bh_lock)) goto resched; if (!hardirq_trylock(cpu)) diff -Naur v2.4.0-test11-linux/net/core/dev.c linux/net/core/dev.c --- v2.4.0-test11-linux/net/core/dev.c Mon Nov 27 21:06:32 2000 +++ linux/net/core/dev.c Tue Nov 28 00:32:08 2000 @@ -1251,7 +1251,7 @@ smp_mb__before_clear_bit(); clear_bit(__LINK_STATE_SCHED, &dev->state); - if (spin_trylock(&dev->queue_lock)) { + if (!spin2_trylock(&dev->queue_lock)) { qdisc_run(dev); spin_unlock(&dev->queue_lock); } else { diff -Naur v2.4.0-test11-linux/net/core/dst.c linux/net/core/dst.c --- v2.4.0-test11-linux/net/core/dst.c Wed May 3 01:48:16 2000 +++ linux/net/core/dst.c Tue Nov 28 00:32:18 2000 @@ -45,7 +45,7 @@ int delayed = 0; struct dst_entry * dst, **dstp; - if (!spin_trylock(&dst_lock)) { + if (spin2_trylock(&dst_lock)) { mod_timer(&dst_gc_timer, jiffies + HZ/10); return; } diff -Naur v2.4.0-test11-linux/net/ipv4/icmp.c linux/net/ipv4/icmp.c --- v2.4.0-test11-linux/net/ipv4/icmp.c Thu Sep 21 19:53:51 2000 +++ linux/net/ipv4/icmp.c Tue Nov 28 00:32:24 2000 @@ -349,7 +349,7 @@ static int icmp_xmit_lock_bh(void) { - if (!spin_trylock(&icmp_socket->sk->lock.slock)) { + if (spin2_trylock(&icmp_socket->sk->lock.slock)) { if (icmp_xmit_holder == smp_processor_id()) return -EAGAIN; spin_lock(&icmp_socket->sk->lock.slock); diff -Naur v2.4.0-test11-linux/net/ipv4/ipmr.c linux/net/ipv4/ipmr.c --- v2.4.0-test11-linux/net/ipv4/ipmr.c Thu Sep 21 19:53:51 2000 +++ linux/net/ipv4/ipmr.c Tue Nov 28 00:32:31 2000 @@ -319,7 +319,7 @@ unsigned long expires; struct mfc_cache *c, **cp; - if (!spin_trylock(&mfc_unres_lock)) { + if (spin2_trylock(&mfc_unres_lock)) { mod_timer(&ipmr_expire_timer, jiffies+HZ/10); return; } diff -Naur v2.4.0-test11-linux/net/ipv6/icmp.c linux/net/ipv6/icmp.c --- v2.4.0-test11-linux/net/ipv6/icmp.c Mon Mar 27 20:35:57 2000 +++ linux/net/ipv6/icmp.c Tue Nov 28 00:32:37 2000 @@ -92,7 +92,7 @@ static int icmpv6_xmit_lock_bh(void) { - if (!spin_trylock(&icmpv6_socket->sk->lock.slock)) { + if (spin2_trylock(&icmpv6_socket->sk->lock.slock)) { if (icmpv6_xmit_holder == smp_processor_id()) return -EAGAIN; spin_lock(&icmpv6_socket->sk->lock.slock); diff -Naur v2.4.0-test11-linux/net/ipv6/ip6_fib.c linux/net/ipv6/ip6_fib.c --- v2.4.0-test11-linux/net/ipv6/ip6_fib.c Fri Oct 13 00:58:10 2000 +++ linux/net/ipv6/ip6_fib.c Tue Nov 28 00:32:43 2000 @@ -1174,7 +1174,7 @@ gc_args.timeout = (int)dummy; } else { local_bh_disable(); - if (!spin_trylock(&fib6_gc_lock)) { + if (spin2_trylock(&fib6_gc_lock)) { mod_timer(&ip6_fib_timer, jiffies + HZ); local_bh_enable(); return; diff -Naur v2.4.0-test11-linux/net/sched/sch_generic.c linux/net/sched/sch_generic.c --- v2.4.0-test11-linux/net/sched/sch_generic.c Thu Sep 21 19:54:19 2000 +++ linux/net/sched/sch_generic.c Tue Nov 28 00:32:51 2000 @@ -81,7 +81,7 @@ /* Dequeue packet */ if ((skb = q->dequeue(q)) != NULL) { - if (spin_trylock(&dev->xmit_lock)) { + if (!spin2_trylock(&dev->xmit_lock)) { /* Remember that the driver is grabbed by us. */ dev->xmit_lock_owner = smp_processor_id(); diff -Naur v2.4.0-test11-linux/net/sched/sch_teql.c linux/net/sched/sch_teql.c --- v2.4.0-test11-linux/net/sched/sch_teql.c Fri Jul 28 23:45:29 2000 +++ linux/net/sched/sch_teql.c Tue Nov 28 00:32:59 2000 @@ -302,7 +302,7 @@ switch (teql_resolve(skb, skb_res, slave)) { case 0: - if (spin_trylock(&slave->xmit_lock)) { + if (!spin2_trylock(&slave->xmit_lock)) { slave->xmit_lock_owner = smp_processor_id(); if (!netif_queue_stopped(slave) && slave->hard_start_xmit(skb, slave) == 0) {