File tree Expand file tree Collapse file tree 3 files changed +27
-0
lines changed Expand file tree Collapse file tree 3 files changed +27
-0
lines changed Original file line number Diff line number Diff line change @@ -37,6 +37,16 @@ static inline void __down_read(struct rw_semaphore *sem)
37
37
rwsem_down_read_failed (sem );
38
38
}
39
39
40
+ static inline int __down_read_killable (struct rw_semaphore * sem )
41
+ {
42
+ if (unlikely (atomic_long_inc_return_acquire (& sem -> count ) <= 0 )) {
43
+ if (IS_ERR (rwsem_down_read_failed_killable (sem )))
44
+ return - EINTR ;
45
+ }
46
+
47
+ return 0 ;
48
+ }
49
+
40
50
static inline int __down_read_trylock (struct rw_semaphore * sem )
41
51
{
42
52
long tmp ;
Original file line number Diff line number Diff line change @@ -111,6 +111,7 @@ static inline int rwsem_is_contended(struct rw_semaphore *sem)
111
111
* lock for reading
112
112
*/
113
113
extern void down_read (struct rw_semaphore * sem );
114
+ extern int __must_check down_read_killable (struct rw_semaphore * sem );
114
115
115
116
/*
116
117
* trylock for reading -- returns 1 if successful, 0 if contention
Original file line number Diff line number Diff line change @@ -28,6 +28,22 @@ void __sched down_read(struct rw_semaphore *sem)
28
28
29
29
EXPORT_SYMBOL (down_read );
30
30
31
+ int __sched down_read_killable (struct rw_semaphore * sem )
32
+ {
33
+ might_sleep ();
34
+ rwsem_acquire_read (& sem -> dep_map , 0 , 0 , _RET_IP_ );
35
+
36
+ if (LOCK_CONTENDED_RETURN (sem , __down_read_trylock , __down_read_killable )) {
37
+ rwsem_release (& sem -> dep_map , 1 , _RET_IP_ );
38
+ return - EINTR ;
39
+ }
40
+
41
+ rwsem_set_reader_owned (sem );
42
+ return 0 ;
43
+ }
44
+
45
+ EXPORT_SYMBOL (down_read_killable );
46
+
31
47
/*
32
48
* trylock for reading -- returns 1 if successful, 0 if contention
33
49
*/
You can’t perform that action at this time.
0 commit comments