/include/linux/smp_lock.h
C++ Header | 65 lines | 43 code | 13 blank | 9 comment | 5 complexity | af723df5c24229eafb5250e4e7508881 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.0, AGPL-1.0
1#ifndef __LINUX_SMPLOCK_H 2#define __LINUX_SMPLOCK_H 3 4#ifdef CONFIG_LOCK_KERNEL 5#include <linux/sched.h> 6 7#define kernel_locked() (current->lock_depth >= 0) 8 9extern int __lockfunc __reacquire_kernel_lock(void); 10extern void __lockfunc __release_kernel_lock(void); 11 12/* 13 * Release/re-acquire global kernel lock for the scheduler 14 */ 15#define release_kernel_lock(tsk) do { \ 16 if (unlikely((tsk)->lock_depth >= 0)) \ 17 __release_kernel_lock(); \ 18} while (0) 19 20static inline int reacquire_kernel_lock(struct task_struct *task) 21{ 22 if (unlikely(task->lock_depth >= 0)) 23 return __reacquire_kernel_lock(); 24 return 0; 25} 26 27extern void __lockfunc 28_lock_kernel(const char *func, const char *file, int line) 29__acquires(kernel_lock); 30 31extern void __lockfunc 32_unlock_kernel(const char *func, const char *file, int line) 33__releases(kernel_lock); 34 35#define lock_kernel() do { \ 36 _lock_kernel(__func__, __FILE__, __LINE__); \ 37} while (0) 38 39#define unlock_kernel() do { \ 40 _unlock_kernel(__func__, __FILE__, __LINE__); \ 41} while (0) 42 43/* 44 * Various legacy drivers don't really need the BKL in a specific 45 * function, but they *do* need to know that the BKL became available. 46 * This function just avoids wrapping a bunch of lock/unlock pairs 47 * around code which doesn't really need it. 48 */ 49static inline void cycle_kernel_lock(void) 50{ 51 lock_kernel(); 52 unlock_kernel(); 53} 54 55#else 56 57#define lock_kernel() 58#define unlock_kernel() 59#define release_kernel_lock(task) do { } while(0) 60#define cycle_kernel_lock() do { } while(0) 61#define reacquire_kernel_lock(task) 0 62#define kernel_locked() 1 63 64#endif /* CONFIG_LOCK_KERNEL */ 65#endif /* __LINUX_SMPLOCK_H */