diff options
author | Jake Freeland <jfree@FreeBSD.org> | 2022-09-20 17:35:19 +0000 |
---|---|---|
committer | Emmanuel Vadot <manu@FreeBSD.org> | 2022-11-29 10:09:31 +0000 |
commit | f16383d44d4e3dc0c71d292279eadcaf6f312923 (patch) | |
tree | e9de36314ad60cf47a080bc5e9ce02159d01f955 | |
parent | 46c09d766d265a886a7fd11ee5dd88bb17e9a0af (diff) | |
download | src-f16383d44d4e3dc0c71d292279eadcaf6f312923.tar.gz src-f16383d44d4e3dc0c71d292279eadcaf6f312923.zip |
linuxkpi: Add down_read_killable()
Reviewed by: hselasky
Differential Revision: https://reviews.freebsd.org/D36528
Sponsored by: Google, Inc. (GSoC 2022)
(cherry picked from commit f0b0f28f35e79d8777f4ba89d5065d3665b43866)
-rw-r--r-- | sys/compat/linuxkpi/common/include/linux/rwsem.h | 2 | ||||
-rw-r--r-- | sys/compat/linuxkpi/common/src/linux_lock.c | 13 |
2 files changed, 15 insertions, 0 deletions
diff --git a/sys/compat/linuxkpi/common/include/linux/rwsem.h b/sys/compat/linuxkpi/common/include/linux/rwsem.h index fc3580bc186e..a08668ed6e1e 100644 --- a/sys/compat/linuxkpi/common/include/linux/rwsem.h +++ b/sys/compat/linuxkpi/common/include/linux/rwsem.h @@ -46,6 +46,7 @@ struct rw_semaphore { #define down_read(_rw) sx_slock(&(_rw)->sx) #define up_read(_rw) sx_sunlock(&(_rw)->sx) #define down_read_trylock(_rw) !!sx_try_slock(&(_rw)->sx) +#define down_read_killable(_rw) linux_down_read_killable(_rw) #define down_write_trylock(_rw) !!sx_try_xlock(&(_rw)->sx) #define down_write_killable(_rw) linux_down_write_killable(_rw) #define downgrade_write(_rw) sx_downgrade(&(_rw)->sx) @@ -80,6 +81,7 @@ linux_init_rwsem(struct rw_semaphore *rw, const char *name) sx_init_flags(&rw->sx, name, SX_NOWITNESS); } +extern int linux_down_read_killable(struct rw_semaphore *); extern int linux_down_write_killable(struct rw_semaphore *); #endif /* _LINUXKPI_LINUX_RWSEM_H_ */ diff --git a/sys/compat/linuxkpi/common/src/linux_lock.c b/sys/compat/linuxkpi/common/src/linux_lock.c index b04a7738d036..0e9a2fecaf7d 100644 --- a/sys/compat/linuxkpi/common/src/linux_lock.c +++ b/sys/compat/linuxkpi/common/src/linux_lock.c @@ -160,6 +160,19 @@ linux_mutex_lock_interruptible(mutex_t *m) } int +linux_down_read_killable(struct rw_semaphore *rw) +{ + int error; + + error = -sx_slock_sig(&rw->sx); + if (error != 0) { + linux_schedule_save_interrupt_value(current, error); + error = -EINTR; + } + return (error); +} + +int linux_down_write_killable(struct rw_semaphore *rw) { int error; |