Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
kernel
rwsem.c
Go to the documentation of this file.
1
/* kernel/rwsem.c: R/W semaphores, public implementation
2
*
3
* Written by David Howells (
[email protected]
).
4
* Derived from asm-i386/semaphore.h
5
*/
6
7
#include <linux/types.h>
8
#include <linux/kernel.h>
9
#include <linux/sched.h>
10
#include <linux/export.h>
11
#include <
linux/rwsem.h
>
12
13
#include <
linux/atomic.h
>
14
15
/*
16
* lock for reading
17
*/
18
void
__sched
down_read
(
struct
rw_semaphore
*
sem
)
19
{
20
might_sleep
();
21
rwsem_acquire_read
(&sem->dep_map, 0, 0,
_RET_IP_
);
22
23
LOCK_CONTENDED
(sem,
__down_read_trylock
,
__down_read
);
24
}
25
26
EXPORT_SYMBOL
(
down_read
);
27
28
/*
29
* trylock for reading -- returns 1 if successful, 0 if contention
30
*/
31
int
down_read_trylock
(
struct
rw_semaphore
*
sem
)
32
{
33
int
ret
=
__down_read_trylock
(sem);
34
35
if
(ret == 1)
36
rwsem_acquire_read
(&sem->dep_map, 0, 1,
_RET_IP_
);
37
return
ret
;
38
}
39
40
EXPORT_SYMBOL
(
down_read_trylock
);
41
42
/*
43
* lock for writing
44
*/
45
void
__sched
down_write
(
struct
rw_semaphore
*
sem
)
46
{
47
might_sleep
();
48
rwsem_acquire
(&sem->dep_map, 0, 0,
_RET_IP_
);
49
50
LOCK_CONTENDED
(sem,
__down_write_trylock
,
__down_write
);
51
}
52
53
EXPORT_SYMBOL
(
down_write
);
54
55
/*
56
* trylock for writing -- returns 1 if successful, 0 if contention
57
*/
58
int
down_write_trylock
(
struct
rw_semaphore
*
sem
)
59
{
60
int
ret
=
__down_write_trylock
(sem);
61
62
if
(ret == 1)
63
rwsem_acquire
(&sem->dep_map, 0, 1,
_RET_IP_
);
64
return
ret
;
65
}
66
67
EXPORT_SYMBOL
(
down_write_trylock
);
68
69
/*
70
* release a read lock
71
*/
72
void
up_read
(
struct
rw_semaphore
*
sem
)
73
{
74
rwsem_release
(&sem->dep_map, 1,
_RET_IP_
);
75
76
__up_read
(sem);
77
}
78
79
EXPORT_SYMBOL
(
up_read
);
80
81
/*
82
* release a write lock
83
*/
84
void
up_write
(
struct
rw_semaphore
*
sem
)
85
{
86
rwsem_release
(&sem->dep_map, 1,
_RET_IP_
);
87
88
__up_write
(sem);
89
}
90
91
EXPORT_SYMBOL
(
up_write
);
92
93
/*
94
* downgrade write lock to read lock
95
*/
96
void
downgrade_write
(
struct
rw_semaphore
*
sem
)
97
{
98
/*
99
* lockdep: a downgraded write will live on as a write
100
* dependency.
101
*/
102
__downgrade_write
(sem);
103
}
104
105
EXPORT_SYMBOL
(
downgrade_write
);
106
107
#ifdef CONFIG_DEBUG_LOCK_ALLOC
108
109
void
down_read_nested
(
struct
rw_semaphore
*
sem
,
int
subclass
)
110
{
111
might_sleep
();
112
rwsem_acquire_read
(&sem->dep_map, subclass, 0,
_RET_IP_
);
113
114
LOCK_CONTENDED
(sem,
__down_read_trylock
,
__down_read
);
115
}
116
117
EXPORT_SYMBOL
(
down_read_nested
);
118
119
void
down_write_nested
(
struct
rw_semaphore
*
sem
,
int
subclass
)
120
{
121
might_sleep
();
122
rwsem_acquire
(&sem->dep_map, subclass, 0,
_RET_IP_
);
123
124
LOCK_CONTENDED
(sem,
__down_write_trylock
,
__down_write
);
125
}
126
127
EXPORT_SYMBOL
(
down_write_nested
);
128
129
#endif
130
131
Generated on Thu Jan 10 2013 14:54:55 for Linux Kernel by
1.8.2