From nobody Wed Dec 17 09:21:34 2025 Received: from pegase2.c-s.fr (pegase2.c-s.fr [93.17.235.10]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 2B1A7324B32; Thu, 6 Nov 2025 11:50:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=93.17.235.10 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762429836; cv=none; b=PCfFZh4fB+sFUtx/TrkuCvoB9IuKbl12Nke48OU62jUakP/kkeyJtcEMm9V3c5PX2qOfmNvtfD+n/7YzODUrRybNcvO0PFRMKqBVS5us7OuzScELyJX9Y5UA4tHXS70xD8cDByzVWg8loNMGOUzQOVX2P2KCZsYapHZ71ynMAu4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762429836; c=relaxed/simple; bh=OkVBp0dNkP4Ptywt73R1Ln/6ZQlLCXnewEL9kTrdGjQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Lc/icleBeKvNU6a6BmovyhEBvSrvXynf2nKkdcXIN4IihU7hxg6emv/JPZyfUPGWDzBCfGzS49D2Ur1L8KYsbOByiRHYtvGb5x7afUOzdVL9CO9DNNdKN7TUSX9zdi6QiJpkGYCXQrs8d8bRUtjmUDO/UmsftFyHpF/M04KI/40= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=csgroup.eu; spf=pass smtp.mailfrom=csgroup.eu; arc=none smtp.client-ip=93.17.235.10 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=csgroup.eu Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=csgroup.eu Received: from localhost (mailhub4.si.c-s.fr [172.26.127.67]) by localhost (Postfix) with ESMTP id 4d2KmS34Gsz9sSn; Thu, 6 Nov 2025 12:32:24 +0100 (CET) X-Virus-Scanned: amavisd-new at c-s.fr Received: from pegase2.c-s.fr ([172.26.127.65]) by localhost (pegase2.c-s.fr [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id vP9Dk_AyEu6n; Thu, 6 Nov 2025 12:32:24 +0100 (CET) Received: from messagerie.si.c-s.fr (messagerie.si.c-s.fr [192.168.25.192]) by pegase2.c-s.fr (Postfix) with ESMTP id 4d2KmL1Gslz9sSZ; Thu, 6 Nov 2025 12:32:18 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 168E18B77E; Thu, 6 Nov 2025 12:32:18 +0100 (CET) X-Virus-Scanned: amavisd-new at c-s.fr Received: from messagerie.si.c-s.fr ([127.0.0.1]) by localhost (messagerie.si.c-s.fr [127.0.0.1]) (amavisd-new, port 10023) with ESMTP id jSiq6pmmL0kj; Thu, 6 Nov 2025 12:32:17 +0100 (CET) Received: from PO20335.idsi0.si.c-s.fr (unknown [192.168.235.99]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 424918B773; Thu, 6 Nov 2025 12:32:17 +0100 (CET) From: Christophe Leroy To: Alexander Viro , Christian Brauner , Jan Kara , Thomas Gleixner , Ingo Molnar , Peter Zijlstra , Darren Hart , Davidlohr Bueso , "Andre Almeida" , Andrew Morton , Eric Dumazet , Kuniyuki Iwashima , Paolo Abeni , Willem de Bruijn , "David S. Miller" , Jakub Kicinski , Simon Horman , Daniel Borkmann , Dave Hansen , Madhavan Srinivasan , Michael Ellerman , Nicholas Piggin Cc: Christophe Leroy , linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linuxppc-dev@lists.ozlabs.org Subject: [PATCH v4 07/10] powerpc/uaccess: Refactor user_{read/write/}_access_begin() Date: Thu, 6 Nov 2025 12:31:25 +0100 Message-ID: <0dd24b956d4b974b896d9b5f4fca594e06fb69fa.1762427933.git.christophe.leroy@csgroup.eu> X-Mailer: git-send-email 2.49.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=3587; i=christophe.leroy@csgroup.eu; h=from:subject:message-id; bh=OkVBp0dNkP4Ptywt73R1Ln/6ZQlLCXnewEL9kTrdGjQ=; b=owGbwMvMwCV2d0KB2p7V54MZT6slMWTytGsffp7BqTJB+bSwRHe1BkPvjOWRQlJZDpIMB0qvV byMF3/cUcrCIMbFICumyHL8P/euGV1fUvOn7tKHmcPKBDKEgYtTACbyYxcjw4oZSVF/+z1Cb6WW m/w83VD7PrRQ/c3z3TcUn4o1GRV5hTD8r3AU3tewQVr/YnJJzNsLj1sfnW9b1fo2mFHwzNZPZzN 38wMA X-Developer-Key: i=christophe.leroy@csgroup.eu; a=openpgp; fpr=10FFE6F8B390DE17ACC2632368A92FEB01B8DD78 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" user_read_access_begin() and user_write_access_begin() and user_access_begin() are now very similar. Create a common __user_access_begin() that takes direction as parameter. In order to avoid a warning with the conditional call of barrier_nospec() which is sometimes an empty macro, change it to a do {} while (0). Signed-off-by: Christophe Leroy --- v4: Rebase on top of core-scoped-uaccess tag v2: New --- arch/powerpc/include/asm/barrier.h | 2 +- arch/powerpc/include/asm/uaccess.h | 46 +++++++++--------------------- 2 files changed, 14 insertions(+), 34 deletions(-) diff --git a/arch/powerpc/include/asm/barrier.h b/arch/powerpc/include/asm/= barrier.h index 9e9833faa4af8..9d2f612cfb1d7 100644 --- a/arch/powerpc/include/asm/barrier.h +++ b/arch/powerpc/include/asm/barrier.h @@ -102,7 +102,7 @@ do { \ =20 #else /* !CONFIG_PPC_BARRIER_NOSPEC */ #define barrier_nospec_asm -#define barrier_nospec() +#define barrier_nospec() do {} while (0) #endif /* CONFIG_PPC_BARRIER_NOSPEC */ =20 /* diff --git a/arch/powerpc/include/asm/uaccess.h b/arch/powerpc/include/asm/= uaccess.h index 7846ee59e3747..721d65dbbb2e5 100644 --- a/arch/powerpc/include/asm/uaccess.h +++ b/arch/powerpc/include/asm/uaccess.h @@ -410,50 +410,30 @@ copy_mc_to_user(void __user *to, const void *from, un= signed long n) extern long __copy_from_user_flushcache(void *dst, const void __user *src, unsigned size); =20 -static __must_check __always_inline bool user_access_begin(const void __us= er *ptr, size_t len) +static __must_check __always_inline bool __user_access_begin(const void __= user *ptr, size_t len, + unsigned long dir) { if (unlikely(!access_ok(ptr, len))) return false; =20 might_fault(); =20 - barrier_nospec(); - allow_read_write_user((void __user *)ptr, ptr, len); + if (dir & KUAP_READ) + barrier_nospec(); + allow_user_access((void __user *)ptr, dir); return true; } -#define user_access_begin user_access_begin -#define user_access_end prevent_current_access_user -#define user_access_save prevent_user_access_return -#define user_access_restore restore_user_access =20 -static __must_check __always_inline bool -user_read_access_begin(const void __user *ptr, size_t len) -{ - if (unlikely(!access_ok(ptr, len))) - return false; +#define user_access_begin(p, l) __user_access_begin(p, l, KUAP_READ_WRITE) +#define user_read_access_begin(p, l) __user_access_begin(p, l, KUAP_READ) +#define user_write_access_begin(p, l) __user_access_begin(p, l, KUAP_WRITE) =20 - might_fault(); - - barrier_nospec(); - allow_read_from_user(ptr, len); - return true; -} -#define user_read_access_begin user_read_access_begin -#define user_read_access_end prevent_current_read_from_user +#define user_access_end() prevent_user_access(KUAP_READ_WRITE) +#define user_read_access_end() prevent_user_access(KUAP_READ) +#define user_write_access_end() prevent_user_access(KUAP_WRITE) =20 -static __must_check __always_inline bool -user_write_access_begin(const void __user *ptr, size_t len) -{ - if (unlikely(!access_ok(ptr, len))) - return false; - - might_fault(); - - allow_write_to_user((void __user *)ptr, len); - return true; -} -#define user_write_access_begin user_write_access_begin -#define user_write_access_end prevent_current_write_to_user +#define user_access_save prevent_user_access_return +#define user_access_restore restore_user_access =20 #define arch_unsafe_get_user(x, p, e) do { \ __long_type(*(p)) __gu_val; \ --=20 2.49.0