misc: Fix allocation 'borrowed' by vhost_net
[safe/jmp/linux-2.6] / include / linux / smp_lock.h
index b63ce70..2ea1dd1 100644 (file)
@@ -1,11 +1,8 @@
 #ifndef __LINUX_SMPLOCK_H
 #define __LINUX_SMPLOCK_H
 
-#include <linux/config.h>
-#include <linux/sched.h>
-#include <linux/spinlock.h>
-
 #ifdef CONFIG_LOCK_KERNEL
+#include <linux/sched.h>
 
 #define kernel_locked()                (current->lock_depth >= 0)
 
@@ -20,33 +17,47 @@ extern void __lockfunc __release_kernel_lock(void);
                __release_kernel_lock();        \
 } while (0)
 
-/*
- * Non-SMP kernels will never block on the kernel lock,
- * so we are better off returning a constant zero from
- * reacquire_kernel_lock() so that the compiler can see
- * it at compile-time.
- */
-#if defined(CONFIG_SMP) && !defined(CONFIG_PREEMPT_BKL)
-# define return_value_on_smp return
-#else
-# define return_value_on_smp
-#endif
-
 static inline int reacquire_kernel_lock(struct task_struct *task)
 {
        if (unlikely(task->lock_depth >= 0))
-               return_value_on_smp __reacquire_kernel_lock();
+               return __reacquire_kernel_lock();
        return 0;
 }
 
-extern void __lockfunc lock_kernel(void)       __acquires(kernel_lock);
-extern void __lockfunc unlock_kernel(void)     __releases(kernel_lock);
+extern void __lockfunc
+_lock_kernel(const char *func, const char *file, int line)
+__acquires(kernel_lock);
+
+extern void __lockfunc
+_unlock_kernel(const char *func, const char *file, int line)
+__releases(kernel_lock);
+
+#define lock_kernel() do {                                     \
+       _lock_kernel(__func__, __FILE__, __LINE__);             \
+} while (0)
+
+#define unlock_kernel()        do {                                    \
+       _unlock_kernel(__func__, __FILE__, __LINE__);           \
+} while (0)
+
+/*
+ * 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();
+}
 
 #else
 
-#define lock_kernel()                          do { } while(0)
-#define unlock_kernel()                                do { } while(0)
+#define lock_kernel()
+#define unlock_kernel()
 #define release_kernel_lock(task)              do { } while(0)
+#define cycle_kernel_lock()                    do { } while(0)
 #define reacquire_kernel_lock(task)            0
 #define kernel_locked()                                1