--- zzzz-none-000/linux-2.4.17/include/asm-i386/smplock.h 2001-11-22 19:46:20.000000000 +0000 +++ sangam-fb-322/linux-2.4.17/include/asm-i386/smplock.h 2004-11-24 13:21:55.000000000 +0000 @@ -9,8 +9,26 @@ #include extern spinlock_t kernel_flag; +#ifdef CONFIG_PREEMPT_TIMES +#define lock_bkl() do { \ + current->preempt_count++; \ + preempt_lock_start(3); \ + _raw_spin_lock(&kernel_flag); \ +} while (0) +#else +#define lock_bkl() spin_lock(&kernel_flag) +#endif +#define unlock_bkl() spin_unlock(&kernel_flag) +#ifdef CONFIG_SMP #define kernel_locked() spin_is_locked(&kernel_flag) +#else +#ifdef CONFIG_PREEMPT +#define kernel_locked() preempt_is_disabled() +#else +#define kernel_locked() 1 +#endif +#endif /* * Release global kernel lock and global interrupt lock @@ -32,7 +50,18 @@ spin_lock(&kernel_flag); \ } while (0) - +#ifdef CONFIG_PREEMPT_TIMES +#define lock_kernel() do { \ + if (current->lock_depth == -1) \ + lock_bkl(); \ + ++current->lock_depth; \ +} while (0) + +#define unlock_kernel() do { \ + if (--current->lock_depth < 0) \ + unlock_bkl(); \ +} while (0) +#else /* * Getting the big kernel lock. * @@ -42,6 +71,11 @@ */ static __inline__ void lock_kernel(void) { +#ifdef CONFIG_PREEMPT + if (current->lock_depth == -1) + spin_lock(&kernel_flag); + ++current->lock_depth; +#else #if 1 if (!++current->lock_depth) spin_lock(&kernel_flag); @@ -54,6 +88,7 @@ :"=m" (__dummy_lock(&kernel_flag)), "=m" (current->lock_depth)); #endif +#endif } static __inline__ void unlock_kernel(void) @@ -73,3 +108,4 @@ "=m" (current->lock_depth)); #endif } +#endif /* CONFIG_PREEMPT_TIMES */