From nobody Sun Feb 8 16:36:09 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E54CB22F76F; Wed, 17 Dec 2025 08:05:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765958738; cv=none; b=T5tk6omgSWium/b5D0bADHdxdvC61MHfYRrcwf+d7WHsOzX+hbWj7jmjXNsBdKIG8uD5q070FXwPja/xKPB/G+dp+SffGrBGSCCAUlKCYwuQHrFiKYOrzYpD2xBSLc7JaypN16er0b8uclizt3RvaP758wV7f4636cTgVM3nkqs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765958738; c=relaxed/simple; bh=ONjskDJSnMc2NvXpXHulyVNB4siKX2n/8tf9NPapg1M=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Gi0BwoK/KqlUhs2rEjKzPWBeA+afo8S07l5FhR/0fCCqgXS1v/HPzzJvbMmwBVHT3nDoOK5Ej76PO/dleOIzMBXPr3Y3zhJUg3G6c4+5qH45bg11dQq8LXdVOjqMMhvS2iR2Fw9eRvEOF3Khf2de/aeoP99MO6Ms6FXjbtxBjIk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=bVhgVtF1; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="bVhgVtF1" Received: by smtp.kernel.org (Postfix) with ESMTPS id 93E68C19421; Wed, 17 Dec 2025 08:05:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1765958737; bh=ONjskDJSnMc2NvXpXHulyVNB4siKX2n/8tf9NPapg1M=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=bVhgVtF1al5XdTz4osunZzDcFSkPWDnxcdjF7me8Kt1xIrsk06NCPZYAEtzBes6Vn 3AtcVp/lvZ7t1+M1N/EQyjen93Nn3k2rffk3i5n6nWD8JtMniv+FCKkzYqLB+EyQb6 oWd5H3Cf3jOMoZ/6xIjY+OxlQr+TLczj1oEumlLewiHCfcfO4/OPGKEgOrc/REVPxc XsYN/bfQrUlrtKSEsWA11/JrntjPh06DRjSGlJ1fGnhn+ZI80dev76oc4J5H/d9pR8 DVvIpzBaa57h+JQKUGhzcl+idYYJUUgDGVsFk9GfQrdrMBQ2AkYPHbujGknRZLml03 J6+sIYyiUC8Ag== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7F2A9D6408A; Wed, 17 Dec 2025 08:05:37 +0000 (UTC) From: Joel Granados Date: Wed, 17 Dec 2025 09:04:39 +0100 Subject: [PATCH 1/7] sysctl: Return -ENOSYS from proc_douintvec_conv when CONFIG_PROC_SYSCTL=n Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251217-jag-no-macro-conv-v1-1-6e4252687915@kernel.org> References: <20251217-jag-no-macro-conv-v1-0-6e4252687915@kernel.org> In-Reply-To: <20251217-jag-no-macro-conv-v1-0-6e4252687915@kernel.org> To: Kees Cook , Alexander Viro , Christian Brauner , Jan Kara Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, Joel Granados X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=928; i=joel.granados@kernel.org; h=from:subject:message-id; bh=ONjskDJSnMc2NvXpXHulyVNB4siKX2n/8tf9NPapg1M=; b=owJ4nAHtARL+kA0DAAoBupfNUreWQU8ByyZiAGlCZEnD3wipew55YC8O32lYsa+eP0IUJsDCH 472Y7oCRrOCu4kBswQAAQoAHRYhBK5HCVcl5jElzssnkLqXzVK3lkFPBQJpQmRJAAoJELqXzVK3 lkFPPaQL/A4Smb3BpiMugKxIpE6/bf9WqLUYniX/SQ/1PIyHP8+oUDg9sAu4LzybYpfqrxoaqhF rH9CKy+7RQizNZdj+/tXEKko7aka2URX4t6/4R1WVMQIv6WVuHhwznxSHf+UuiN5nC/5dIp5XVB PylQUfhKyx3Sygufu4x4wj5IVgJTf1ve8hyxrHWbM5ZfyAT/aYOVJr3pr+Ly9++XYDFJBUHipKo A5Jq2gwFStCKQPSPv26rBd4IiKAM2ivDQRcLEHwb7c1rGCuBVao9u8EE7sJQ74gnDrvn31RwAs2 UIjeaeGmkOq7bK0mKKHDTDk17HKJaS9uL373t0vz/X35noRWrzzKjMbUrXkJ9zSzuPW2ncmJ7Zv TpC5E4VFjQh4dGkbjKFA3zrugebeXiv+XAmLL8PBtQAzyvz9sDotq/6fW9E/GzJWGVBtefPS4hR czbcYP/tZYlQtKJR+w1o+u2GPsj0aKH575bxgureyIhOiSIccuLdOPkfEKpWfkCLEPsqMUXJfG5 d0= X-Developer-Key: i=joel.granados@kernel.org; a=openpgp; fpr=F1F8E46D30F0F6C4A45FF4465895FAAC338C6E77 X-Endpoint-Received: by B4 Relay for joel.granados@kernel.org/default with auth_id=239 Ensure an error if prco_douintvec_conv is erroneously called in a system with CONFIG_PROC_SYSCTL=3Dn Signed-off-by: Joel Granados --- kernel/sysctl.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 2cd767b9680eb696efeae06f436548777b1b6844..84ca24fb1965e97dc9e6f71f42a= 6c99c01aca3ee 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -1055,6 +1055,14 @@ int proc_douintvec_minmax(const struct ctl_table *ta= ble, int dir, return -ENOSYS; } =20 +int proc_douintvec_conv(const struct ctl_table *table, int write, void *bu= ffer, + size_t *lenp, loff_t *ppos, + int (*conv)(unsigned long *lvalp, unsigned int *valp, + int write, const struct ctl_table *table)) +{ + return -ENOSYS; +} + int proc_dou8vec_minmax(const struct ctl_table *table, int dir, void *buffer, size_t *lenp, loff_t *ppos) { --=20 2.50.1 From nobody Sun Feb 8 16:36:09 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 10DFC28314B; Wed, 17 Dec 2025 08:05:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765958738; cv=none; b=fKx0iE6oVKPc3xx0zAxlv7J+kCwRL9WY6UeO20C+ll+5i2wrglsJERiaMInuvL5I2S2IziD3zz3+92PMo0/L6valXIIz2bWP+C8i9q7BU/+jTTSeSXygsNydBvMRRabPSRAD4cFmwufWoXuphWvVTjVKRJVvZ4CyTkj3F0U8LGE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765958738; c=relaxed/simple; bh=7AHWEkJrCgJf28XDy4+AhvRex/rKi4omNUzr0zBfAyY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Xt0OhAHMG+AEY7aJ20wQ3H+3Bfd1uPTCw9XPriXFYQ5daIE8M27qh0uK+kwHNh8SgNpfX4bcECN4rjLS43aRzIduhWwg25l/qV7XK4PE1yjuOWs7VFGqNCbtaoYCv4RQxuUMPGyVyk3NQMjBDZrBcnxODSJyUQwD1Y2zSZtjXyA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=fakWr4MQ; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="fakWr4MQ" Received: by smtp.kernel.org (Postfix) with ESMTPS id A6431C4CEFB; Wed, 17 Dec 2025 08:05:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1765958737; bh=7AHWEkJrCgJf28XDy4+AhvRex/rKi4omNUzr0zBfAyY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=fakWr4MQafVnxXTxibv+0KGF3+HADsyn38JdzgXEd9x5TYI2i4LG0zSI1jPcA6q8f 7sA/yhYp8xHBUVJykgWqhnySdILlQ6O5m1EaAoVW1p0aIQxgcCKMX88cHAkbQ5qYMa cEmCqYYQaqABlstmw1W31RJ/0t+gnxjXzUe8H+Z5SIk4y3oRFPZvQPCdx33VAhvYDf 5+qh6Cenysbv4n7Il61pxiIYazJggkPik+32VurtQrbJg4UVYogi8a0YFN5mH6T7Y2 0W78sygPB63l39He8XRzYA6G2CbDbb3ZRqbdOqzskvRMJ59Dhg0zwfNTSXG0znvuB4 WmiKw5oEybFUQ== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9A053D6408C; Wed, 17 Dec 2025 08:05:37 +0000 (UTC) From: Joel Granados Date: Wed, 17 Dec 2025 09:04:40 +0100 Subject: [PATCH 2/7] sysctl: clarify proc_douintvec_minmax doc Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251217-jag-no-macro-conv-v1-2-6e4252687915@kernel.org> References: <20251217-jag-no-macro-conv-v1-0-6e4252687915@kernel.org> In-Reply-To: <20251217-jag-no-macro-conv-v1-0-6e4252687915@kernel.org> To: Kees Cook , Alexander Viro , Christian Brauner , Jan Kara Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, Joel Granados X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1244; i=joel.granados@kernel.org; h=from:subject:message-id; bh=7AHWEkJrCgJf28XDy4+AhvRex/rKi4omNUzr0zBfAyY=; b=owJ4nAHtARL+kA0DAAoBupfNUreWQU8ByyZiAGlCZEprGYwzIjqFXNIzbqWohf9ZpLvRFjfwm TXFxj+CeH2EjIkBswQAAQoAHRYhBK5HCVcl5jElzssnkLqXzVK3lkFPBQJpQmRKAAoJELqXzVK3 lkFPOZIL/RVW9aA+XJmXx7Nf94T6ge8FNJCBqAchqK2bJHb4Q4ij3CzzUn8blh6DGYEx9zo+rIX pIIpyJUcV80eSZpSIyRjSobeU18erTqwXcjINtnRBXqdEWsKcOzwRpp42ijWSNZg5eMlRyPf21D JKLkkzNYTncImpOjs9kKP02sN3R8UMLzQg0Laq40lG3LXXFcE+zW8nF1MTo0nZMNbtDka5VFDuI AeUI2Qt00UFQZYPyhBqNcZlnS4U/ySiOpQWCeyhoitMwbszHC3LQxIhK3aOg8zW+KF0FqyPBvpY 87RPUF2nz9g5ZcaxK5qZm5vUjNl2Nu2y48+GmaxKY3LgtGTSnVWcUA/cP2sjj3Rv1l12cwghBhZ eiuPN3qP8vvBakBeRdsXj1+A6V+EN3tFTl6wp5krSf1Kc9VvoA8e8OZ6zY7N0ZpIT7h+nM9s/Va mDeHPRc8l6IGhG1Nvtmk8TdgoX9GahvIcBKYAJXtmfOhUo4fbvNvrQ1A0Lnx+wiXWCpJ7pxFt85 0U= X-Developer-Key: i=joel.granados@kernel.org; a=openpgp; fpr=F1F8E46D30F0F6C4A45FF4465895FAAC338C6E77 X-Endpoint-Received: by B4 Relay for joel.granados@kernel.org/default with auth_id=239 Specify that the range check is only when assigning kernel variable Signed-off-by: Joel Granados --- kernel/sysctl.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 84ca24fb1965e97dc9e6f71f42a6c99c01aca3ee..e82716b7c13840cadc3b19a7c9d= 05b167abebcf6 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -692,10 +692,10 @@ int proc_dointvec_minmax(const struct ctl_table *tabl= e, int dir, * values from/to the user buffer, treated as an ASCII string. Negative * strings are not allowed. * - * This routine will ensure the values are within the range specified by - * table->extra1 (min) and table->extra2 (max). There is a final sanity - * check for UINT_MAX to avoid having to support wrap around uses from - * userspace. + * When changing the kernel variable, this routine will ensure the values + * are within the range specified by table->extra1 (min) and table->extra2 + * (max). And Check that the values are less than UINT_MAX to avoid having= to + * support wrap around uses from userspace. * * Returns 0 on success or -ERANGE when range check failes and * SYSCTL_USER_TO_KERN(dir) =3D=3D true --=20 2.50.1 From nobody Sun Feb 8 16:36:09 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 10E702C21FA; Wed, 17 Dec 2025 08:05:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765958738; cv=none; b=ZC6/Hk4DM6Z4JPotce8Ml+2NajFUR6GQzhFKKSgKV8ZJekc1VgbRbX//TGV5f7mAUdWNO+goZ7Ds24Dx8weZPR7M3uqzTCXFQbBBEuKpx5cKr6TAJbHw2uRVIJg4ud/CoHnxf2hLyZLF7GdJYMnKAFjNZDKKG4/ZaQn0q+YJkVs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765958738; c=relaxed/simple; bh=N7Xwq5Z5BoMOd9TzVgbIMWfFv5xGXmLMAU7dBOOPWUQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=fgu+raHc8ZfWeg+E+sfoFWRXNOpsTgpZgfBb+iE5WxOhsyQLrQkY2HAnaYDUqsjR+Edywr/qlp9wPVRFqTU3i56MaPa/OcDh+QMlLTIEHO3RY+dUPOUjdyam0PGAy8UP/wnQEdk/csPF4WizsGKyJzZk3kpj5oqNoSQZbGO/U/0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=P5sPBtuW; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="P5sPBtuW" Received: by smtp.kernel.org (Postfix) with ESMTPS id B2FB3C19423; Wed, 17 Dec 2025 08:05:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1765958737; bh=N7Xwq5Z5BoMOd9TzVgbIMWfFv5xGXmLMAU7dBOOPWUQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=P5sPBtuWYGyCdZEk4LKzFGtqUpXQ0a11IKu8sNY/LqoU7+Cis6NG73vj81FTbus6Q pULzrY/6AKUsPLmBaz7HaODJ9sgpEnC6OSP6CSNWSf1/Z3xVCu9SSTkY4ZpOzkCvqb 8mgmyb+Kpi9plGwczQorxEDqt9//sGc9qoq7xPGE0vfnROgRPH3QONWk5ofE4MUIZL Q9lwYLqYBWvs5RN84ccJVaTtPrKfAK2+I+JDjWivCr0d1Ct5r6fuQw9txgTYOxAiYY 3xQWDIAa/nvTTtNTRVY2D0YzwZkWGcnWgbDGYh+LJ63vW1p/hXTWv8bnxTj9pkYJxU 9+5T+ObOIdNtA== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id A9FA8D6408B; Wed, 17 Dec 2025 08:05:37 +0000 (UTC) From: Joel Granados Date: Wed, 17 Dec 2025 09:04:41 +0100 Subject: [PATCH 3/7] sysctl: Add CONFIG_PROC_SYSCTL guards for converter macros Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251217-jag-no-macro-conv-v1-3-6e4252687915@kernel.org> References: <20251217-jag-no-macro-conv-v1-0-6e4252687915@kernel.org> In-Reply-To: <20251217-jag-no-macro-conv-v1-0-6e4252687915@kernel.org> To: Kees Cook , Alexander Viro , Christian Brauner , Jan Kara Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, Joel Granados X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2545; i=joel.granados@kernel.org; h=from:subject:message-id; bh=N7Xwq5Z5BoMOd9TzVgbIMWfFv5xGXmLMAU7dBOOPWUQ=; b=owJ4nAHtARL+kA0DAAoBupfNUreWQU8ByyZiAGlCZEr9mOFjyMw7gjZmiybtKenWNzwRuobBa bpqcMotcuNGKYkBswQAAQoAHRYhBK5HCVcl5jElzssnkLqXzVK3lkFPBQJpQmRKAAoJELqXzVK3 lkFPhuEMAJPZlpJwksDL+K9bzUCMVUw7C+m1CEUwWNqhulM302vOjCVfHBgLYQKiaVmyZkYcJxK 1IZTfJFS1ae864sVGV+QHPD1hdb6e3vCEYC+fxv8gYl7Grnc9ve+m0rt8/OK7YGbIXGzHM+eTP4 doYXys9S9yolZshNxCcBh8WmicU2FtzSv3xksf18eGLLC77PhMRLIZzZWj39jMg65crYSnA0j0S PPx1yph9IJkPucce/rf4nyuZIC5u4n03Xs9OXt9u8fjxfcS9Dm+zyMG+2SKaKRSrj0VwYZSWWCU w/JHp/HkHIOP7NRwAvALgVp9ZSgrgq4QKfoeAeHB8ujHoKrp/E9E/Tg1fZuQnwdAlZHfvzC+uBT FhAnkKXZYbiCHyhcqd6zWT9Lvn8NabCqIswY9Whu5i3seL/4JSP5+NJzqKuK1veIW2ZOCwuxnLK ciLnEctGcy94IfC4tyhvNVWQOekdS90jkpDU4rfQhfCjgSY+11mbAqP4ozBRgQXaOQpuY6TCmg7 AM= X-Developer-Key: i=joel.granados@kernel.org; a=openpgp; fpr=F1F8E46D30F0F6C4A45FF4465895FAAC338C6E77 X-Endpoint-Received: by B4 Relay for joel.granados@kernel.org/default with auth_id=239 Wrap sysctl converter macros with CONFIG_PROC_SYSCTL conditional compilation. When CONFIG_PROC_SYSCTL is disabled, provide stub implementations that return -ENOSYS to prevent link errors while maintaining API compatibility. This ensures converter macros are only compiled when procfs sysctl support is enabled in the kernel configuration. Signed-off-by: Joel Granados --- include/linux/sysctl.h | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h index 288fe0055cd5f7bd670a4e9797cc0595f4060e5f..0a64212a0ceb8454ae343831739= 831a092b6e693 100644 --- a/include/linux/sysctl.h +++ b/include/linux/sysctl.h @@ -73,6 +73,7 @@ extern const int sysctl_vals[]; #define SYSCTL_USER_TO_KERN(dir) (!!(dir)) #define SYSCTL_KERN_TO_USER(dir) (!dir) =20 +#ifdef CONFIG_PROC_SYSCTL #define SYSCTL_USER_TO_KERN_INT_CONV(name, u_ptr_op) \ int sysctl_user_to_kern_int_conv##name(const bool *negp, \ const unsigned long *u_ptr,\ @@ -173,6 +174,48 @@ int do_proc_uint_conv##name(unsigned long *u_ptr, unsi= gned int *k_ptr, \ return 0; \ } =20 +#else // CONFIG_PROC_SYSCTL +#define SYSCTL_USER_TO_KERN_INT_CONV(name, u_ptr_op) \ +int sysctl_user_to_kern_int_conv##name(const bool *negp, \ + const unsigned long *u_ptr,\ + int *k_ptr) \ +{ \ + return -ENOSYS; \ +} + +#define SYSCTL_KERN_TO_USER_INT_CONV(name, k_ptr_op) \ +int sysctl_kern_to_user_int_conv##name(bool *negp, \ + unsigned long *u_ptr, \ + const int *k_ptr) \ +{ \ + return -ENOSYS; \ +} + +#define SYSCTL_INT_CONV_CUSTOM(name, user_to_kern, kern_to_user, \ + k_ptr_range_check) \ +int do_proc_int_conv##name(bool *negp, unsigned long *u_ptr, int *k_ptr,\ + int dir, const struct ctl_table *tbl) \ +{ \ + return -ENOSYS; \ +} + +#define SYSCTL_USER_TO_KERN_UINT_CONV(name, u_ptr_op) \ +int sysctl_user_to_kern_uint_conv##name(const unsigned long *u_ptr,\ + unsigned int *k_ptr) \ +{ \ + return -ENOSYS; \ +} + +#define SYSCTL_UINT_CONV_CUSTOM(name, user_to_kern, kern_to_user, \ + k_ptr_range_check) \ +int do_proc_uint_conv##name(unsigned long *u_ptr, unsigned int *k_ptr, \ + int dir, const struct ctl_table *tbl) \ +{ \ + return -ENOSYS; \ +} + +#endif // CONFIG_PROC_SYSCTL + =20 extern const unsigned long sysctl_long_vals[]; =20 --=20 2.50.1 From nobody Sun Feb 8 16:36:09 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2709B32571D; Wed, 17 Dec 2025 08:05:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765958738; cv=none; b=fx7ySitz6UE46vTqhTVBvx/6dzPQCJXRGtF5Cmbc32wmtIxBcSS8DM8ZJS7NL8ZIvzvM8dxLW0ctgM52GsUxo/bhI5dcsHkZb8LmbSR4kSuDYb/rY3vaNqD3WNYkb+yotETc2fTYVhIC7Yw84W1N84g6A9lGNQJndrcbuS33ft0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765958738; c=relaxed/simple; bh=+2nSENO4UvL2K2wra6VTIYpb0JwlPttl3m8NdXIwoCE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=hwy8FhIdExigrAc0XfLIdSqwAgmlHtuvNssCLL7YkXDbPvGIiQcyLu1P2w6OoLANFKUWHmhpiZtL41ULn8XbCXvAX2i88c0EkCl2Prb8vYJ9mYK0zTEeR75MHewRV++e+YZ3JPA7WAbS3JGN045tJNu1Wk07ZgJsyQGeA73iP+I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=iB+nIO6c; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="iB+nIO6c" Received: by smtp.kernel.org (Postfix) with ESMTPS id C1D72C19425; Wed, 17 Dec 2025 08:05:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1765958737; bh=+2nSENO4UvL2K2wra6VTIYpb0JwlPttl3m8NdXIwoCE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=iB+nIO6caJGeYBVMhb8WSg5ZSIMOlf2WjR671fyPTEqUvYqRxg0VT/sYwMQ1PWnBL XnU7wurFtnQXMu++SFZ+ZzJwzBU6tzwdrlkmNNfPhMoFeWSC5mRgZXOHzHcbALvH5z b+ns02P1LZ5vgoIdO7wzxiKjBHJPIOULpECMjW6P/TZi9M44WA/A69BILJJWYJpsjj OxV6WNms6PmD25v4HoAd2+2i+FhrTCjMNVaaeCqbkocvccSzkI1Zue76FCcNoKRWYI biUKV+TyGZFkPlqtFLdJ4ztjQcvCw2vPc2tEdVJZTA5bZWqYTNiZYl9YEUfMQnQ5tm /DxndliY7Vw2Q== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id BAD5ED6408D; Wed, 17 Dec 2025 08:05:37 +0000 (UTC) From: Joel Granados Date: Wed, 17 Dec 2025 09:04:42 +0100 Subject: [PATCH 4/7] sysctl: Replace UINT converter macros with functions Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251217-jag-no-macro-conv-v1-4-6e4252687915@kernel.org> References: <20251217-jag-no-macro-conv-v1-0-6e4252687915@kernel.org> In-Reply-To: <20251217-jag-no-macro-conv-v1-0-6e4252687915@kernel.org> To: Kees Cook , Alexander Viro , Christian Brauner , Jan Kara Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, Joel Granados X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=10667; i=joel.granados@kernel.org; h=from:subject:message-id; bh=+2nSENO4UvL2K2wra6VTIYpb0JwlPttl3m8NdXIwoCE=; b=owJ4nAHtARL+kA0DAAoBupfNUreWQU8ByyZiAGlCZEuxqD9e4qUpyMHmD/ocR2Q7cM3z+wFAo EbZXuVtBwKi0IkBswQAAQoAHRYhBK5HCVcl5jElzssnkLqXzVK3lkFPBQJpQmRLAAoJELqXzVK3 lkFPE0UL/0MY6kN6rnvY6jS+0JLMaYxHRu/+Hv3ENDKuLgcPrbhFYWcGb/MlJdGm1Xj9HgNEhob sis9F3mJQdz8tiqIOVJWlwtQQ1jhRKnX1pP2N99z+QONH1nQRHP/Pq4IEBwsJhB4OWri75VUZQf YWLk2//IDQEz0Kwqi4Np1OOAqvxTok6+WWtj5bS/qxUKgOnqtzHK7uDeLve3P8LPP56hEbgzM+h BqwZs96R72pt+yk+9eBGwMbEWz56yQ+w/TfLgACEJ4SJfT30YAWwgFDS+AXEuB6lLKeZMUW2qva 7ZXCuDmKvLI2UKo596jMqLDNAi8i8xPYUo9EiO9j0gxGGYHdy50BgpX7a1ZQFUpcHGJ1JLTtUGL GWUEX9s4kppzhWTPqZC0dN2WwhtW6OsXknOWVvvE9OU2nnkJRTCFwgciG9Xtlj6R9XYiuRTPlDf rE8cmAMKSqcgYxXgxMDJtglj4C/Y2xkhoNmFXIfcN+qJ2yiDhBtLus9t1FxAz7oe+j6lXeY3vF6 1o= X-Developer-Key: i=joel.granados@kernel.org; a=openpgp; fpr=F1F8E46D30F0F6C4A45FF4465895FAAC338C6E77 X-Endpoint-Received: by B4 Relay for joel.granados@kernel.org/default with auth_id=239 Replace the SYSCTL_USER_TO_KERN_UINT_CONV and SYSCTL_UINT_CONV_CUSTOM macros with functions with the same logic. This makes debugging easier and aligns with the functions preference described in coding-style.rst. Update the only user of this API: pipe.c. Signed-off-by: Joel Granados --- fs/pipe.c | 22 ++++++-- include/linux/sysctl.h | 63 +++------------------- kernel/sysctl.c | 140 +++++++++++++++++++++++++++++++++++++++++++--= ---- 3 files changed, 148 insertions(+), 77 deletions(-) diff --git a/fs/pipe.c b/fs/pipe.c index 9e6a01475815986ea2511868f66f4a8763978578..22647f50b286d3bca024ee4c6de= 51b100ddc5402 100644 --- a/fs/pipe.c +++ b/fs/pipe.c @@ -1481,10 +1481,24 @@ static struct file_system_type pipe_fs_type =3D { }; =20 #ifdef CONFIG_SYSCTL -static SYSCTL_USER_TO_KERN_UINT_CONV(_pipe_maxsz, round_pipe_size) -static SYSCTL_UINT_CONV_CUSTOM(_pipe_maxsz, - sysctl_user_to_kern_uint_conv_pipe_maxsz, - sysctl_kern_to_user_uint_conv, true) + +static ulong round_pipe_size_ul(ulong size) +{ + return round_pipe_size(size); +} + +static int u2k_pipe_maxsz(const ulong *u_ptr, uint *k_ptr) +{ + return proc_uint_u2k_conv_uop(u_ptr, k_ptr, round_pipe_size_ul); +} + +static int do_proc_uint_conv_pipe_maxsz(ulong *u_ptr, uint *k_ptr, + int dir, const struct ctl_table *table) +{ + return proc_uint_conv(u_ptr, k_ptr, dir, table, true, + u2k_pipe_maxsz, + proc_uint_k2u_conv); +} =20 static int proc_dopipe_max_size(const struct ctl_table *table, int write, void *buffer, size_t *lenp, loff_t *ppos) diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h index 0a64212a0ceb8454ae343831739831a092b6e693..d712992789f0f2f3fe4cec10fb1= 4907b7fd61a7e 100644 --- a/include/linux/sysctl.h +++ b/include/linux/sysctl.h @@ -135,45 +135,6 @@ int do_proc_int_conv##name(bool *negp, unsigned long *= u_ptr, int *k_ptr,\ return user_to_kern(negp, u_ptr, k_ptr); \ return 0; \ } - -#define SYSCTL_USER_TO_KERN_UINT_CONV(name, u_ptr_op) \ -int sysctl_user_to_kern_uint_conv##name(const unsigned long *u_ptr,\ - unsigned int *k_ptr) \ -{ \ - unsigned long u =3D u_ptr_op(*u_ptr); \ - if (u > UINT_MAX) \ - return -EINVAL; \ - WRITE_ONCE(*k_ptr, u); \ - return 0; \ -} - -#define SYSCTL_UINT_CONV_CUSTOM(name, user_to_kern, kern_to_user, \ - k_ptr_range_check) \ -int do_proc_uint_conv##name(unsigned long *u_ptr, unsigned int *k_ptr, \ - int dir, const struct ctl_table *tbl) \ -{ \ - if (SYSCTL_KERN_TO_USER(dir)) \ - return kern_to_user(u_ptr, k_ptr); \ - \ - if (k_ptr_range_check) { \ - unsigned int tmp_k; \ - int ret; \ - if (!tbl) \ - return -EINVAL; \ - ret =3D user_to_kern(u_ptr, &tmp_k); \ - if (ret) \ - return ret; \ - if ((tbl->extra1 && \ - *(unsigned int *)tbl->extra1 > tmp_k) || \ - (tbl->extra2 && \ - *(unsigned int *)tbl->extra2 < tmp_k)) \ - return -ERANGE; \ - WRITE_ONCE(*k_ptr, tmp_k); \ - } else \ - return user_to_kern(u_ptr, k_ptr); \ - return 0; \ -} - #else // CONFIG_PROC_SYSCTL #define SYSCTL_USER_TO_KERN_INT_CONV(name, u_ptr_op) \ int sysctl_user_to_kern_int_conv##name(const bool *negp, \ @@ -199,24 +160,8 @@ int do_proc_int_conv##name(bool *negp, unsigned long *= u_ptr, int *k_ptr,\ return -ENOSYS; \ } =20 -#define SYSCTL_USER_TO_KERN_UINT_CONV(name, u_ptr_op) \ -int sysctl_user_to_kern_uint_conv##name(const unsigned long *u_ptr,\ - unsigned int *k_ptr) \ -{ \ - return -ENOSYS; \ -} - -#define SYSCTL_UINT_CONV_CUSTOM(name, user_to_kern, kern_to_user, \ - k_ptr_range_check) \ -int do_proc_uint_conv##name(unsigned long *u_ptr, unsigned int *k_ptr, \ - int dir, const struct ctl_table *tbl) \ -{ \ - return -ENOSYS; \ -} - #endif // CONFIG_PROC_SYSCTL =20 - extern const unsigned long sysctl_long_vals[]; =20 typedef int proc_handler(const struct ctl_table *ctl, int write, void *buf= fer, @@ -239,6 +184,13 @@ int proc_douintvec_conv(const struct ctl_table *table,= int write, void *buffer, size_t *lenp, loff_t *ppos, int (*conv)(unsigned long *lvalp, unsigned int *valp, int write, const struct ctl_table *table)); +int proc_uint_k2u_conv(ulong *u_ptr, const uint *k_ptr); +int proc_uint_u2k_conv_uop(const ulong *u_ptr, uint *k_ptr, + ulong (*u_ptr_op)(const ulong)); +int proc_uint_conv(ulong *u_ptr, uint *k_ptr, int dir, + const struct ctl_table *tbl, bool k_ptr_range_check, + int (*user_to_kern)(const ulong *u_ptr, uint *k_ptr), + int (*kern_to_user)(ulong *u_ptr, const uint *k_ptr)); =20 int proc_dou8vec_minmax(const struct ctl_table *table, int write, void *bu= ffer, size_t *lenp, loff_t *ppos); @@ -249,7 +201,6 @@ int proc_doulongvec_minmax_conv(const struct ctl_table = *table, int dir, int proc_do_large_bitmap(const struct ctl_table *, int, void *, size_t *, = loff_t *); int proc_do_static_key(const struct ctl_table *table, int write, void *buf= fer, size_t *lenp, loff_t *ppos); -int sysctl_kern_to_user_uint_conv(unsigned long *u_ptr, const unsigned int= *k_ptr); =20 /* * Register a set of sysctl names by calling register_sysctl diff --git a/kernel/sysctl.c b/kernel/sysctl.c index e82716b7c13840cadc3b19a7c9d05b167abebcf6..5901196a52f98cdd5aba4f50899= a58d9bd9d10f9 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -354,6 +354,110 @@ static void proc_put_char(void **buf, size_t *size, c= har c) } } =20 +/** + * proc_uint_u2k_conv_uop - Assign user value to a kernel pointer + * + * @u_ptr: pointer to user space variable + * @k_ptr: pointer to kernel variable + * @u_ptr_op: execute this function before assigning to k_ptr + * + * Uses WRITE_ONCE to assign value to k_ptr. Executes u_ptr_op if + * not NULL. Check that the values are less than UINT_MAX to avoid + * having to support wrap around from userspace. + * + * returns 0 on success. + */ +int proc_uint_u2k_conv_uop(const ulong *u_ptr, uint *k_ptr, + ulong (*u_ptr_op)(const ulong)) +{ + ulong u =3D u_ptr_op ? u_ptr_op(*u_ptr) : *u_ptr; + + if (u > UINT_MAX) + return -EINVAL; + WRITE_ONCE(*k_ptr, u); + return 0; +} + +/** + * proc_uint_k2u_conv - Assign kernel value to a user space pointer + * + * @u_ptr: pointer to user space variable + * @k_ptr: pointer to kernel variable + * + * Uses READ_ONCE to assign value to u_ptr. + * + * returns 0 on success. + */ +int proc_uint_k2u_conv(ulong *u_ptr, const uint *k_ptr) +{ + uint val =3D READ_ONCE(*k_ptr); + *u_ptr =3D (ulong)val; + return 0; +} + +/** + * proc_uint_conv - Change user or kernel pointer based on direction + * + * @u_ptr: pointer to user variable + * @k_ptr: pointer to kernel variable + * @dir: %TRUE if this is a write to the sysctl file + * @tbl: the sysctl table + * @k_ptr_range_check: Check range for k_ptr when %TRUE + * @user_to_kern: Callback used to assign value from user to kernel var + * @kern_to_user: Callback used to assign value from kernel to user var + * + * When direction is kernel to user, then the u_ptr is modified. + * When direction is user to kernel, then the k_ptr is modified. + * + * Returns 0 on success + */ +int proc_uint_conv(ulong *u_ptr, uint *k_ptr, int dir, + const struct ctl_table *tbl, bool k_ptr_range_check, + int (*user_to_kern)(const ulong *u_ptr, uint *k_ptr), + int (*kern_to_user)(ulong *u_ptr, const uint *k_ptr)) +{ + if (SYSCTL_KERN_TO_USER(dir)) + return kern_to_user(u_ptr, k_ptr); + + if (k_ptr_range_check) { + uint tmp_k; + int ret; + + if (!tbl) + return -EINVAL; + ret =3D user_to_kern(u_ptr, &tmp_k); + if (ret) + return ret; + if ((tbl->extra1 && + *(uint *)tbl->extra1 > tmp_k) || + (tbl->extra2 && + *(uint *)tbl->extra2 < tmp_k)) + return -ERANGE; + WRITE_ONCE(*k_ptr, tmp_k); + } else + return user_to_kern(u_ptr, k_ptr); + return 0; +} + +static int proc_uint_u2k_conv(const ulong *u_ptr, uint *k_ptr) +{ + return proc_uint_u2k_conv_uop(u_ptr, k_ptr, NULL); +} + +static int do_proc_uint_conv(ulong *u_ptr, uint *k_ptr, int dir, + const struct ctl_table *tbl) +{ + return proc_uint_conv(u_ptr, k_ptr, dir, tbl, false, + proc_uint_u2k_conv, proc_uint_k2u_conv); +} + +static int do_proc_uint_conv_minmax(ulong *u_ptr, uint *k_ptr, int dir, + const struct ctl_table *tbl) +{ + return proc_uint_conv(u_ptr, k_ptr, dir, tbl, true, + proc_uint_u2k_conv, proc_uint_k2u_conv); +} + static SYSCTL_USER_TO_KERN_INT_CONV(, SYSCTL_CONV_IDENTITY) static SYSCTL_KERN_TO_USER_INT_CONV(, SYSCTL_CONV_IDENTITY) =20 @@ -362,22 +466,6 @@ static SYSCTL_INT_CONV_CUSTOM(, sysctl_user_to_kern_in= t_conv, static SYSCTL_INT_CONV_CUSTOM(_minmax, sysctl_user_to_kern_int_conv, sysctl_kern_to_user_int_conv, true) =20 - -static SYSCTL_USER_TO_KERN_UINT_CONV(, SYSCTL_CONV_IDENTITY) - -int sysctl_kern_to_user_uint_conv(unsigned long *u_ptr, - const unsigned int *k_ptr) -{ - unsigned int val =3D READ_ONCE(*k_ptr); - *u_ptr =3D (unsigned long)val; - return 0; -} - -static SYSCTL_UINT_CONV_CUSTOM(, sysctl_user_to_kern_uint_conv, - sysctl_kern_to_user_uint_conv, false) -static SYSCTL_UINT_CONV_CUSTOM(_minmax, sysctl_user_to_kern_uint_conv, - sysctl_kern_to_user_uint_conv, true) - static const char proc_wspace_sep[] =3D { ' ', '\t', '\n' }; =20 static int do_proc_dointvec(const struct ctl_table *table, int dir, @@ -576,7 +664,6 @@ int proc_douintvec_conv(const struct ctl_table *table, = int dir, void *buffer, return do_proc_douintvec(table, dir, buffer, lenp, ppos, conv); } =20 - /** * proc_dobool - read/write a bool * @table: the sysctl table @@ -1063,6 +1150,25 @@ int proc_douintvec_conv(const struct ctl_table *tabl= e, int write, void *buffer, return -ENOSYS; } =20 +int proc_uint_k2u_conv(ulong *u_ptr, const uint *k_ptr) +{ + return -ENOSYS; +} + +int proc_uint_u2k_conv_uop(const ulong *u_ptr, uint *k_ptr, + ulong (*u_ptr_op)(const ulong)) +{ + return -ENOSYS; +} + +int proc_uint_conv(ulong *u_ptr, uint *k_ptr, int dir, + const struct ctl_table *tbl, bool k_ptr_range_check, + int (*user_to_kern)(const ulong *u_ptr, uint *k_ptr), + int (*kern_to_user)(ulong *u_ptr, const uint *k_ptr)) +{ + return -ENOSYS; +} + int proc_dou8vec_minmax(const struct ctl_table *table, int dir, void *buffer, size_t *lenp, loff_t *ppos) { --=20 2.50.1 From nobody Sun Feb 8 16:36:09 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1E62331B132; Wed, 17 Dec 2025 08:05:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765958738; cv=none; b=SryiyOh7weeMvAprQrvEOhLtmpJiGmomjBPsZ/ZxfoBsn6Dn4lRUJO5u+XHmJW/ertt5cL8yLCYL29iBcd+1mCDjn7Lty3aWfiUZjh0BOvckjFgBz8wzMS7no7MWgunKF1rakM1WSLlnCcZOhNNJImUUp6mRmqaIOiw0Nq922T8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765958738; c=relaxed/simple; bh=YsUYwAE1O8XtejvUjAcafWn1iQWbLefNUgR/xrWQ3dg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Mnvfc9+lYcNO4DotPgyb+oPLAoGD2XAQdSFl0tPm4cOIQ59lnyjx7qN+bh31Sz70hezfrrTVZLvQu6OZA0/XR0LrdWjrADFWWhI3EKe8YH6GzSuYkYqZeG69XderH2cRZ5xpMrQ9hADatt9q6gO90AhP0225HJFWN3Ub9F3hmnw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=HQshEOuA; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="HQshEOuA" Received: by smtp.kernel.org (Postfix) with ESMTPS id D24C2C2BCAF; Wed, 17 Dec 2025 08:05:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1765958737; bh=YsUYwAE1O8XtejvUjAcafWn1iQWbLefNUgR/xrWQ3dg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=HQshEOuAaE5ZfS3lj3VpTrQk5znRIPpjCyoV7MEEB8LsFlhsb3tALcz8gnsNb/50F KY2oCo4sghcytI+9mcUuOgkL3Lbdb0SYxhcUVRskx6Ubil4AOK9DvlnyGsYRDUcJD/ rI8iaw9bgpn7QJkR8vAZfTNLQNZZDNwchVe8LPi05uaCLEMkcp7fyuDKedVX+Dr4uL WF3VbR1qeW4yajTnpqNcey6pa6nQsyakkJi2jrb7acxXMxNnUq/HnXleSvprpjEha+ gJJmIkZm6lOWsiGPdS/68qBTSjdXTHztajwoAcED6tYGpxEjKOxsuYZL8H2/Bih4vr W+DPiVo8do1kw== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id CB68ED6408B; Wed, 17 Dec 2025 08:05:37 +0000 (UTC) From: Joel Granados Date: Wed, 17 Dec 2025 09:04:43 +0100 Subject: [PATCH 5/7] sysctl: Add kernel doc to proc_douintvec_conv Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251217-jag-no-macro-conv-v1-5-6e4252687915@kernel.org> References: <20251217-jag-no-macro-conv-v1-0-6e4252687915@kernel.org> In-Reply-To: <20251217-jag-no-macro-conv-v1-0-6e4252687915@kernel.org> To: Kees Cook , Alexander Viro , Christian Brauner , Jan Kara Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, Joel Granados X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1310; i=joel.granados@kernel.org; h=from:subject:message-id; bh=YsUYwAE1O8XtejvUjAcafWn1iQWbLefNUgR/xrWQ3dg=; b=owJ4nAHtARL+kA0DAAoBupfNUreWQU8ByyZiAGlCZEzOIecMN2mx42bK519i1J7nELTWI7sEL 8vcQkkuMTMRdIkBswQAAQoAHRYhBK5HCVcl5jElzssnkLqXzVK3lkFPBQJpQmRMAAoJELqXzVK3 lkFPi0UL/3vdQEWjv9RF3GwEf0C6oGVt6CvLyQAEKEz5hafDHtD/ACZ6McjNPiSJuqNQ9RJaD9D rh5pttf2Gmw3oQxQJaFCHnqo9pqbsQcJ2vNMI+FFkgsLa/scTH0ZVcGzkyc7GHcJCWRQlbgk55X xRUlXR/tqA6QXbgwKAHpqgJ2Hx29l1UoQlNylceBRQextBkYIAC9/ObZlNEe/1dSBU4v71aQ2bg rsfJFljvsxvL4wqvMRBH1oGm8Aw47oznvDupXlpDPgi9R1+MlNlpvDKHU5px2R6XoQcDIOlQZPn Hq+fMnmG9kjegim7sBRG2vejBq2eD07VeDDJXh7ufwYzeWRya88hb/gqqFUJMGSwp9IGSWf+0DM BTghw5eiXfa9/VZQ/J02ne44FUL9tlJ+lrvC4foQrhSYStRVmE4SMjxUaYVx4p+3RmVtmOTAyJW hvznxv0s8MoGLjfCNYIXEKGbafKLeiqCuui5tzJeqcNkefGqqygjTcyHX0jOxb0Cc1bTc/lw1U4 KQ= X-Developer-Key: i=joel.granados@kernel.org; a=openpgp; fpr=F1F8E46D30F0F6C4A45FF4465895FAAC338C6E77 X-Endpoint-Received: by B4 Relay for joel.granados@kernel.org/default with auth_id=239 This commit is making sure that all the functions that are part of the API are documented. Signed-off-by: Joel Granados --- kernel/sysctl.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 5901196a52f98cdd5aba4f50899a58d9bd9d10f9..ed2701acc89821e724b5697665f= 8a795dff8097d 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -656,6 +656,22 @@ static int do_proc_douintvec(const struct ctl_table *t= able, int dir, return do_proc_douintvec_r(table, buffer, lenp, ppos, conv); } =20 +/** + * proc_douintvec_conv - read a vector of unsigned ints with a custom conv= erter + * + * @table: the sysctl table + * @dir: %TRUE if this is a write to the sysctl file + * @buffer: the user buffer + * @lenp: the size of the user buffer + * @ppos: file position + * @conv: Custom converter call back + * + * Reads/writes up to table->maxlen/sizeof(unsigned int) unsigned integer + * values from/to the user buffer, treated as an ASCII string. Negative + * strings are not allowed. + * + * Returns 0 on success + */ int proc_douintvec_conv(const struct ctl_table *table, int dir, void *buff= er, size_t *lenp, loff_t *ppos, int (*conv)(unsigned long *u_ptr, unsigned int *k_ptr, --=20 2.50.1 From nobody Sun Feb 8 16:36:09 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4698F335569; Wed, 17 Dec 2025 08:05:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765958738; cv=none; b=KA6wD/gy5Spla1EvgRdrhlhFGmfncNCUpHKjdk18nC+IffjUeLsgM4uDPHk/Sp8eKD2CbVPvAUiNxIO0vfGiphc4Kg6QS+2uyq6hz2ISVC+GDhmcP7k5CEp1TTGRyMGmx3oOzU0iaPv0kntPqQ8OwFJrdxN3tTBFsUMHvKlqzek= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765958738; c=relaxed/simple; bh=73JBxcdK+wB5zYmzl+V497DJlRPRsqK8N8cyhwP4DE8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=krDCJ0/IpEw9Gx07w4svThfqG50PvOYCQhQCFdXVrPF4CiZGTE8uwzYKbs/oD9+BKymJn8NqVTuxFNMo6JwPl1b43Y4igfJc1CQ6TXLzz85u2oLdxlBPVPaag9sa3TARSPRM4Ut4MGe8fh7cTJlGsXKKVEFmu2ZwpzXy1dubrGM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=V1Vsut5t; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="V1Vsut5t" Received: by smtp.kernel.org (Postfix) with ESMTPS id E2A83C2BCB2; Wed, 17 Dec 2025 08:05:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1765958737; bh=73JBxcdK+wB5zYmzl+V497DJlRPRsqK8N8cyhwP4DE8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=V1Vsut5t/csEQeRhL8gtmtJ0c1lRgeaiuGgjbw/HXypov8ujve+5IJxAWMHqggX/E LFmRzVFueKZbv6ylvKemk2fBDZXmxeSiJeSM0W+RM+7D76/1fQTsms64/FX/lieM0n bdObEUmmtde+zLyyUesMy7xe0ZfbR7zEt07fcmPIplmJseg3e4+6afP3aFE+0SkA2H SLlgMPX3QDwXoB0LU+8OEqQXPVtbbiOFPcqEr3Hqf74xZIkwshcsggKeNNc9lRg/CX fj565F+KKB8EA8aliyaDpd0XkOlw5yqc+/f+mijOaDKmBNSoZXkE8E5tpnUOB/nOL7 dBda1zZw3+BQA== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id DBD02D637A5; Wed, 17 Dec 2025 08:05:37 +0000 (UTC) From: Joel Granados Date: Wed, 17 Dec 2025 09:04:44 +0100 Subject: [PATCH 6/7] sysctl: Replace unidirectional INT converter macros with functions Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251217-jag-no-macro-conv-v1-6-6e4252687915@kernel.org> References: <20251217-jag-no-macro-conv-v1-0-6e4252687915@kernel.org> In-Reply-To: <20251217-jag-no-macro-conv-v1-0-6e4252687915@kernel.org> To: Kees Cook , Alexander Viro , Christian Brauner , Jan Kara Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, Joel Granados X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=10734; i=joel.granados@kernel.org; h=from:subject:message-id; bh=73JBxcdK+wB5zYmzl+V497DJlRPRsqK8N8cyhwP4DE8=; b=owJ4nAHtARL+kA0DAAoBupfNUreWQU8ByyZiAGlCZEzWlszy4uAIDY0G3A3OqiYm01Qm+r+OQ K/viQ8RYgXtFIkBswQAAQoAHRYhBK5HCVcl5jElzssnkLqXzVK3lkFPBQJpQmRMAAoJELqXzVK3 lkFPjl0L/RfURY6GXnUC65eeRYapeR6ZGEgCznKr6z5XLMnbcWICluPPYDDLKseSUO0+k+toatx dRrUwOs0p0YWRx7UxK+enWgcoD5aMRROWvXpNyCBeZKlVCbx+c0tiwvtgmv2vOwyBwH7ww0RzbT ynWUqu6WnjHElfc359xen9vHrTb6KmkYfpiw/uNWsRes483Ita9S/HPZbkCoAKTUWo/kd2IhJrU JICum29wqHqMwqnUvWKWn2nqArlPX3Y1kBJkLT/U4sv43EFBNMkSJLNVghco75+EAsXOuXYe0yX LEnsjmfBnLQo+Yb3J6hCrXCeH8zra8z/qWMspRQ/cyF+BZEC3KTWfr3iOxbJfHdgH73kn9ghF3m l4FlgIQMpa8GiizVw/3sONs+fr7DY+ow0mOG89fb8lOiHhEg9tsitel3JTg4lsN7UyBRhyn0OtK 9XdSPxdXpInQz4U0mdv4Ayya69aDrxgGuaE72K1C/Tq9biHcUXczMCZLlwZDvqzxxCcA9bYAPk6 Zk= X-Developer-Key: i=joel.granados@kernel.org; a=openpgp; fpr=F1F8E46D30F0F6C4A45FF4465895FAAC338C6E77 X-Endpoint-Received: by B4 Relay for joel.granados@kernel.org/default with auth_id=239 Replace SYSCTL_USER_TO_KERN_INT_CONV and SYSCTL_KERN_TO_USER_INT_CONV macros with function implementing the same logic.This makes debugging easier and aligns with the functions preference described in coding-style.rst. Update all jiffies converters to use explicit function implementations instead of macro-generated versions. Signed-off-by: Joel Granados --- include/linux/sysctl.h | 56 ++++--------------------- kernel/sysctl.c | 69 +++++++++++++++++++++++++++++- kernel/time/jiffies.c | 111 +++++++++++++++++++++++++++++++++++++++++----= ---- 3 files changed, 167 insertions(+), 69 deletions(-) diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h index d712992789f0f2f3fe4cec10fb14907b7fd61a7e..655fb85ec29278a3a268e363243= c7f318bf0e75e 100644 --- a/include/linux/sysctl.h +++ b/include/linux/sysctl.h @@ -74,40 +74,6 @@ extern const int sysctl_vals[]; #define SYSCTL_KERN_TO_USER(dir) (!dir) =20 #ifdef CONFIG_PROC_SYSCTL -#define SYSCTL_USER_TO_KERN_INT_CONV(name, u_ptr_op) \ -int sysctl_user_to_kern_int_conv##name(const bool *negp, \ - const unsigned long *u_ptr,\ - int *k_ptr) \ -{ \ - unsigned long u =3D u_ptr_op(*u_ptr); \ - if (*negp) { \ - if (u > (unsigned long) INT_MAX + 1) \ - return -EINVAL; \ - WRITE_ONCE(*k_ptr, -u); \ - } else { \ - if (u > (unsigned long) INT_MAX) \ - return -EINVAL; \ - WRITE_ONCE(*k_ptr, u); \ - } \ - return 0; \ -} - -#define SYSCTL_KERN_TO_USER_INT_CONV(name, k_ptr_op) \ -int sysctl_kern_to_user_int_conv##name(bool *negp, \ - unsigned long *u_ptr, \ - const int *k_ptr) \ -{ \ - int val =3D READ_ONCE(*k_ptr); \ - if (val < 0) { \ - *negp =3D true; \ - *u_ptr =3D -k_ptr_op((unsigned long)val); \ - } else { \ - *negp =3D false; \ - *u_ptr =3D k_ptr_op((unsigned long)val); \ - } \ - return 0; \ -} - /** * To range check on a converted value, use a temp k_ptr * When checking range, value should be within (tbl->extra1, tbl->extra2) @@ -135,22 +101,8 @@ int do_proc_int_conv##name(bool *negp, unsigned long *= u_ptr, int *k_ptr,\ return user_to_kern(negp, u_ptr, k_ptr); \ return 0; \ } + #else // CONFIG_PROC_SYSCTL -#define SYSCTL_USER_TO_KERN_INT_CONV(name, u_ptr_op) \ -int sysctl_user_to_kern_int_conv##name(const bool *negp, \ - const unsigned long *u_ptr,\ - int *k_ptr) \ -{ \ - return -ENOSYS; \ -} - -#define SYSCTL_KERN_TO_USER_INT_CONV(name, k_ptr_op) \ -int sysctl_kern_to_user_int_conv##name(bool *negp, \ - unsigned long *u_ptr, \ - const int *k_ptr) \ -{ \ - return -ENOSYS; \ -} =20 #define SYSCTL_INT_CONV_CUSTOM(name, user_to_kern, kern_to_user, \ k_ptr_range_check) \ @@ -170,6 +122,7 @@ typedef int proc_handler(const struct ctl_table *ctl, i= nt write, void *buffer, int proc_dostring(const struct ctl_table *, int, void *, size_t *, loff_t = *); int proc_dobool(const struct ctl_table *table, int write, void *buffer, size_t *lenp, loff_t *ppos); + int proc_dointvec(const struct ctl_table *, int, void *, size_t *, loff_t = *); int proc_dointvec_minmax(const struct ctl_table *table, int dir, void *buf= fer, size_t *lenp, loff_t *ppos); @@ -177,6 +130,11 @@ int proc_dointvec_conv(const struct ctl_table *table, = int dir, void *buffer, size_t *lenp, loff_t *ppos, int (*conv)(bool *negp, unsigned long *u_ptr, int *k_ptr, int dir, const struct ctl_table *table)); +int proc_int_k2u_conv_kop(ulong *u_ptr, const int *k_ptr, bool *negp, + ulong (*k_ptr_op)(const ulong)); +int proc_int_u2k_conv_uop(const ulong *u_ptr, int *k_ptr, const bool *negp, + ulong (*u_ptr_op)(const ulong)); + int proc_douintvec(const struct ctl_table *, int, void *, size_t *, loff_t= *); int proc_douintvec_minmax(const struct ctl_table *table, int write, void *= buffer, size_t *lenp, loff_t *ppos); diff --git a/kernel/sysctl.c b/kernel/sysctl.c index ed2701acc89821e724b5697665f8a795dff8097d..c3946d7ee6f787855694a0a353c= 173194ccd5c4b 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -458,8 +458,73 @@ static int do_proc_uint_conv_minmax(ulong *u_ptr, uint= *k_ptr, int dir, proc_uint_u2k_conv, proc_uint_k2u_conv); } =20 -static SYSCTL_USER_TO_KERN_INT_CONV(, SYSCTL_CONV_IDENTITY) -static SYSCTL_KERN_TO_USER_INT_CONV(, SYSCTL_CONV_IDENTITY) +/** + * proc_int_k2u_conv_kop - Assign kernel value to a user space pointer + * @u_ptr - pointer to user space variable + * @k_ptr - pointer to kernel variable + * @negp - assigned %TRUE if the converted kernel value is negative; + * %FALSE otherweise + * @k_ptr_op - execute this function before assigning to u_ptr + * + * Uses READ_ONCE to get value from k_ptr. Executes k_ptr_op before assign= ing + * to u_ptr if not NULL. Does **not** check for overflow. + * + * returns 0 on success. + */ +int proc_int_k2u_conv_kop(ulong *u_ptr, const int *k_ptr, bool *negp, + ulong (*k_ptr_op)(const ulong)) +{ + int val =3D READ_ONCE(*k_ptr); + + if (val < 0) { + *negp =3D true; + *u_ptr =3D k_ptr_op ? -k_ptr_op((ulong)val) : -(ulong)val; + } else { + *negp =3D false; + *u_ptr =3D k_ptr_op ? k_ptr_op((ulong)val) : (ulong) val; + } + return 0; +} + +/** + * proc_int_u2k_conv_uop - Assign user value to a kernel pointer + * @u_ptr - pointer to user space variable + * @k_ptr - pointer to kernel variable + * @negp - If %TRUE, the converted user value is made negative. + * @u_ptr_op - execute this function before assigning to k_ptr + * + * Uses WRITE_ONCE to assign value to k_ptr. Executes u_ptr_op if + * not NULL. Check for overflow with UINT_MAX. + * + * returns 0 on success. + */ +int proc_int_u2k_conv_uop(const ulong *u_ptr, int *k_ptr, const bool *negp, + ulong (*u_ptr_op)(const ulong)) +{ + ulong u =3D u_ptr_op ? u_ptr_op(*u_ptr) : *u_ptr; + + if (*negp) { + if (u > (ulong) INT_MAX + 1) + return -EINVAL; + WRITE_ONCE(*k_ptr, -u); + } else { + if (u > (ulong) INT_MAX) + return -EINVAL; + WRITE_ONCE(*k_ptr, u); + } + return 0; +} + +static int sysctl_user_to_kern_int_conv(const bool *negp, const ulong *u_p= tr, + int *k_ptr) +{ + return proc_int_u2k_conv_uop(u_ptr, k_ptr, negp, NULL); +} + +static int sysctl_kern_to_user_int_conv(bool *negp, ulong *u_ptr, const in= t *k_ptr) +{ + return proc_int_k2u_conv_kop(u_ptr, k_ptr, negp, NULL); +} =20 static SYSCTL_INT_CONV_CUSTOM(, sysctl_user_to_kern_int_conv, sysctl_kern_to_user_int_conv, false) diff --git a/kernel/time/jiffies.c b/kernel/time/jiffies.c index d31a6d40d38dc4db696f0bbe205121d73c242177..825e4c9fd26a2c8964b40509f3a= 5129c2b3b9f88 100644 --- a/kernel/time/jiffies.c +++ b/kernel/time/jiffies.c @@ -100,26 +100,101 @@ void __init register_refined_jiffies(long cycles_per= _second) __clocksource_register(&refined_jiffies); } =20 -#define SYSCTL_CONV_MULT_HZ(val) ((val) * HZ) -#define SYSCTL_CONV_DIV_HZ(val) ((val) / HZ) - -static SYSCTL_USER_TO_KERN_INT_CONV(_hz, SYSCTL_CONV_MULT_HZ) -static SYSCTL_KERN_TO_USER_INT_CONV(_hz, SYSCTL_CONV_DIV_HZ) -static SYSCTL_USER_TO_KERN_INT_CONV(_userhz, clock_t_to_jiffies) -static SYSCTL_KERN_TO_USER_INT_CONV(_userhz, jiffies_to_clock_t) -static SYSCTL_USER_TO_KERN_INT_CONV(_ms, msecs_to_jiffies) -static SYSCTL_KERN_TO_USER_INT_CONV(_ms, jiffies_to_msecs) - -static SYSCTL_INT_CONV_CUSTOM(_jiffies, sysctl_user_to_kern_int_conv_hz, - sysctl_kern_to_user_int_conv_hz, false) +#ifdef CONFIG_PROC_SYSCTL +static ulong mult_hz(const ulong val) +{ + return val * HZ; +} + +static ulong div_hz(const ulong val) +{ + return val / HZ; +} + +static int sysctl_u2k_int_conv_hz(const bool *negp, const ulong *u_ptr, in= t *k_ptr) +{ + return proc_int_u2k_conv_uop(u_ptr, k_ptr, negp, mult_hz); +} + +static int sysctl_k2u_int_conv_hz(bool *negp, ulong *u_ptr, const int *k_p= tr) +{ + return proc_int_k2u_conv_kop(u_ptr, k_ptr, negp, div_hz); +} + +static int sysctl_u2k_int_conv_userhz(const bool *negp, const ulong *u_ptr= , int *k_ptr) +{ + return proc_int_u2k_conv_uop(u_ptr, k_ptr, negp, clock_t_to_jiffies); +} + +static ulong sysctl_jiffies_to_clock_t(const ulong val) +{ + return jiffies_to_clock_t(val); +} + +static int sysctl_k2u_int_conv_userhz(bool *negp, ulong *u_ptr, const int = *k_ptr) +{ + return proc_int_k2u_conv_kop(u_ptr, k_ptr, negp, sysctl_jiffies_to_clock_= t); +} + +static ulong sysctl_msecs_to_jiffies(const ulong val) +{ + return msecs_to_jiffies(val); +} + +static int sysctl_u2k_int_conv_ms(const bool *negp, const ulong *u_ptr, in= t *k_ptr) +{ + return proc_int_u2k_conv_uop(u_ptr, k_ptr, negp, sysctl_msecs_to_jiffies); +} + +static ulong sysctl_jiffies_to_msecs(const ulong val) +{ + return jiffies_to_msecs(val); +} + +static int sysctl_k2u_int_conv_ms(bool *negp, ulong *u_ptr, const int *k_p= tr) +{ + return proc_int_k2u_conv_kop(u_ptr, k_ptr, negp, sysctl_jiffies_to_msecs); +} + + +static SYSCTL_INT_CONV_CUSTOM(_jiffies, sysctl_u2k_int_conv_hz, + sysctl_k2u_int_conv_hz, false) static SYSCTL_INT_CONV_CUSTOM(_userhz_jiffies, - sysctl_user_to_kern_int_conv_userhz, - sysctl_kern_to_user_int_conv_userhz, false) -static SYSCTL_INT_CONV_CUSTOM(_ms_jiffies, sysctl_user_to_kern_int_conv_ms, - sysctl_kern_to_user_int_conv_ms, false) + sysctl_u2k_int_conv_userhz, + sysctl_k2u_int_conv_userhz, false) +static SYSCTL_INT_CONV_CUSTOM(_ms_jiffies, sysctl_u2k_int_conv_ms, + sysctl_k2u_int_conv_ms, false) static SYSCTL_INT_CONV_CUSTOM(_ms_jiffies_minmax, - sysctl_user_to_kern_int_conv_ms, - sysctl_kern_to_user_int_conv_ms, true) + sysctl_u2k_int_conv_ms, + sysctl_k2u_int_conv_ms, true) + +#else // CONFIG_PROC_SYSCTL +static int do_proc_int_conv_jiffies(bool *negp, ulong *u_ptr, int *k_ptr, + int dir, const struct ctl_table *tbl) +{ + return -ENOSYS; +} + +static int do_proc_int_conv_userhz_jiffies(bool *negp, ulong *u_ptr, + int *k_ptr, int dir, + const struct ctl_table *tbl) +{ + return -ENOSYS; +} + +static int do_proc_int_conv_ms_jiffies(bool *negp, ulong *u_ptr, int *k_pt= r, + int dir, const struct ctl_table *tbl) +{ + return -ENOSYS; +} + +static int do_proc_int_conv_ms_jiffies_minmax(bool *negp, ulong *u_ptr, + int *k_ptr, int dir, + const struct ctl_table *tbl) +{ + return -ENOSYS; +} +#endif =20 /** * proc_dointvec_jiffies - read a vector of integers as seconds --=20 2.50.1 From nobody Sun Feb 8 16:36:09 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 46A123358A0; Wed, 17 Dec 2025 08:05:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765958738; cv=none; b=uiHCLnF0uAyH1p6fTS7S0/vrE6Dga7qS3iioCbvHHMSYmbS+ifG9Fp6PfPue/+9AaMjxks2sA2sMllfyHkWxf/DFgaOceQgAUilFMRZEflvkQaeczCapNT7wBsmjd2pn7JkJAWFVGnTEXu3Qb1Hm5PQj4ggF/l/GggGWEY5V0us= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765958738; c=relaxed/simple; bh=zCmzNV2VgVZng0qHJyGMBWuMsBOjX52MVm3R4t8BiQA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lDav5yTGY3HQ2kYxyq3jONs921YyU0JOLrnwk6MRTDexDwvdrP7NJNX0WTCoZ+PcP7TFRFkg+h+7qFJiTj1j8Jv1Sfp4iodOvsS69g8aHcscVJ3oPkqDPNGy0KNcRM4pr6CrddiO+dtfPnBbEBo7jaghhST894taFfLIYbTXSBo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=V2/yKQcO; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="V2/yKQcO" Received: by smtp.kernel.org (Postfix) with ESMTPS id F28ADC19422; Wed, 17 Dec 2025 08:05:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1765958738; bh=zCmzNV2VgVZng0qHJyGMBWuMsBOjX52MVm3R4t8BiQA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=V2/yKQcOEVwqzDZLZYSI/JiYPOu4bs3wOJAUICqVxoAaDAd0Ub/tjaJLMp8KnSqmn N1E6jYHyLOugcmI+EslxWPSXRdIV+sCrj764vcnvC9V96fFyaGTIZxoKe6rmnyjTes WXeiNh6JB8Vpnq/pwj8q54ypugoMWaTkHn78KCbok/HJzYIKVYgXOKtTp67KYrNLDQ VDOk8qg+fEnhU7UYwjd4VScO2ycqNR3oDs7cSe2GflT5aJp8fGHeq8pFlH2lrFssmu gjFkxbWPmULVUhHrFo3r70++vDJmiCY2uPUiZgE+29WkhWgeoCO/5FTztwmhLYIYUY i9o22g0IG93KQ== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id EBB3CD6408A; Wed, 17 Dec 2025 08:05:37 +0000 (UTC) From: Joel Granados Date: Wed, 17 Dec 2025 09:04:45 +0100 Subject: [PATCH 7/7] sysctl: replace SYSCTL_INT_CONV_CUSTOM macro with functions Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251217-jag-no-macro-conv-v1-7-6e4252687915@kernel.org> References: <20251217-jag-no-macro-conv-v1-0-6e4252687915@kernel.org> In-Reply-To: <20251217-jag-no-macro-conv-v1-0-6e4252687915@kernel.org> To: Kees Cook , Alexander Viro , Christian Brauner , Jan Kara Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, Joel Granados X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=7713; i=joel.granados@kernel.org; h=from:subject:message-id; bh=zCmzNV2VgVZng0qHJyGMBWuMsBOjX52MVm3R4t8BiQA=; b=owJ4nAHtARL+kA0DAAoBupfNUreWQU8ByyZiAGlCZE3C8q5hCuRElgiy3Kz7bcRNx3Uslp5aM KKm7gXb8MU6aokBswQAAQoAHRYhBK5HCVcl5jElzssnkLqXzVK3lkFPBQJpQmRNAAoJELqXzVK3 lkFPY3sL/jDJ3XaDJoww/90pPcJ5qCUQr4MsAfKAeT13haWJxSgb8A0HJLVVUW4spVyvRa7mCzw bHC/HFmdN8ouGylANT7dYtEmmQSPOW9iBBl8Le1jHiN1seyZA6dKjoXrPpl01yCm3mnG7whlnlB jaZFPntdelQikij9KpJSDtOQ1qPXouBw+bTkcRE8f+s/e76XIeKAYpF6Yaam/dTECdV957rDiwm WfjMrYkcwHonur9LL3M3e812WmGsZX2OBm4FJXqZel6vEyo3HsLWS2H2j9oshdhAWA5n1CwBkoW 01XaRqT2d8n8l0piVefpUmtGsYTL2k30Wyc6IIJTjx1I/U8QY7p942Zq+w3goS4Jz031He5Rccr YJIgBuUUfghh0KTELU/9SPHCA0K37y1oZFmr2Zi8VW2+2aVCZ4Q0/QTFEdKdh68t3O3KIsSG9Fc C8Ob+ibJ4AygwU1rqlcyQwUvPpWMk75dHr0CQDTYvHmRz/H0O0zWgrOiE1CyyBV346z+08Zccw4 DM= X-Developer-Key: i=joel.granados@kernel.org; a=openpgp; fpr=F1F8E46D30F0F6C4A45FF4465895FAAC338C6E77 X-Endpoint-Received: by B4 Relay for joel.granados@kernel.org/default with auth_id=239 Remove SYSCTL_INT_CONV_CUSTOM and replace it with proc_int_conv. This converter function expects a negp argument as it can take on negative values. Update all jiffies converters to use explicit function calls. Remove SYSCTL_CONV_IDENTITY as it is no longer used. Signed-off-by: Joel Granados --- include/linux/sysctl.h | 46 ++++------------------------------------------ kernel/sysctl.c | 47 +++++++++++++++++++++++++++++++++++++++++++---- kernel/time/jiffies.c | 39 +++++++++++++++++++++++++++++---------- 3 files changed, 76 insertions(+), 56 deletions(-) diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h index 655fb85ec29278a3a268e363243c7f318bf0e75e..2886fbceb5d635fc7e0282c7467= dcf82708919fe 100644 --- a/include/linux/sysctl.h +++ b/include/linux/sysctl.h @@ -59,7 +59,6 @@ extern const int sysctl_vals[]; #define SYSCTL_LONG_ONE ((void *)&sysctl_long_vals[1]) #define SYSCTL_LONG_MAX ((void *)&sysctl_long_vals[2]) =20 -#define SYSCTL_CONV_IDENTITY(val) (val) /** * * "dir" originates from read_iter (dir =3D 0) or write_iter (dir =3D 1) @@ -73,47 +72,6 @@ extern const int sysctl_vals[]; #define SYSCTL_USER_TO_KERN(dir) (!!(dir)) #define SYSCTL_KERN_TO_USER(dir) (!dir) =20 -#ifdef CONFIG_PROC_SYSCTL -/** - * To range check on a converted value, use a temp k_ptr - * When checking range, value should be within (tbl->extra1, tbl->extra2) - */ -#define SYSCTL_INT_CONV_CUSTOM(name, user_to_kern, kern_to_user, \ - k_ptr_range_check) \ -int do_proc_int_conv##name(bool *negp, unsigned long *u_ptr, int *k_ptr,\ - int dir, const struct ctl_table *tbl) \ -{ \ - if (SYSCTL_KERN_TO_USER(dir)) \ - return kern_to_user(negp, u_ptr, k_ptr); \ - \ - if (k_ptr_range_check) { \ - int tmp_k, ret; \ - if (!tbl) \ - return -EINVAL; \ - ret =3D user_to_kern(negp, u_ptr, &tmp_k); \ - if (ret) \ - return ret; \ - if ((tbl->extra1 && *(int *)tbl->extra1 > tmp_k) || \ - (tbl->extra2 && *(int *)tbl->extra2 < tmp_k)) \ - return -EINVAL; \ - WRITE_ONCE(*k_ptr, tmp_k); \ - } else \ - return user_to_kern(negp, u_ptr, k_ptr); \ - return 0; \ -} - -#else // CONFIG_PROC_SYSCTL - -#define SYSCTL_INT_CONV_CUSTOM(name, user_to_kern, kern_to_user, \ - k_ptr_range_check) \ -int do_proc_int_conv##name(bool *negp, unsigned long *u_ptr, int *k_ptr,\ - int dir, const struct ctl_table *tbl) \ -{ \ - return -ENOSYS; \ -} - -#endif // CONFIG_PROC_SYSCTL - extern const unsigned long sysctl_long_vals[]; =20 typedef int proc_handler(const struct ctl_table *ctl, int write, void *buf= fer, @@ -134,6 +92,10 @@ int proc_int_k2u_conv_kop(ulong *u_ptr, const int *k_pt= r, bool *negp, ulong (*k_ptr_op)(const ulong)); int proc_int_u2k_conv_uop(const ulong *u_ptr, int *k_ptr, const bool *negp, ulong (*u_ptr_op)(const ulong)); +int proc_int_conv(bool *negp, ulong *u_ptr, int *k_ptr, int dir, + const struct ctl_table *tbl, bool k_ptr_range_check, + int (*user_to_kern)(const bool *negp, const ulong *u_ptr, int *k_ptr), + int (*kern_to_user)(bool *negp, ulong *u_ptr, const int *k_ptr)); =20 int proc_douintvec(const struct ctl_table *, int, void *, size_t *, loff_t= *); int proc_douintvec_minmax(const struct ctl_table *table, int write, void *= buffer, diff --git a/kernel/sysctl.c b/kernel/sysctl.c index c3946d7ee6f787855694a0a353c173194ccd5c4b..caee1bd8b2afc0927e0dcdd33c0= db41c87518bfb 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -515,6 +515,33 @@ int proc_int_u2k_conv_uop(const ulong *u_ptr, int *k_p= tr, const bool *negp, return 0; } =20 +int proc_int_conv(bool *negp, ulong *u_ptr, int *k_ptr, int dir, + const struct ctl_table *tbl, bool k_ptr_range_check, + int (*user_to_kern)(const bool *negp, const ulong *u_ptr, int *k_ptr), + int (*kern_to_user)(bool *negp, ulong *u_ptr, const int *k_ptr)) +{ + if (SYSCTL_KERN_TO_USER(dir)) + return kern_to_user(negp, u_ptr, k_ptr); + + if (k_ptr_range_check) { + int tmp_k, ret; + + if (!tbl) + return -EINVAL; + ret =3D user_to_kern(negp, u_ptr, &tmp_k); + if (ret) + return ret; + if ((tbl->extra1 && *(int *)tbl->extra1 > tmp_k) || + (tbl->extra2 && *(int *)tbl->extra2 < tmp_k)) + return -EINVAL; + WRITE_ONCE(*k_ptr, tmp_k); + } else + return user_to_kern(negp, u_ptr, k_ptr); + return 0; +} + + + static int sysctl_user_to_kern_int_conv(const bool *negp, const ulong *u_p= tr, int *k_ptr) { @@ -526,10 +553,22 @@ static int sysctl_kern_to_user_int_conv(bool *negp, u= long *u_ptr, const int *k_p return proc_int_k2u_conv_kop(u_ptr, k_ptr, negp, NULL); } =20 -static SYSCTL_INT_CONV_CUSTOM(, sysctl_user_to_kern_int_conv, - sysctl_kern_to_user_int_conv, false) -static SYSCTL_INT_CONV_CUSTOM(_minmax, sysctl_user_to_kern_int_conv, - sysctl_kern_to_user_int_conv, true) +static int do_proc_int_conv(bool *negp, unsigned long *u_ptr, int *k_ptr, + int dir, const struct ctl_table *tbl) +{ + return proc_int_conv(negp, u_ptr, k_ptr, dir, tbl, false, + sysctl_user_to_kern_int_conv, + sysctl_kern_to_user_int_conv); + +} + +static int do_proc_int_conv_minmax(bool *negp, unsigned long *u_ptr, int *= k_ptr, + int dir, const struct ctl_table *tbl) +{ + return proc_int_conv(negp, u_ptr, k_ptr, dir, tbl, true, + sysctl_user_to_kern_int_conv, + sysctl_kern_to_user_int_conv); +} =20 static const char proc_wspace_sep[] =3D { ' ', '\t', '\n' }; =20 diff --git a/kernel/time/jiffies.c b/kernel/time/jiffies.c index 825e4c9fd26a2c8964b40509f3a5129c2b3b9f88..a5c7d15fce72fd2c8c8a0e0b9e4= 0901534152124 100644 --- a/kernel/time/jiffies.c +++ b/kernel/time/jiffies.c @@ -156,17 +156,36 @@ static int sysctl_k2u_int_conv_ms(bool *negp, ulong *= u_ptr, const int *k_ptr) return proc_int_k2u_conv_kop(u_ptr, k_ptr, negp, sysctl_jiffies_to_msecs); } =20 +static int do_proc_int_conv_jiffies(bool *negp, ulong *u_ptr, int *k_ptr, + int dir, const struct ctl_table *tbl) +{ + return proc_int_conv(negp, u_ptr, k_ptr, dir, tbl, false, + sysctl_u2k_int_conv_hz, sysctl_k2u_int_conv_hz); +} =20 -static SYSCTL_INT_CONV_CUSTOM(_jiffies, sysctl_u2k_int_conv_hz, - sysctl_k2u_int_conv_hz, false) -static SYSCTL_INT_CONV_CUSTOM(_userhz_jiffies, - sysctl_u2k_int_conv_userhz, - sysctl_k2u_int_conv_userhz, false) -static SYSCTL_INT_CONV_CUSTOM(_ms_jiffies, sysctl_u2k_int_conv_ms, - sysctl_k2u_int_conv_ms, false) -static SYSCTL_INT_CONV_CUSTOM(_ms_jiffies_minmax, - sysctl_u2k_int_conv_ms, - sysctl_k2u_int_conv_ms, true) +static int do_proc_int_conv_userhz_jiffies(bool *negp, ulong *u_ptr, + int *k_ptr, int dir, + const struct ctl_table *tbl) +{ + return proc_int_conv(negp, u_ptr, k_ptr, dir, tbl, false, + sysctl_u2k_int_conv_userhz, + sysctl_k2u_int_conv_userhz); +} + +static int do_proc_int_conv_ms_jiffies(bool *negp, ulong *u_ptr, int *k_pt= r, + int dir, const struct ctl_table *tbl) +{ + return proc_int_conv(negp, u_ptr, k_ptr, dir, tbl, false, + sysctl_u2k_int_conv_ms, sysctl_k2u_int_conv_ms); +} + +static int do_proc_int_conv_ms_jiffies_minmax(bool *negp, ulong *u_ptr, + int *k_ptr, int dir, + const struct ctl_table *tbl) +{ + return proc_int_conv(negp, u_ptr, k_ptr, dir, tbl, false, + sysctl_u2k_int_conv_ms, sysctl_k2u_int_conv_ms); +} =20 #else // CONFIG_PROC_SYSCTL static int do_proc_int_conv_jiffies(bool *negp, ulong *u_ptr, int *k_ptr, --=20 2.50.1