/* Slow paths of read/write spinlocks. */ #include <linux/linkage.h> #include <asm/rwlock.h> #include <asm/alternative-asm.h> #include <asm/dwarf2.h> /* rdi: pointer to rwlock_t */ ENTRY(__write_lock_failed) CFI_STARTPROC LOCK_PREFIX addl $RW_LOCK_BIAS,(%rdi) 1: rep nop cmpl $RW_LOCK_BIAS,(%rdi) jne 1b LOCK_PREFIX subl $RW_LOCK_BIAS,(%rdi) jnz __write_lock_failed ret CFI_ENDPROC END(__write_lock_failed) /* rdi: pointer to rwlock_t */ ENTRY(__read_lock_failed) CFI_STARTPROC LOCK_PREFIX incl (%rdi) 1: rep nop cmpl $1,(%rdi) js 1b LOCK_PREFIX decl (%rdi) js __read_lock_failed ret CFI_ENDPROC END(__read_lock_failed)