- Linus: drop support for old-style Makefiles entirely. Big.
[davej-history.git] / include / asm-i386 / smplock.h
blobf6f29383b1136f7116943c73d1f671914f06b295
1 /*
2 * <asm/smplock.h>
4 * i386 SMP lock implementation
5 */
6 #include <linux/interrupt.h>
7 #include <linux/spinlock.h>
8 #include <linux/sched.h>
9 #include <asm/current.h>
11 extern spinlock_t kernel_flag;
13 #define kernel_locked() spin_is_locked(&kernel_flag)
16 * Release global kernel lock and global interrupt lock
18 #define release_kernel_lock(task, cpu) \
19 do { \
20 if (task->lock_depth >= 0) \
21 spin_unlock(&kernel_flag); \
22 release_irqlock(cpu); \
23 __sti(); \
24 } while (0)
27 * Re-acquire the kernel lock
29 #define reacquire_kernel_lock(task) \
30 do { \
31 if (task->lock_depth >= 0) \
32 spin_lock(&kernel_flag); \
33 } while (0)
37 * Getting the big kernel lock.
39 * This cannot happen asynchronously,
40 * so we only need to worry about other
41 * CPU's.
43 extern __inline__ void lock_kernel(void)
45 #if 1
46 if (!++current->lock_depth)
47 spin_lock(&kernel_flag);
48 #else
49 __asm__ __volatile__(
50 "incl %1\n\t"
51 "jne 9f"
52 spin_lock_string
53 "\n9:"
54 :"=m" (__dummy_lock(&kernel_flag)),
55 "=m" (current->lock_depth));
56 #endif
59 extern __inline__ void unlock_kernel(void)
61 if (current->lock_depth < 0)
62 BUG();
63 #if 1
64 if (--current->lock_depth < 0)
65 spin_unlock(&kernel_flag);
66 #else
67 __asm__ __volatile__(
68 "decl %1\n\t"
69 "jns 9f\n\t"
70 spin_unlock_string
71 "\n9:"
72 :"=m" (__dummy_lock(&kernel_flag)),
73 "=m" (current->lock_depth));
74 #endif