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 @@ -38,6 +38,16 @@ static inline void __down_read(struct rw_semaphore *sem)
38
38
rwsem_down_read_failed (sem );
39
39
}
40
40
41
+ static inline int __down_read_killable (struct rw_semaphore * sem )
42
+ {
43
+ if (unlikely (atomic_long_inc_return_acquire (& sem -> count ) <= 0 )) {
44
+ if (IS_ERR (rwsem_down_read_failed_killable (sem )))
45
+ return - EINTR ;
46
+ }
47
+
48
+ return 0 ;
49
+ }
50
+
41
51
static inline int __down_read_trylock (struct rw_semaphore * sem )
42
52
{
43
53
long tmp ;
Original file line number Diff line number Diff line change @@ -118,6 +118,7 @@ static inline int rwsem_is_contended(struct rw_semaphore *sem)
118
118
* lock for reading
119
119
*/
120
120
extern void down_read (struct rw_semaphore * sem );
121
+ extern int __must_check down_read_killable (struct rw_semaphore * sem );
121
122
122
123
/*
123
124
* trylock for reading -- returns 1 if successful, 0 if contention
Original file line number Diff line number Diff line change @@ -29,6 +29,22 @@ void __sched down_read(struct rw_semaphore *sem)
29
29
30
30
EXPORT_SYMBOL (down_read );
31
31
32
+ int __sched down_read_killable (struct rw_semaphore * sem )
33
+ {
34
+ might_sleep ();
35
+ rwsem_acquire_read (& sem -> dep_map , 0 , 0 , _RET_IP_ );
36
+
37
+ if (LOCK_CONTENDED_RETURN (sem , __down_read_trylock , __down_read_killable )) {
38
+ rwsem_release (& sem -> dep_map , 1 , _RET_IP_ );
39
+ return - EINTR ;
40
+ }
41
+
42
+ rwsem_set_reader_owned (sem );
43
+ return 0 ;
44
+ }
45
+
46
+ EXPORT_SYMBOL (down_read_killable );
47
+
32
48
/*
33
49
* trylock for reading -- returns 1 if successful, 0 if contention
34
50
*/
You can’t perform that action at this time.
0 commit comments