5113f6f70
김현기
kernel add
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
/*
* arch/alpha/lib/dec_and_lock.c
*
* ll/sc version of atomic_dec_and_lock()
*
*/
#include <linux/spinlock.h>
#include <linux/atomic.h>
asm (".text
\
.global _atomic_dec_and_lock
\
.ent _atomic_dec_and_lock
\
.align 4
\
_atomic_dec_and_lock:
\
.prologue 0
\
1: ldl_l $1, 0($16)
\
subl $1, 1, $1
\
beq $1, 2f
\
stl_c $1, 0($16)
\
beq $1, 4f
\
mb
\
clr $0
\
ret
\
2: br $29, 3f
\
3: ldgp $29, 0($29)
\
br $atomic_dec_and_lock_1..ng
\
.subsection 2
\
4: br 1b
\
.previous
\
.end _atomic_dec_and_lock");
static int __used atomic_dec_and_lock_1(atomic_t *atomic, spinlock_t *lock)
{
/* Slow path */
spin_lock(lock);
if (atomic_dec_and_test(atomic))
return 1;
spin_unlock(lock);
return 0;
}
|