1 /* 2 * <asm/smplock.h> 3 * 4 * Default SMP lock implementation 5 */ 6 #include <linux/sched.h> 7 #include <linux/interrupt.h> 8 #include <linux/spinlock.h> 9 10 extern spinlock_t kernel_flag; 11 12 #define kernel_locked() \ 13 (spin_is_locked(&kernel_flag) &&\ 14 (current->lock_depth >= 0)) 15 16 /* 17 * Release global kernel lock and global interrupt lock 18 */ 19 #define release_kernel_lock(task, cpu) \ 20 do { \ 21 if (task->lock_depth >= 0) \ 22 spin_unlock(&kernel_flag); \ 23 release_irqlock(cpu); \ 24 __sti(); \ 25 } while (0) 26 27 /* 28 * Re-acquire the kernel lock 29 */ 30 #define reacquire_kernel_lock(task) \ 31 do { \ 32 if (task->lock_depth >= 0) \ 33 spin_lock(&kernel_flag); \ 34 } while (0) 35 36 37 /* 38 * Getting the big kernel lock. 39 * 40 * This cannot happen asynchronously, 41 * so we only need to worry about other 42 * CPU's. 43 */ 44 #define lock_kernel() \ 45 do { \ 46 if (!++current->lock_depth) \ 47 spin_lock(&kernel_flag); \ 48 } while(0) 49 50 #define unlock_kernel() \ 51 do { \ 52 if (--current->lock_depth < 0) \ 53 spin_unlock(&kernel_flag); \ 54 } while(0) 55