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 10extern 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) \ 20do { \ 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) \ 31do { \ 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() \ 45do { \ 46 if (!++current->lock_depth) \ 47 spin_lock(&kernel_flag); \ 48} while(0) 49 50#define unlock_kernel() \ 51do { \ 52 if (--current->lock_depth < 0) \ 53 spin_unlock(&kernel_flag); \ 54} while(0) 55

