From: Heiko Carstens Date: Mon, 13 Jan 2025 12:37:00 +0000 (+0100) Subject: s390/uaccess: Use asm goto for __mvc_kernel_nofault() X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=c7474da9fef537c0fc89cef552897116456a2e41;p=users%2Fwilly%2Flinux.git s390/uaccess: Use asm goto for __mvc_kernel_nofault() Use asm goto for __mvc_kernel_nofault() if available. This generates slightly better code, since the error checking happens implicitly with the goto (aka exception) and the good path comes without any checks and branches. Acked-by: Alexander Gordeev Signed-off-by: Heiko Carstens Signed-off-by: Alexander Gordeev --- diff --git a/arch/s390/include/asm/uaccess.h b/arch/s390/include/asm/uaccess.h index d598cdcaa9fa..b96bda0f1275 100644 --- a/arch/s390/include/asm/uaccess.h +++ b/arch/s390/include/asm/uaccess.h @@ -343,29 +343,25 @@ static inline void *s390_kernel_write(void *dst, const void *src, size_t size) void __noreturn __mvc_kernel_nofault_bad(void); -#ifdef CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS +#if defined(CONFIG_CC_HAS_ASM_GOTO_OUTPUT) && defined(CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS) #define __mvc_kernel_nofault(dst, src, type, err_label) \ do { \ - int __rc; \ - \ switch (sizeof(type)) { \ case 1: \ case 2: \ case 4: \ case 8: \ - asm_inline volatile( \ + asm goto( \ "0: mvc %O[_dst](%[_len],%R[_dst]),%[_src]\n" \ - "1: lhi %[_rc],0\n" \ - "2:\n" \ - EX_TABLE_UA_FAULT(0b, 2b, %[_rc]) \ - EX_TABLE_UA_FAULT(1b, 2b, %[_rc]) \ - : [_rc] "=d" (__rc), \ - [_dst] "=Q" (*(type *)dst) \ + "1: nopr %%r7\n" \ + EX_TABLE(0b, %l[err_label]) \ + EX_TABLE(1b, %l[err_label]) \ + : [_dst] "=Q" (*(type *)dst) \ : [_src] "Q" (*(type *)(src)), \ - [_len] "I" (sizeof(type))); \ - if (__rc) \ - goto err_label; \ + [_len] "I" (sizeof(type)) \ + : \ + : err_label); \ break; \ default: \ __mvc_kernel_nofault_bad(); \ @@ -373,7 +369,7 @@ do { \ } \ } while (0) -#else /* CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS */ +#else /* CONFIG_CC_HAS_ASM_GOTO_OUTPUT) && CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS */ #define __mvc_kernel_nofault(dst, src, type, err_label) \ do { \ @@ -405,7 +401,7 @@ do { \ } \ } while (0) -#endif /* CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS */ +#endif /* CONFIG_CC_HAS_ASM_GOTO_OUTPUT && CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS */ #define __get_kernel_nofault __mvc_kernel_nofault #define __put_kernel_nofault __mvc_kernel_nofault