smp_lock.h 1.7 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3
#ifndef __LINUX_SMPLOCK_H
#define __LINUX_SMPLOCK_H

A
Al Viro 已提交
4
#ifdef CONFIG_LOCK_KERNEL
L
Linus Torvalds 已提交
5
#include <linux/sched.h>
6
#include <trace/events/bkl.h>
L
Linus Torvalds 已提交
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

#define kernel_locked()		(current->lock_depth >= 0)

extern int __lockfunc __reacquire_kernel_lock(void);
extern void __lockfunc __release_kernel_lock(void);

/*
 * Release/re-acquire global kernel lock for the scheduler
 */
#define release_kernel_lock(tsk) do { 		\
	if (unlikely((tsk)->lock_depth >= 0))	\
		__release_kernel_lock();	\
} while (0)

static inline int reacquire_kernel_lock(struct task_struct *task)
{
	if (unlikely(task->lock_depth >= 0))
24
		return __reacquire_kernel_lock();
L
Linus Torvalds 已提交
25 26 27
	return 0;
}

28 29 30 31 32 33 34 35 36 37 38 39
extern void __lockfunc _lock_kernel(void)	__acquires(kernel_lock);
extern void __lockfunc _unlock_kernel(void)	__releases(kernel_lock);

#define lock_kernel()	{					\
	trace_lock_kernel(__func__, __FILE__, __LINE__);	\
	_lock_kernel();						\
}

#define unlock_kernel()	{					\
	trace_unlock_kernel(__func__, __FILE__, __LINE__);	\
	_unlock_kernel();					\
}
L
Linus Torvalds 已提交
40

J
Jonathan Corbet 已提交
41 42 43 44 45 46 47 48 49 50 51 52
/*
 * Various legacy drivers don't really need the BKL in a specific
 * function, but they *do* need to know that the BKL became available.
 * This function just avoids wrapping a bunch of lock/unlock pairs
 * around code which doesn't really need it.
 */
static inline void cycle_kernel_lock(void)
{
	lock_kernel();
	unlock_kernel();
}

L
Linus Torvalds 已提交
53 54
#else

55 56
#define lock_kernel()	   trace_lock_kernel(__func__, __FILE__, __LINE__);
#define unlock_kernel()    trace_unlock_kernel(__func__, __FILE__, __LINE__);
L
Linus Torvalds 已提交
57
#define release_kernel_lock(task)		do { } while(0)
J
Jonathan Corbet 已提交
58
#define cycle_kernel_lock()			do { } while(0)
L
Linus Torvalds 已提交
59 60 61 62 63
#define reacquire_kernel_lock(task)		0
#define kernel_locked()				1

#endif /* CONFIG_LOCK_KERNEL */
#endif /* __LINUX_SMPLOCK_H */