[Devel] [PATCH RH7 4/6] locking/arch, x86: Add __down_read_killable()
Kirill Tkhai
ktkhai at virtuozzo.com
Fri May 22 20:03:08 MSK 2020
ms commit 19c60923010b
Similar to __down_write_killable(), add read killable primitive:
extract current __down_read() code to macros and teach it to get
different functions as slow_path argument:
store ax register to ret, and add sp register and preserve its value.
Add call_rwsem_down_read_failed_killable() assembly entry similar
to call_rwsem_down_read_failed():
push dx register to stack in additional to common registers,
as it's not declarated as modifiable in ____down_read().
Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz at infradead.org>
Cc: Linus Torvalds <torvalds at linux-foundation.org>
Cc: Peter Zijlstra <peterz at infradead.org>
Cc: Thomas Gleixner <tglx at linutronix.de>
Cc: arnd at arndb.de
Cc: avagin at virtuozzo.com
Cc: davem at davemloft.net
Cc: fenghua.yu at intel.com
Cc: gorcunov at virtuozzo.com
Cc: heiko.carstens at de.ibm.com
Cc: hpa at zytor.com
Cc: ink at jurassic.park.msu.ru
Cc: mattst88 at gmail.com
Cc: rientjes at google.com
Cc: rth at twiddle.net
Cc: schwidefsky at de.ibm.com
Cc: tony.luck at intel.com
Cc: viro at zeniv.linux.org.uk
Link: http://lkml.kernel.org/r/150670118802.23930.1316107715255410256.stgit@localhost.localdomain
Signed-off-by: Ingo Molnar <mingo at kernel.org>
---
arch/x86/include/asm/rwsem.h | 35 +++++++++++++++++++++++++----------
arch/x86/lib/rwsem.S | 15 +++++++++++++++
2 files changed, 40 insertions(+), 10 deletions(-)
diff --git a/arch/x86/include/asm/rwsem.h b/arch/x86/include/asm/rwsem.h
index ce4cc4557649..26cdc9b147d5 100644
--- a/arch/x86/include/asm/rwsem.h
+++ b/arch/x86/include/asm/rwsem.h
@@ -60,18 +60,33 @@
/*
* lock for reading
*/
+#define ____down_read(sem, slow_path) \
+({ \
+ struct rw_semaphore* ret; \
+ asm volatile("# beginning down_read\n\t" \
+ LOCK_PREFIX _ASM_INC "(%[sem])\n\t" \
+ /* adds 0x00000001 */ \
+ " jns 1f\n" \
+ " call " slow_path "\n" \
+ "1:\n\t" \
+ "# ending down_read\n\t" \
+ : "+m" (sem->count), "=a" (ret), \
+ ASM_CALL_CONSTRAINT \
+ : [sem] "a" (sem) \
+ : "memory", "cc"); \
+ ret; \
+})
+
static inline void __down_read(struct rw_semaphore *sem)
{
- asm volatile("# beginning down_read\n\t"
- LOCK_PREFIX _ASM_INC "(%[sem])\n\t"
- /* adds 0x00000001 */
- " jns 1f\n"
- " call call_rwsem_down_read_failed\n"
- "1:\n\t"
- "# ending down_read\n\t"
- : "+m" (sem->count)
- : [sem] "a" (sem)
- : "memory", "cc");
+ ____down_read(sem, "call_rwsem_down_read_failed");
+}
+
+static inline int __down_read_killable(struct rw_semaphore *sem)
+{
+ if (IS_ERR(____down_read(sem, "call_rwsem_down_read_failed_killable")))
+ return -EINTR;
+ return 0;
}
/*
diff --git a/arch/x86/lib/rwsem.S b/arch/x86/lib/rwsem.S
index 880fcda587bf..39736f7a8284 100644
--- a/arch/x86/lib/rwsem.S
+++ b/arch/x86/lib/rwsem.S
@@ -101,6 +101,21 @@ ENTRY(call_rwsem_down_read_failed)
CFI_ENDPROC
ENDPROC(call_rwsem_down_read_failed)
+ENTRY(call_rwsem_down_read_failed_killable)
+ CFI_STARTPROC
+ FRAME_BEGIN
+ save_common_regs
+ __ASM_SIZE(push,_cfi) %__ASM_REG(dx)
+ movq %rax,%rdi
+ call rwsem_down_read_failed_killable
+ __ASM_SIZE(pop,_cfi) %__ASM_REG(dx)
+ CFI_RESTORE __ASM_REG(dx)
+ restore_common_regs
+ FRAME_END
+ ret
+ CFI_ENDPROC
+ENDPROC(call_rwsem_down_read_failed_killable)
+
ENTRY(call_rwsem_down_write_failed)
CFI_STARTPROC
FRAME_BEGIN
More information about the Devel
mailing list