This source file includes following definitions.
- prim_spin_lock
- prim_spin_unlock
- prim_spin_lock_nb
- spinlock
- spinunlock
- spintestlock
- spintestunlock
1
2
3
4
5
6
7
8
9
10
11
12
13 extern __inline__ void prim_spin_lock(struct spinlock *sp)
14 {
15 int processor=smp_processor_id();
16
17
18
19
20
21 while(lock_set_bit(0,&sp->lock))
22 {
23
24
25
26
27 if(sp->cpu==processor)
28 {
29 sp->users++;
30 return 0;
31 }
32
33
34
35 while(sp->lock)
36 {
37
38
39
40
41 if(smp_invalidate_needed&(1<<processor));
42 while(lock_clear_bit(processor,&smp_invalidate_needed))
43 local_invalidate();
44 sp->spins++;
45 }
46
47
48
49
50 }
51 sp->users++;sp->cpu=processor;
52 return 1;
53 }
54
55
56
57
58
59 extern __inline__ int prim_spin_unlock(struct spinlock *sp)
60 {
61
62
63 if(!--sp->users)
64 {
65 lock_clear_bit(0,&sp->lock);sp->cpu= NO_PROC_ID;
66 return 1;
67 }
68 return 0;
69 }
70
71
72
73
74
75
76 extern __inline__ int prim_spin_lock_nb(struct spinlock *sp)
77 {
78 if(lock_set_bit(0,&sp->lock))
79 return 0;
80 sp->users++;
81 return 1;
82 }
83
84
85
86
87
88
89 extern __inline__ void spinlock(struct spinlock *sp)
90 {
91 if(sp->priority<current->lock_order)
92 panic("lock order violation: %s (%d)\n", sp->name, current->lock_order);
93 if(prim_spin_lock(sp))
94 {
95
96
97
98 sp->oldpri=current->lock_order;
99 current->lock_order=sp->priority;
100 }
101 }
102
103 extern __inline__ void spinunlock(struct spinlock *sp)
104 {
105 if(current->lock_order!=sp->priority)
106 panic("lock release order violation %s (%d)\n", sp->name, current->lock_order);
107 if(prim_spin_unlock(sp))
108 {
109
110
111
112
113 current->lock_order=sp->oldpri;
114 }
115 }
116
117 extern __inline__ void spintestlock(struct spinlock *sp)
118 {
119
120
121
122
123 prim_spin_lock_nb(sp);
124 }
125
126 extern __inline__ void spintestunlock(struct spinlock *sp)
127 {
128
129
130
131
132 prim_spin_unlock(sp);
133 }