From nobody Tue Feb 10 02:00:43 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 04DFF337B8C; Fri, 19 Dec 2025 12:16:11 +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=1766146572; cv=none; b=WBrB0eJwotqyFpdLo/yGM7r/OKAVtqeg/NR++z/Wc2Rcy570CrOJ2v+HxfDI9LMY2mVScK0MvGmpw2VZSwpUPwCxfZhO48EMqirkpyc3DjUx+fFe0mhcSncNV1iME3Edo95L2DjUN7on1ShJT4EH0q0WzswnBHmBLH0PbnPQpXw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766146572; c=relaxed/simple; bh=BttYzFF+xjDCiXPSwOn5xmsY105yRYbvY3nWA/ZGsJo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=TgTkWvw0ZFgSFaHtLhn8/vNQRi8kWPKUWYEyuWxNW7Xd22rpx9gc90XaPyiouhZ6Pwl2Djw4R10z51qv7vN0dPR6oVmC23t3FWtPQhDDboM6efGDF4Fr3GfMunh7DXDTzh9eXOg7z0mebs/KF3YZgw2lUfAHkH97OGsVTBuYISA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=PgEmvRPD; 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="PgEmvRPD" Received: by smtp.kernel.org (Postfix) with ESMTPS id 91091C113D0; Fri, 19 Dec 2025 12:16:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1766146571; bh=BttYzFF+xjDCiXPSwOn5xmsY105yRYbvY3nWA/ZGsJo=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=PgEmvRPD5xYIi01ZU9qWAcsQ8JFmenkUcWBIIXu0366nXrIj5Kzl/Z3/ThWQLgDVG AVyR62AxCMhaMHttPodzkV7YtO1Bwvk5PKb8QPsjF80A51mq4bjEPftPHYeRmuo1Cj PvGWb9cVJqIGBB0TT3Hmvkvb72DOUUp+4TAv6cW0SyFTazmwtcyXqWkjitsTkqV4Oo TMlWfc0elAykHxD+VYNtDq7dJSI5swVxXWiMdmbfwRF6iA3i1SfA+6bpTpKZvpIYuF OhX4fJFnELHYgb6i4GX/0UlvQZOWVUFkifEhoxzD3eswHcrQlHmUk7qJbKrpUnz767 hBQT62dRjPWmw== 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 7CB8CD767EE; Fri, 19 Dec 2025 12:16:11 +0000 (UTC) From: Joel Granados Date: Fri, 19 Dec 2025 13:15:52 +0100 Subject: [PATCH 1/9] sysctl: Move default converter assignment out of do_proc_dointvec 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: <20251219-jag-dovec_consolidate-v1-1-1413b92c6040@kernel.org> References: <20251219-jag-dovec_consolidate-v1-0-1413b92c6040@kernel.org> In-Reply-To: <20251219-jag-dovec_consolidate-v1-0-1413b92c6040@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=1599; i=joel.granados@kernel.org; h=from:subject:message-id; bh=BttYzFF+xjDCiXPSwOn5xmsY105yRYbvY3nWA/ZGsJo=; b=owJ4nAHtARL+kA0DAAoBupfNUreWQU8ByyZiAGlFQgRMtizYR9OYfeMjw7pycCr20q/WRljNv Gv7AtsSvdGWWIkBswQAAQoAHRYhBK5HCVcl5jElzssnkLqXzVK3lkFPBQJpRUIEAAoJELqXzVK3 lkFPwrIL/0iqyDLEk1RhmqSMkosxAUAybbbCK4smGes4JaXl8BHioW4tZycsI6h2HCNiTXaXOru IvIXurtl6sXky1KuZ+xH50ynenFebFbsbCjPSbGrF0dU5QiKc8iPkritOe8xPeU3GqwNLMpb72k tm330e3TYbYuJWCJj64ruZbsYZID4sBhRD1FW835FOT8XzeUCkYAML7YqpKVBTVVN6k5F7l+ZlW Lkaq6r25AmPFhkq9F+CZQJirk0Wip5O53b4hnlpKR3QMkVAoKOuno+PaN7s4oxJ2Vo8teWNh3jX KO8f+TBapGhhY70TJye2Y8ff4eacLQuP36M/LH3zzzZJZF2H28B8hgT7Z319yME/VkzDfI/CJd1 qMrpTI5rj5JNfbTUU8EnjdLdxoCZZp+BB9W+WQtrYjQjB+pkSX214bWeETdooaGVC67fkZnvejR 9FCJaz71ZYpPPNp61hy4mdH305OI7B3vfaohWSfkzi5bLjqmqaikxTbfou9Fbq7ZgBr1u9L/Q17 dY= 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 Move the converter assignment out of do_proc_dointvec into the caller. Both the test for NULL and the assignment are meant to stay within the sysctl.c context. This is in preparation of using a typed macro to for the integer proc vector function. Signed-off-by: Joel Granados --- kernel/sysctl.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/kernel/sysctl.c b/kernel/sysctl.c index caee1bd8b2afc0927e0dcdd33c0db41c87518bfb..284ad6c277e8b52177cca3153ac= f02ff39de17f0 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -591,9 +591,6 @@ static int do_proc_dointvec(const struct ctl_table *tab= le, int dir, vleft =3D table->maxlen / sizeof(*i); left =3D *lenp; =20 - if (!conv) - conv =3D do_proc_int_conv; - if (SYSCTL_USER_TO_KERN(dir)) { if (proc_first_pos_non_zero_ignore(ppos, table)) goto out; @@ -840,7 +837,7 @@ int proc_dobool(const struct ctl_table *table, int dir,= void *buffer, int proc_dointvec(const struct ctl_table *table, int dir, void *buffer, size_t *lenp, loff_t *ppos) { - return do_proc_dointvec(table, dir, buffer, lenp, ppos, NULL); + return do_proc_dointvec(table, dir, buffer, lenp, ppos, do_proc_int_conv); } =20 /** @@ -1074,6 +1071,8 @@ int proc_dointvec_conv(const struct ctl_table *table,= int dir, void *buffer, int (*conv)(bool *negp, unsigned long *u_ptr, int *k_ptr, int dir, const struct ctl_table *table)) { + if (!conv) + conv =3D do_proc_int_conv; return do_proc_dointvec(table, dir, buffer, lenp, ppos, conv); } =20 --=20 2.50.1 From nobody Tue Feb 10 02:00:43 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 04D03337B84; Fri, 19 Dec 2025 12:16:11 +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=1766146572; cv=none; b=j3EyK9/BijjvDJy4vnSqIrIa1om9QM4XcXpy2kkIXtVONyXEYxuDlnKH34Zg923OFZxqa6neerTrEoYojY//BjHg2Yi8s9/R1bb2lr+1iUXXHe4aKc3kkjDzXiJe4zok7D79bXr2hAWKNFjr6HJWE0WAJqDsFlClrPPl9wvWZ40= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766146572; c=relaxed/simple; bh=C2CiSX+3NOlsc9EOUTFYNZR5sIzoS6WVYi1ixR9Wg44=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=uGUO/5LZNh2qjC1yu759OZMOarSdpRL3YVWTcGCvqQ/t9EYnBAqqxMrQacvSLfe4wS9l68TzW0YZZJ9TCHfPwNqOdhQHPPs5l9WqtnkBDiVE355nO9iNh4aqt4lzas3JcuK3+TSlUBbApKYN8XGgxTxe7IIxKkhAsaKN/wh4XR4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Fn14jkGZ; 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="Fn14jkGZ" Received: by smtp.kernel.org (Postfix) with ESMTPS id 9CF10C116D0; Fri, 19 Dec 2025 12:16:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1766146571; bh=C2CiSX+3NOlsc9EOUTFYNZR5sIzoS6WVYi1ixR9Wg44=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Fn14jkGZKoTjFWyXoZIZG6hNTCWgDW9PZq6l4zjWQzN3nHaAZWLdFUkEqWd7P2qOw jI4qMX5xKDj5wK52FDwaIH1a62SOy2zSpCozNJkAccxjzfw7Ktxy4OuHeSYAwjtJVK aOLsBEgJUYDDyVl3QIB9vrE3lRYQlrjPDSyMScGfNi5ETgOZQvbAmzDyNVx7cY7gEM kzKYikMYxE+91qfPQUydFT40BtO0reodwtOXH5bi+18yhQtuTS1ptE+0bqkKXyS59R HTNOfyI/2XXfUgri7y2tpZYZgpdvoGeWTcTg3FXs1FpT483U8P/O5XC/7l3Qr+/yFd /IRbzUsRwmFfw== 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 8A956D78761; Fri, 19 Dec 2025 12:16:11 +0000 (UTC) From: Joel Granados Date: Fri, 19 Dec 2025 13:15:53 +0100 Subject: [PATCH 2/9] sysctl: Replace do_proc_dointvec with a type-generic macro 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: <20251219-jag-dovec_consolidate-v1-2-1413b92c6040@kernel.org> References: <20251219-jag-dovec_consolidate-v1-0-1413b92c6040@kernel.org> In-Reply-To: <20251219-jag-dovec_consolidate-v1-0-1413b92c6040@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=4959; i=joel.granados@kernel.org; h=from:subject:message-id; bh=C2CiSX+3NOlsc9EOUTFYNZR5sIzoS6WVYi1ixR9Wg44=; b=owJ4nAHtARL+kA0DAAoBupfNUreWQU8ByyZiAGlFQgVv4z9XDuX1mY5xQRjIopXVim68ykErq 95+2gBockDcrIkBswQAAQoAHRYhBK5HCVcl5jElzssnkLqXzVK3lkFPBQJpRUIFAAoJELqXzVK3 lkFP2lEMAJUgaWSzGeFvf8UYl30vF9V7ekLPEMAKE0htODrEJoJCKpJBAlv6Abj7VbKR772RFje 1HWOO6M8IxNZrsQ0iBSayj1SiSrfvcwx8FYJxlywSr5Wr3BwfeclN0dWbgI3tVHVfW1ymdwDEuA +TZtN/COJZRaGck4Kd/GYYqf95SgoUKhV96tnhhDzGh2xML4jfBItN4O2DK2YZkoiWlTNfUTVpt FOrc1kSl4C3UrCCRiYu5vg6kGsVkl33hWxVmPkvsn7qeRBmxZ/oEjB0Hq1s/+o2g9m87QcuEjsh WnLK8N4I1oA5nUy3XwL9mlb+5oDa1B8FT+IQs26bc4RjnD8cZlZ92n+QTs88KwkYJj710u33a7n R+MaW3Qp2jvMKRw+GcgQu8pkemfEEqP0Zzl9aewvTU1biFMfJBxCaknqJllvIr6FKWcGK7JQcgl iNAVCPDbUpHiWcOIXcdAcIG3CUYfV9dAQmeRLIcyMICjZz5fhChubyJJ5FlYq3mpJ3sesjxGHS3 0g= 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 Replaces do_proc_dointvec with do_proc_dotypevec macro. For now, it only generates the integer function, but it will bring together the logic for int, uint and ulong proc vector functions. It is parametrized on the kernel pointer type being processed and generates a "do_proc_do##T##vec" (where T is the type) function. The parametrization is needed for advancing the for loop with "++" and affects the type of the k_ptr argument in the converter call back function. Add a comment to clarify that the macro is **not** designed to be exported outside of sysctl.c. Signed-off-by: Joel Granados --- kernel/sysctl.c | 142 ++++++++++++++++++++++++++++++----------------------= ---- 1 file changed, 75 insertions(+), 67 deletions(-) diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 284ad6c277e8b52177cca3153acf02ff39de17f0..66db2ac69a91ac4b200cb8906dc= b76209bee28bb 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -572,75 +572,83 @@ static int do_proc_int_conv_minmax(bool *negp, unsign= ed long *u_ptr, int *k_ptr, =20 static const char proc_wspace_sep[] =3D { ' ', '\t', '\n' }; =20 -static int do_proc_dointvec(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 *i, vleft, first =3D 1, err =3D 0; - size_t left; - char *p; - - if (!table->data || !table->maxlen || !*lenp || - (*ppos && SYSCTL_KERN_TO_USER(dir))) { - *lenp =3D 0; - return 0; - } - - i =3D (int *) table->data; - vleft =3D table->maxlen / sizeof(*i); - left =3D *lenp; - - if (SYSCTL_USER_TO_KERN(dir)) { - if (proc_first_pos_non_zero_ignore(ppos, table)) - goto out; - - if (left > PAGE_SIZE - 1) - left =3D PAGE_SIZE - 1; - p =3D buffer; - } - - for (; left && vleft--; i++, first=3D0) { - unsigned long lval; - bool neg; - - if (SYSCTL_USER_TO_KERN(dir)) { - proc_skip_spaces(&p, &left); - - if (!left) - break; - err =3D proc_get_long(&p, &left, &lval, &neg, - proc_wspace_sep, - sizeof(proc_wspace_sep), NULL); - if (err) - break; - if (conv(&neg, &lval, i, 1, table)) { - err =3D -EINVAL; - break; - } - } else { - if (conv(&neg, &lval, i, 0, table)) { - err =3D -EINVAL; - break; - } - if (!first) - proc_put_char(&buffer, &left, '\t'); - proc_put_long(&buffer, &left, lval, neg); - } - } - - if (SYSCTL_KERN_TO_USER(dir) && !first && left && !err) - proc_put_char(&buffer, &left, '\n'); - if (SYSCTL_USER_TO_KERN(dir) && !err && left) - proc_skip_spaces(&p, &left); - if (SYSCTL_USER_TO_KERN(dir) && first) - return err ? : -EINVAL; - *lenp -=3D left; -out: - *ppos +=3D *lenp; - return err; +/* + * Do not export this macro outside the sysctl subsys. + * It is meant to generate static functions only + */ +#define do_proc_dotypevec(T) \ +static int do_proc_do##T##vec(const struct ctl_table *table, int dir, \ + void *buffer, size_t *lenp, loff_t *ppos, \ + int (*conv)(bool *negp, ulong *u_ptr, T *k_ptr, \ + int dir, const struct ctl_table *table)) \ +{ \ + T *i; \ + int vleft, first =3D 1, err =3D 0; \ + size_t left; \ + char *p; \ +\ + if (!table->data || !table->maxlen || !*lenp || \ + (*ppos && SYSCTL_KERN_TO_USER(dir))) { \ + *lenp =3D 0; \ + return 0; \ + } \ +\ + i =3D (typeof(i)) table->data; \ + vleft =3D table->maxlen / sizeof(*i); \ + left =3D *lenp; \ +\ + if (SYSCTL_USER_TO_KERN(dir)) { \ + if (proc_first_pos_non_zero_ignore(ppos, table)) \ + goto out; \ +\ + if (left > PAGE_SIZE - 1) \ + left =3D PAGE_SIZE - 1; \ + p =3D buffer; \ + } \ +\ + for (; left && vleft--; i++, first =3D 0) { \ + unsigned long lval; \ + bool neg; \ +\ + if (SYSCTL_USER_TO_KERN(dir)) { \ + proc_skip_spaces(&p, &left); \ +\ + if (!left) \ + break; \ + err =3D proc_get_long(&p, &left, &lval, &neg, \ + proc_wspace_sep, \ + sizeof(proc_wspace_sep), NULL); \ + if (err) \ + break; \ + if (conv(&neg, &lval, i, dir, table)) { \ + err =3D -EINVAL; \ + break; \ + } \ + } else { \ + if (conv(&neg, &lval, i, dir, table)) { \ + err =3D -EINVAL; \ + break; \ + } \ + if (!first) \ + proc_put_char(&buffer, &left, '\t'); \ + proc_put_long(&buffer, &left, lval, neg); \ + } \ + } \ +\ + if (SYSCTL_KERN_TO_USER(dir) && !first && left && !err) \ + proc_put_char(&buffer, &left, '\n'); \ + if (SYSCTL_USER_TO_KERN(dir) && !err && left) \ + proc_skip_spaces(&p, &left); \ + if (SYSCTL_USER_TO_KERN(dir) && first) \ + return err ? : -EINVAL; \ + *lenp -=3D left; \ +out: \ + *ppos +=3D *lenp; \ + return err; \ } =20 +do_proc_dotypevec(int) + static int do_proc_douintvec_w(const struct ctl_table *table, void *buffer, size_t *lenp, loff_t *ppos, int (*conv)(unsigned long *u_ptr, --=20 2.50.1 From nobody Tue Feb 10 02:00:43 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 058D9338587; Fri, 19 Dec 2025 12:16:11 +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=1766146572; cv=none; b=ADPwUSSCU6AGVmXA8zbypgK7fBBj2L0oYM/aWzQX39wiIugFwgl5Y7RsmdijPrDjgWKcA2ibEvYBs9VVnu+JMY8kNIDv871XEzGyePKL7hBSnmfcFH4oBO7vxDneDY9rz0V68WexaYWKuOlvW8rlZ0JwCWh/yC1NZeQ4Yud3IdQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766146572; c=relaxed/simple; bh=sIciuy7TQL3b59wE7oGiqEVET2H+ribgyrg6CCyYXaA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=hosPDlDXJd+xCkhZc6hq1Zq6FULhtN/vIWjggoYIwA8gQsnUSgx+z6IBMFDmd4/ZBsdOcxeCJx0shG1EIofMDOjyn262+aiCMtMOX7xIO+9pIx5Gj53RQqQ/yc7A64H/8389oS96Uu9vAhRD4fCLgtCzs29oDkzVmBOcCLSrDm4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=HZqiL0Qj; 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="HZqiL0Qj" Received: by smtp.kernel.org (Postfix) with ESMTPS id AFF70C19422; Fri, 19 Dec 2025 12:16:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1766146571; bh=sIciuy7TQL3b59wE7oGiqEVET2H+ribgyrg6CCyYXaA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=HZqiL0QjvAmVJ1ZJb8hl4YpSkf1MzLuaKf0VebxC58cNqmZbRMc7fSbSMdySStOEK GApiA+g2fZ33edMZlFOX2QVKYPwkFzn3SDBfiFfGIrq5AATslu3uWxA8JK/JhANUBM 3y+OBE4STSJEnUPbCUUG3HhzIFrEWc3GNjwAZF13kNXJG5D3PiypyWpH+A3iDjSGL7 qCrtb+xLTrlgTDZCzr6cjdu3TKMKjgjFLBNwknv0W7/3hhAyqlhv8YD91xwqWPReoG 4TBGh6Pq7e8eTcCsIg15pHxstbpiSrvpDfATLbnvc75A6gmm9qJ0oXDVDchPuvFIA6 ocPMkOiZ8H5fQ== 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 98578D78763; Fri, 19 Dec 2025 12:16:11 +0000 (UTC) From: Joel Granados Date: Fri, 19 Dec 2025 13:15:54 +0100 Subject: [PATCH 3/9] sysctl: Generate do_proc_doulongvec_minmax with do_proc_dotypevec macro 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: <20251219-jag-dovec_consolidate-v1-3-1413b92c6040@kernel.org> References: <20251219-jag-dovec_consolidate-v1-0-1413b92c6040@kernel.org> In-Reply-To: <20251219-jag-dovec_consolidate-v1-0-1413b92c6040@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=12050; i=joel.granados@kernel.org; h=from:subject:message-id; bh=sIciuy7TQL3b59wE7oGiqEVET2H+ribgyrg6CCyYXaA=; b=owJ4nAHtARL+kA0DAAoBupfNUreWQU8ByyZiAGlFQgWNvJl8xj5a5ehzINtZIaRdyXlWobtmd PV+sPQB+97d2YkBswQAAQoAHRYhBK5HCVcl5jElzssnkLqXzVK3lkFPBQJpRUIFAAoJELqXzVK3 lkFPmYYL/jtLP49EQSrye3aNEVk+gGgZqfP8w3Vyy+IXfi5WPrX0nkSF45movC4qKU3vvgxre/6 Y1pONd0jjYLjEq5BIID0MeuSaRLjfMEV55FNXj4X/dFXpUWK+9h/Sw6oJKWmy/X6Lzz+r0ewrly kWlAYQlW+2kvq4OID/IVYN/uppAeBRxEP629wx2tdUCNNHc+8Wq9HtZv2Z7YctqG4zacTv0gCVP 7rSVyi7tKufSK4EtNy3rc3eg8zaPo/ZU5KTugynAsno+bWs7Nzt1nX0t3wW5OF4HlQERg32gyV2 nQF9LqUkvTDhcomo8CUUFxJO6hEpG6qO30yYJGaVUGdsyDklr5pRQOP3bhtdz7dqpEdOF1zdhye PJnND8UwxOF+IjCZceJ03NrTq5qDEX6UklQLop2aREt4aFNWpIAhTPb2tTU2aKexNebFbUxmuN4 N5yxxFftANnrKVwWKZJz8z6/AjECl8Fkco/siqS4xa69i5prYx6+nFjjVS0OWQUhA9AqGKmtCX7 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 The existing do_proc_doulongvec_minmax conversions (based on conv{mul,div}) are replaced with a call to a converter callback that is passed by the caller. Replace the values (HZ, 1000l) passed to proc_doulongvec_minmax_conv in jiffies.c with a new callback containing millisecond to jiffie conversion (do_proc_ulong_conv_ms_jiffies). This effectively changes the simple calculation based on HZ and 1000l to a more robust conversion based on {_,}_msecs_to_jiffies. Change specifics =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D * sysctl.h API - Implement new ulong uni & bi-directional converters (proc_ulong_*); export them so they can be used in proc_doulongvec_ms_jiffies_minmax (jiffies.c). - Replace two arguments (conv{mul,div}) in proc_doulongvec_minmax_conv with a general converter callback function that will be forwarded to do_proc_doulongvec. * do_proc_doulongvec - Replace the hardcoded uni-directional converters with a call to the call back converter function - Generate do_proc_doulongvec with do_proc_dotypevec macro - Rename do_proc_doulongvec_minmax to do_proc_doulongvec * jiffies - Create uni and bi-directional converters for milliseconds to jiffies (sysctl_{u2k,k2u}_ulong_conv_ms, do_proc_ulong_conv_ms_jiffies) - Pass the new bi-directional converter to proc_doulongvec_minmax_conv. Signed-off-by: Joel Granados --- include/linux/sysctl.h | 11 ++- kernel/sysctl.c | 182 ++++++++++++++++++++++++++++++---------------= ---- kernel/time/jiffies.c | 26 ++++++- 3 files changed, 148 insertions(+), 71 deletions(-) diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h index 2886fbceb5d635fc7e0282c7467dcf82708919fe..5c8c17f98513983a459c54eae99= d1cc8bd63b011 100644 --- a/include/linux/sysctl.h +++ b/include/linux/sysctl.h @@ -117,11 +117,20 @@ int proc_dou8vec_minmax(const struct ctl_table *table= , int write, void *buffer, int proc_doulongvec_minmax(const struct ctl_table *, int, void *, size_t *= , loff_t *); int proc_doulongvec_minmax_conv(const struct ctl_table *table, int dir, void *buffer, size_t *lenp, loff_t *ppos, - unsigned long convmul, unsigned long convdiv); + int (*conv)(bool *negp, ulong *u_ptr, ulong *k_ptr, + int dir, const struct ctl_table *table)); 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); =20 +int proc_ulong_u2k_conv_uop(const ulong *u_ptr, ulong *k_ptr, + ulong (*u_ptr_op)(const ulong)); +int proc_ulong_k2u_conv_kop(ulong *u_ptr, const ulong *k_ptr, + ulong (*k_ptr_op)(const ulong)); +int proc_ulong_conv(ulong *u_ptr, ulong *k_ptr, int dir, + const struct ctl_table *tbl, bool k_ptr_range_check, + int (*user_to_kern)(const ulong *u_ptr, ulong *k_ptr), + int (*kern_to_user)(ulong *u_ptr, const ulong *k_ptr)); /* * Register a set of sysctl names by calling register_sysctl * with an initialised array of struct ctl_table's. diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 66db2ac69a91ac4b200cb8906dcb76209bee28bb..d21eeb2bca19ab927a604e8de13= 7958eb08f82a6 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -648,6 +648,7 @@ out: \ } =20 do_proc_dotypevec(int) +do_proc_dotypevec(ulong) =20 static int do_proc_douintvec_w(const struct ctl_table *table, void *buffer, size_t *lenp, loff_t *ppos, @@ -969,87 +970,128 @@ int proc_dou8vec_minmax(const struct ctl_table *tabl= e, int dir, } EXPORT_SYMBOL_GPL(proc_dou8vec_minmax); =20 -static int do_proc_doulongvec_minmax(const struct ctl_table *table, int di= r, - void *buffer, size_t *lenp, loff_t *ppos, - unsigned long convmul, - unsigned long convdiv) +/** + * proc_ulong_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_ulong_conv(ulong *u_ptr, ulong *k_ptr, int dir, + const struct ctl_table *tbl, bool k_ptr_range_check, + int (*user_to_kern)(const ulong *u_ptr, ulong *k_ptr), + int (*kern_to_user)(ulong *u_ptr, const ulong *k_ptr)) { - unsigned long *i, *min, *max; - int vleft, first =3D 1, err =3D 0; - size_t left; - char *p; + if (SYSCTL_KERN_TO_USER(dir)) + return kern_to_user(u_ptr, k_ptr); =20 - if (!table->data || !table->maxlen || !*lenp || - (*ppos && SYSCTL_KERN_TO_USER(dir))) { - *lenp =3D 0; - return 0; - } + if (k_ptr_range_check) { + ulong tmp_k; + int ret; =20 - i =3D table->data; - min =3D table->extra1; - max =3D table->extra2; - vleft =3D table->maxlen / sizeof(unsigned long); - left =3D *lenp; - - if (SYSCTL_USER_TO_KERN(dir)) { - if (proc_first_pos_non_zero_ignore(ppos, table)) - goto out; - - if (left > PAGE_SIZE - 1) - left =3D PAGE_SIZE - 1; - p =3D buffer; - } + if (!tbl) + return -EINVAL; + ret =3D user_to_kern(u_ptr, &tmp_k); + if (ret) + return ret; + if ((tbl->extra1 && *(ulong *)tbl->extra1 > tmp_k) || + (tbl->extra2 && *(ulong *)tbl->extra2 < tmp_k)) + return -ERANGE; + WRITE_ONCE(*k_ptr, tmp_k); + } else + return user_to_kern(u_ptr, k_ptr); + return 0; +} =20 - for (; left && vleft--; i++, first =3D 0) { - unsigned long val; +/** + * proc_ulong_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. + * + * returns: 0 on success. + */ +int proc_ulong_u2k_conv_uop(const ulong *u_ptr, ulong *k_ptr, + ulong (*u_ptr_op)(const ulong)) +{ + ulong u =3D u_ptr_op ? u_ptr_op(*u_ptr) : *u_ptr; =20 - if (SYSCTL_USER_TO_KERN(dir)) { - bool neg; + WRITE_ONCE(*k_ptr, u); + return 0; +} =20 - proc_skip_spaces(&p, &left); - if (!left) - break; +static int proc_ulong_u2k_conv(const ulong *u_ptr, ulong *k_ptr) +{ + return proc_ulong_u2k_conv_uop(u_ptr, k_ptr, NULL); +} =20 - err =3D proc_get_long(&p, &left, &val, &neg, - proc_wspace_sep, - sizeof(proc_wspace_sep), NULL); - if (err || neg) { - err =3D -EINVAL; - break; - } +/** + * proc_ulong_k2u_conv_kop - Assign kernel value to a user space pointer + * + * @u_ptr: pointer to user space variable + * @k_ptr: pointer to kernel variable + * @k_ptr_op: Operation applied to k_ptr before assignment + * + * Uses READ_ONCE to assign value to u_ptr. Executes k_ptr_op if + * not NULL. + * + * returns: 0 on success. + */ +int proc_ulong_k2u_conv_kop(ulong *u_ptr, const ulong *k_ptr, + ulong (*k_ptr_op)(const ulong)) +{ + ulong val =3D k_ptr_op ? k_ptr_op(READ_ONCE(*k_ptr)) : READ_ONCE(*k_ptr); + *u_ptr =3D (ulong)val; + return 0; +} =20 - val =3D convmul * val / convdiv; - if ((min && val < *min) || (max && val > *max)) { - err =3D -EINVAL; - break; - } - WRITE_ONCE(*i, val); - } else { - val =3D convdiv * READ_ONCE(*i) / convmul; - if (!first) - proc_put_char(&buffer, &left, '\t'); - proc_put_long(&buffer, &left, val, false); - } - } +static int proc_ulong_k2u_conv(ulong *u_ptr, const ulong *k_ptr) +{ + return proc_ulong_k2u_conv_kop(u_ptr, k_ptr, NULL); +} =20 - if (SYSCTL_KERN_TO_USER(dir) && !first && left && !err) - proc_put_char(&buffer, &left, '\n'); - if (SYSCTL_USER_TO_KERN(dir) && !err) - proc_skip_spaces(&p, &left); - if (SYSCTL_USER_TO_KERN(dir) && first) - return err ? : -EINVAL; - *lenp -=3D left; -out: - *ppos +=3D *lenp; - return err; +static int do_proc_ulong_conv(bool *negp, ulong *u_ptr, ulong *k_ptr, int = dir, + const struct ctl_table *tbl) +{ + return proc_ulong_conv(u_ptr, k_ptr, dir, tbl, true, + proc_ulong_u2k_conv, proc_ulong_k2u_conv); } =20 +/** + * proc_doulongvec_minmax_conv - read a vector of unsigned longs with a cu= stom converter + * + * @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 long) unsigned long + * values from/to the user buffer, treated as an ASCII string. Negative + * strings are not allowed. + * + * Returns: 0 on success + */ int proc_doulongvec_minmax_conv(const struct ctl_table *table, int dir, void *buffer, size_t *lenp, loff_t *ppos, - unsigned long convmul, unsigned long convdiv) + int (*conv)(bool *negp, ulong *u_ptr, ulong *k_ptr, + int dir, const struct ctl_table *table)) { - return do_proc_doulongvec_minmax(table, dir, buffer, lenp, ppos, - convmul, convdiv); + return do_proc_doulongvec(table, dir, buffer, lenp, ppos, conv); } =20 /** @@ -1071,7 +1113,8 @@ int proc_doulongvec_minmax_conv(const struct ctl_tabl= e *table, int dir, int proc_doulongvec_minmax(const struct ctl_table *table, int dir, void *buffer, size_t *lenp, loff_t *ppos) { - return proc_doulongvec_minmax_conv(table, dir, buffer, lenp, ppos, 1l, 1l= ); + return do_proc_doulongvec(table, dir, buffer, lenp, ppos, + do_proc_ulong_conv); } =20 int proc_dointvec_conv(const struct ctl_table *table, int dir, void *buffe= r, @@ -1310,7 +1353,8 @@ int proc_doulongvec_minmax(const struct ctl_table *ta= ble, int dir, =20 int proc_doulongvec_minmax_conv(const struct ctl_table *table, int dir, void *buffer, size_t *lenp, loff_t *ppos, - unsigned long convmul, unsigned long convdiv) + int (*conv)(bool *negp, ulong *u_ptr, ulong *k_ptr, + int dir, const struct ctl_table *table)) { return -ENOSYS; } diff --git a/kernel/time/jiffies.c b/kernel/time/jiffies.c index a5c7d15fce72fd2c8c8a0e0b9e40901534152124..57ed5f363f94bd566aa53c061f2= 0d3f4f2a05944 100644 --- a/kernel/time/jiffies.c +++ b/kernel/time/jiffies.c @@ -187,6 +187,24 @@ static int do_proc_int_conv_ms_jiffies_minmax(bool *ne= gp, ulong *u_ptr, sysctl_u2k_int_conv_ms, sysctl_k2u_int_conv_ms); } =20 +static int sysctl_u2k_ulong_conv_ms(const ulong *u_ptr, ulong *k_ptr) +{ + return proc_ulong_u2k_conv_uop(u_ptr, k_ptr, sysctl_msecs_to_jiffies); +} + +static int sysctl_k2u_ulong_conv_ms(ulong *u_ptr, const ulong *k_ptr) +{ + return proc_ulong_k2u_conv_kop(u_ptr, k_ptr, sysctl_jiffies_to_msecs); +} + +static int do_proc_ulong_conv_ms_jiffies(bool *negp, ulong *u_ptr, ulong *= k_ptr, + int dir, const struct ctl_table *tbl) +{ + return proc_ulong_conv(u_ptr, k_ptr, dir, tbl, false, + sysctl_u2k_ulong_conv_ms, sysctl_k2u_ulong_conv_ms); +} + + #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) @@ -213,6 +231,12 @@ static int do_proc_int_conv_ms_jiffies_minmax(bool *ne= gp, ulong *u_ptr, { return -ENOSYS; } + +static int do_proc_ulong_conv_ms_jiffies(bool *negp, ulong *u_ptr, ulong *= k_ptr, + int dir, const struct ctl_table *tbl) +{ + return -ENOSYS; +} #endif =20 /** @@ -314,7 +338,7 @@ int proc_doulongvec_ms_jiffies_minmax(const struct ctl_= table *table, int dir, void *buffer, size_t *lenp, loff_t *ppos) { return proc_doulongvec_minmax_conv(table, dir, buffer, lenp, ppos, - HZ, 1000l); + do_proc_ulong_conv_ms_jiffies); } EXPORT_SYMBOL(proc_doulongvec_ms_jiffies_minmax); =20 --=20 2.50.1 From nobody Tue Feb 10 02:00:43 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 04C2033769C; Fri, 19 Dec 2025 12:16:11 +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=1766146572; cv=none; b=OcuzwIbbtf8wXzEdZf+ZVG4gD21GJZQnhDxGwVc8aTiGxRmLrMOaCcbi673J8BVXnCzJdGRvvCk3xhGTiPopPiQ3T3KFlK9hY8taT6w07F+saDjQ72xIzxi/c0ORD/p02iKINIyYA9pTX005+ERcPhu5VCKFcuKUYa0cV/lwUd0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766146572; c=relaxed/simple; bh=mGQWDqMqaGA6etpjh9YzRfJnnV2yEZ4c6MZcDZp1c5U=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=DN8LSCnf8NfB2PwlD2njjUxjiIg8sbATnqF62Il8rKftpDfEaqx/JM+FPtsJOBlwSWuoU7/y0uI53+AhWvvIWMGdnpRqqjBhrKhRGJ3ppJOltavGc51HVFMuNrRMfIeK0gEeOaTendKYiIWYmAvv9AHqaKJ3Nj4fVln1PGj2CmI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=nuFj0mDV; 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="nuFj0mDV" Received: by smtp.kernel.org (Postfix) with ESMTPS id B369DC19425; Fri, 19 Dec 2025 12:16:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1766146571; bh=mGQWDqMqaGA6etpjh9YzRfJnnV2yEZ4c6MZcDZp1c5U=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=nuFj0mDVtoYlAlSLKGyZa073tu3UzU3PpXi2RNnha+zdkIU+V+Sg336T0wGGYrmDj WPiuSRGvP3mIDT/0rLGl+Bw+nsGhXevARD1uphpp7SX1ytmiyj8CU0GjF06hbRnvWJ DS96Ya3oQYnktbi2e5nIC3VPkcQ+fXB/fh+4xenkG77haom7vf+eUngan/udYr4Mxa FRyxGX1OPvtEDOVeYbd/63jYPs90ulwRxMoUYYMA9H3X8gT4jxNWw5yaNBaViQ/eLR DlZgx9Kx+1Vbq9Bh3OWtGp/S9KUElcQ03tHRxLmrXXRQFkgKWukw7UJ7NerPZi9xBk pWuG2Yuv4SBjw== 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 A76A9D78767; Fri, 19 Dec 2025 12:16:11 +0000 (UTC) From: Joel Granados Date: Fri, 19 Dec 2025 13:15:55 +0100 Subject: [PATCH 4/9] sysctl: Add negp parameter to douintvec converter 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: <20251219-jag-dovec_consolidate-v1-4-1413b92c6040@kernel.org> References: <20251219-jag-dovec_consolidate-v1-0-1413b92c6040@kernel.org> In-Reply-To: <20251219-jag-dovec_consolidate-v1-0-1413b92c6040@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=5249; i=joel.granados@kernel.org; h=from:subject:message-id; bh=mGQWDqMqaGA6etpjh9YzRfJnnV2yEZ4c6MZcDZp1c5U=; b=owJ4nAHtARL+kA0DAAoBupfNUreWQU8ByyZiAGlFQgbUaRFKpbN1T/p5YTjcRXnhtu67NA150 L6y2lwHDdejUYkBswQAAQoAHRYhBK5HCVcl5jElzssnkLqXzVK3lkFPBQJpRUIGAAoJELqXzVK3 lkFP62sL/0ekXjrqWbEUficwKtqfVcs9OwrIfiS7Yq7Q0mkdMS+BoyGAJ9HifYu+7u5mjzI1Ndk 5+gXYDkosxOw5B9fIKhUvnwDs6dMBJ4Qk/qZ7JgsWjetRQ2G+m23jFZgTLKD/iBmplAl7n5EBQg a+haLIQ6qBx8MuAmT6/BcVB8k4CQvP1RiphgALmIt6SvtkphdDC+n9rO5fC6D6AvSKy8DOmZr27 gf2iroSe84Vil+1e0cp8MdlN76dP7idKQCdE3DDFroI+bLhOmMvHjfMoQJuVdDm+DtKUNyQ4C7g LcSFEXLOtBhvUpvAHavuyuFF9tEIrLVQPiGC7oxDdVhQO+GTUZpbE53cj0BX4BsjMrEY/SZY8gD akTxqbizrDgkzwv02l6FY5iViXSyVIbI9RtPtTIqeZ274mNx2ve9M47sAqH4SuA98dirZ/DpKLo Wsj0wm8LwhtsdXl93o16qCRHS145R2RhYpy3VhDoJ6aV+y1tz00tY18O5LfcEtXt5DV04lNXIc5 YY= 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 Updates all douintvec converter function signatures to include a bool *negp parameter. This is a preparation commit required to eventually generate do_proc_douintvec with a macro. The negp argument will be ignored as it is not relevant for the uint type. Note that do_proc_uint_conv_pipe_maxsz in pipe.c is also modified. Signed-off-by: Joel Granados --- fs/pipe.c | 2 +- include/linux/sysctl.h | 2 +- kernel/sysctl.c | 25 +++++++++++++------------ 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/fs/pipe.c b/fs/pipe.c index 22647f50b286d3bca024ee4c6de51b100ddc5402..e4a8b6d43bee873ceb1928afab9= 909e6cd6e4418 100644 --- a/fs/pipe.c +++ b/fs/pipe.c @@ -1492,7 +1492,7 @@ 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); } =20 -static int do_proc_uint_conv_pipe_maxsz(ulong *u_ptr, uint *k_ptr, +static int do_proc_uint_conv_pipe_maxsz(bool *negp, ulong *u_ptr, uint *k_= ptr, int dir, const struct ctl_table *table) { return proc_uint_conv(u_ptr, k_ptr, dir, table, true, diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h index 5c8c17f98513983a459c54eae99d1cc8bd63b011..8f8e357b1f4d377a0891fbc85d3= 4073cd30469b1 100644 --- a/include/linux/sysctl.h +++ b/include/linux/sysctl.h @@ -102,7 +102,7 @@ int proc_douintvec_minmax(const struct ctl_table *table= , int write, void *buffer size_t *lenp, loff_t *ppos); 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 (*conv)(bool *negp, ulong *lvalp, uint *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, diff --git a/kernel/sysctl.c b/kernel/sysctl.c index d21eeb2bca19ab927a604e8de137958eb08f82a6..8d0796b45b0101096ee395c7ed7= c37f7b7199db4 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -444,7 +444,7 @@ static int proc_uint_u2k_conv(const ulong *u_ptr, uint = *k_ptr) return proc_uint_u2k_conv_uop(u_ptr, k_ptr, NULL); } =20 -static int do_proc_uint_conv(ulong *u_ptr, uint *k_ptr, int dir, +static int do_proc_uint_conv(bool *negp, ulong *u_ptr, uint *k_ptr, int di= r, const struct ctl_table *tbl) { return proc_uint_conv(u_ptr, k_ptr, dir, tbl, false, @@ -652,7 +652,7 @@ do_proc_dotypevec(ulong) =20 static int do_proc_douintvec_w(const struct ctl_table *table, void *buffer, size_t *lenp, loff_t *ppos, - int (*conv)(unsigned long *u_ptr, + int (*conv)(bool *negp, unsigned long *u_ptr, unsigned int *k_ptr, int dir, const struct ctl_table *table)) { @@ -705,17 +705,18 @@ static int do_proc_douintvec_w(const struct ctl_table= *table, void *buffer, =20 static int do_proc_douintvec_r(const struct ctl_table *table, void *buffer, size_t *lenp, loff_t *ppos, - int (*conv)(unsigned long *u_ptr, + int (*conv)(bool *negp, unsigned long *u_ptr, unsigned int *k_ptr, int dir, const struct ctl_table *table)) { unsigned long lval; int err =3D 0; size_t left; + bool negp; =20 left =3D *lenp; =20 - if (conv(&lval, (unsigned int *) table->data, 0, table)) { + if (conv(&negp, &lval, (unsigned int *) table->data, 0, table)) { err =3D -EINVAL; goto out; } @@ -735,9 +736,8 @@ static int do_proc_douintvec_r(const struct ctl_table *= table, void *buffer, =20 static int do_proc_douintvec(const struct ctl_table *table, int dir, void *buffer, size_t *lenp, loff_t *ppos, - int (*conv)(unsigned long *u_ptr, - unsigned int *k_ptr, int dir, - const struct ctl_table *table)) + int (*conv)(bool *negp, ulong *u_ptr, uint *k_ptr, + int dir, const struct ctl_table *table)) { unsigned int vleft; =20 @@ -758,9 +758,6 @@ static int do_proc_douintvec(const struct ctl_table *ta= ble, int dir, return -EINVAL; } =20 - if (!conv) - conv =3D do_proc_uint_conv; - if (SYSCTL_USER_TO_KERN(dir)) return do_proc_douintvec_w(table, buffer, lenp, ppos, conv); return do_proc_douintvec_r(table, buffer, lenp, ppos, conv); @@ -784,9 +781,13 @@ static int do_proc_douintvec(const struct ctl_table *t= able, int dir, */ 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, + int (*conv)(bool *negp, ulong *u_ptr, uint *k_ptr, int dir, const struct ctl_table *table)) { + + if (!conv) + conv =3D do_proc_uint_conv; + return do_proc_douintvec(table, dir, buffer, lenp, ppos, conv); } =20 @@ -1314,7 +1315,7 @@ int proc_douintvec_minmax(const struct ctl_table *tab= le, int dir, =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 (*conv)(bool *negp, ulong *lvalp, uint *valp, int write, const struct ctl_table *table)) { return -ENOSYS; --=20 2.50.1 From nobody Tue Feb 10 02:00:43 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 0CF913385A9; Fri, 19 Dec 2025 12:16:11 +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=1766146572; cv=none; b=D33saIQDWTOVvqif3r7ZvvA8f+YIRAwu+8tOEgbQ4/Pcgu8vvQCsdHJr5nGbxEli4I5K0E8/pfSbQn0ltPn3eOyh2augk8PP5cd32w7aPr2gAiQj6zKSvl57rFfC2621QcbdP2zjm5PqqncfTikugGjKqRGrjaJhURuwkDiSs4E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766146572; c=relaxed/simple; bh=lGwAIyp+j4sPhraBT9VqqYDul5ESKjWOHxREAsCubL4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=XkaUUZ6nQcxlZlCDA/D0mm6Atp/8rBiHJSKmSoObwcZ4dDgksmrbpZvTsmPX82/1mZJo867mzhPfcX02aQtpNNddeIk7FMu0n0VmGRSKZORSpbUVr7XeEZfVUCn1qnJyLl/DglRtCPQCrmzSl3i6Vl+BX26afuoyN0d2bgFNH2Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=H8ftuslV; 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="H8ftuslV" Received: by smtp.kernel.org (Postfix) with ESMTPS id BF787C2BC86; Fri, 19 Dec 2025 12:16:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1766146571; bh=lGwAIyp+j4sPhraBT9VqqYDul5ESKjWOHxREAsCubL4=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=H8ftuslVH47fHOxKmKpWj3G5IpEZVWmTRalMZCYkwirbabkC4SkdsXaIHyVugxtxu PE9CJVqUODsdc44rOjqsglLJuU2EtqdRVHIS+NwmjH02bXITN/z0jld97b6szKr2OQ G6IwCm9kXKgqfm6ha+2Vi/CxZqbX657huELBdaTe3/k9qltbrAX3z7cv9vfHb2Goi4 c8fgVJtpuXYDLVRHTA794oGK0/9vcC6pozd3VS08OICI0Iup2upK59+Jite32YOhdt vnJtvbiWBSENy3F0nN0WhvGekJaRliPINXhfA6GKoYzS35muT8BSLyDiDx/TJ0PGnS upi6dceoHBfYg== 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 B85DBD78761; Fri, 19 Dec 2025 12:16:11 +0000 (UTC) From: Joel Granados Date: Fri, 19 Dec 2025 13:15:56 +0100 Subject: [PATCH 5/9] sysctl: Generate do_proc_douintvec with a type-generic macro 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: <20251219-jag-dovec_consolidate-v1-5-1413b92c6040@kernel.org> References: <20251219-jag-dovec_consolidate-v1-0-1413b92c6040@kernel.org> In-Reply-To: <20251219-jag-dovec_consolidate-v1-0-1413b92c6040@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=3960; i=joel.granados@kernel.org; h=from:subject:message-id; bh=lGwAIyp+j4sPhraBT9VqqYDul5ESKjWOHxREAsCubL4=; b=owJ4nAHtARL+kA0DAAoBupfNUreWQU8ByyZiAGlFQgeZHbxH9vwL5QklyE8aaBz92idYH9nJS MW1Kglb1ccT6IkBswQAAQoAHRYhBK5HCVcl5jElzssnkLqXzVK3lkFPBQJpRUIHAAoJELqXzVK3 lkFP+0QL/2bugkOsxBAG3heYbcF/ZnWoTX1He24efKOzYDCs0REK5VOvwAIUhiKh0L6GLwCYmkQ lDMTaFMG+PEvLgpcTgStsjquhCEPLb7IX29ujagic+j4Wu6fGbkBPSKYpaduYRRtK8ZR3in3fPE AB2Odtx5ome0+MI/kzLGj6dzaDPyq1MHUiPK6MgMiP42Nw+OOetzu22ch10VCU1S8jK9iKjPnBs y7ZPF1fUACyfKlHDwBniRQakTgMa3St2inKctKaHK6KimxxkBzblcMEQWbldAhZp6D/AxoYddOZ nbDUg4VG5UF8VLaoMJx0m4GR7brZ8dgir0usyJVEJbfDQfwukj7+6BRw/62wa/VBucjElJklCBJ 59mpaF58e/wfunwRLCgTORhbaoXaNGBv9cetYsJPZ8jWlFNJomUTcH7PEIwXZi/E50kSlDbNfbb E7oPnQPF42NxElYqUkdk6bQHKt6YKR5OS4V48Fo4VVEZoDPyLYkZUzriWxDjgHhv9f/rjb1rLf5 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 Generate the behavior in do_proc_douintvec{,_w,_r} functions with do_proc_dotypevec(uint). The originals (do_proc_douintvec{,_w,_r}) where created in the same way as do_proc_dotypevec but for individual values (no vectors). In this commit we use the existing macro implementation to extend do_proc_douintvec to include vectors of values. Signed-off-by: Joel Granados --- kernel/sysctl.c | 118 ++--------------------------------------------------= ---- 1 file changed, 3 insertions(+), 115 deletions(-) diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 8d0796b45b0101096ee395c7ed7c37f7b7199db4..4fa26b913f59c60a5b4fbc2d66d= 5d99c641eecba 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -451,8 +451,8 @@ static int do_proc_uint_conv(bool *negp, ulong *u_ptr, = uint *k_ptr, int dir, proc_uint_u2k_conv, proc_uint_k2u_conv); } =20 -static int do_proc_uint_conv_minmax(ulong *u_ptr, uint *k_ptr, int dir, - const struct ctl_table *tbl) +static int do_proc_uint_conv_minmax(bool *negp, 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); @@ -649,119 +649,7 @@ out: \ =20 do_proc_dotypevec(int) do_proc_dotypevec(ulong) - -static int do_proc_douintvec_w(const struct ctl_table *table, void *buffer, - size_t *lenp, loff_t *ppos, - int (*conv)(bool *negp, unsigned long *u_ptr, - unsigned int *k_ptr, int dir, - const struct ctl_table *table)) -{ - unsigned long lval; - int err =3D 0; - size_t left; - bool neg; - char *p =3D buffer; - - left =3D *lenp; - - if (proc_first_pos_non_zero_ignore(ppos, table)) - goto bail_early; - - if (left > PAGE_SIZE - 1) - left =3D PAGE_SIZE - 1; - - proc_skip_spaces(&p, &left); - if (!left) { - err =3D -EINVAL; - goto out_free; - } - - err =3D proc_get_long(&p, &left, &lval, &neg, - proc_wspace_sep, - sizeof(proc_wspace_sep), NULL); - if (err || neg) { - err =3D -EINVAL; - goto out_free; - } - - if (conv(&lval, (unsigned int *) table->data, 1, table)) { - err =3D -EINVAL; - goto out_free; - } - - if (!err && left) - proc_skip_spaces(&p, &left); - -out_free: - if (err) - return -EINVAL; - - return 0; - -bail_early: - *ppos +=3D *lenp; - return err; -} - -static int do_proc_douintvec_r(const struct ctl_table *table, void *buffer, - size_t *lenp, loff_t *ppos, - int (*conv)(bool *negp, unsigned long *u_ptr, - unsigned int *k_ptr, int dir, - const struct ctl_table *table)) -{ - unsigned long lval; - int err =3D 0; - size_t left; - bool negp; - - left =3D *lenp; - - if (conv(&negp, &lval, (unsigned int *) table->data, 0, table)) { - err =3D -EINVAL; - goto out; - } - - proc_put_long(&buffer, &left, lval, false); - if (!left) - goto out; - - proc_put_char(&buffer, &left, '\n'); - -out: - *lenp -=3D left; - *ppos +=3D *lenp; - - return err; -} - -static int do_proc_douintvec(const struct ctl_table *table, int dir, - void *buffer, size_t *lenp, loff_t *ppos, - int (*conv)(bool *negp, ulong *u_ptr, uint *k_ptr, - int dir, const struct ctl_table *table)) -{ - unsigned int vleft; - - if (!table->data || !table->maxlen || !*lenp || - (*ppos && SYSCTL_KERN_TO_USER(dir))) { - *lenp =3D 0; - return 0; - } - - vleft =3D table->maxlen / sizeof(unsigned int); - - /* - * Arrays are not supported, keep this simple. *Do not* add - * support for them. - */ - if (vleft !=3D 1) { - *lenp =3D 0; - return -EINVAL; - } - - if (SYSCTL_USER_TO_KERN(dir)) - return do_proc_douintvec_w(table, buffer, lenp, ppos, conv); - return do_proc_douintvec_r(table, buffer, lenp, ppos, conv); -} +do_proc_dotypevec(uint) =20 /** * proc_douintvec_conv - read a vector of unsigned ints with a custom conv= erter --=20 2.50.1 From nobody Tue Feb 10 02:00:43 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 3C4E3339702; Fri, 19 Dec 2025 12:16:12 +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=1766146572; cv=none; b=d4s0mKrjkXKhlQu1A1VJcUURq7bCh32V3Vgd0S3O/YdFf9nXeT5dWlm1ne+Gksex+KLSxjkW2djnIvzIegXe+hTrOzoOk0ct9O7hp21TU47Qw6eZf3Se+jWpsReQRq8SiWJwh39x8tc9Up4muZaGKGudOrgtydq2OEaeiK2h9gE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766146572; c=relaxed/simple; bh=LYKepGhVVod321kzN+GP9Noclko65wxhv2Cran/BQS8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=AHqjU+ORpyzd7HbvddDducNbly6qyCaWr2ArGlKHuN0RJ3Jg5YownruY1Q2a1wdeYeU16s2CLNzrBqr0F9Z/7RvvZ9p5dOWNlKQ4LtyhaVVHX/8+xzx0/m5Kr+bu+0LFLvfB3x/9Wz0A8HkhbxPbT3bVzPpvqw61j6NUXcCFaDs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=QP2Tl4+m; 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="QP2Tl4+m" Received: by smtp.kernel.org (Postfix) with ESMTPS id D9104C2BCB2; Fri, 19 Dec 2025 12:16:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1766146571; bh=LYKepGhVVod321kzN+GP9Noclko65wxhv2Cran/BQS8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=QP2Tl4+m1JHMi/kvR/FWYel0xmuWjsOGSxYo7/3c4nMV3MN5EOwf1VLa2oguZrvNx QYY/4ICVGHWAyrvRIQA+01DqoA80J4LrZtHgDFQsQ14QoJ5cYAKB5HpLJlB6S2UXG7 C/txLB4SwMVxs+swg5fjk9yULZXnCFWfacQCeOEAp6EcDEaU2S2E7z6WbJin4MZLZ4 UdBoiV+kYtDksV63Ndh82aaSYukdnvmAa77LHjhK8J0J6IuVZrJqzUh2vJhV4Ecbmq RRNB758MJAIshdGLbB1Ii9/WzJW7Z6+pYPyOsMjdi/o9jYV0GE05HsSTDpzc6LRL5H O8C3SDoQB3VYA== 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 C8DBDD767EE; Fri, 19 Dec 2025 12:16:11 +0000 (UTC) From: Joel Granados Date: Fri, 19 Dec 2025 13:15:57 +0100 Subject: [PATCH 6/9] sysctl: Rename do_proc_dotypevec macro to do_proc_typevec 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: <20251219-jag-dovec_consolidate-v1-6-1413b92c6040@kernel.org> References: <20251219-jag-dovec_consolidate-v1-0-1413b92c6040@kernel.org> In-Reply-To: <20251219-jag-dovec_consolidate-v1-0-1413b92c6040@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=4776; i=joel.granados@kernel.org; h=from:subject:message-id; bh=LYKepGhVVod321kzN+GP9Noclko65wxhv2Cran/BQS8=; b=owJ4nAHtARL+kA0DAAoBupfNUreWQU8ByyZiAGlFQgcfKfOWlIi7CTIxyVY3Be7pqiRaPV1kP BTBu0Fdipie3okBswQAAQoAHRYhBK5HCVcl5jElzssnkLqXzVK3lkFPBQJpRUIHAAoJELqXzVK3 lkFPlc4L/iBNaUhX7uiypmBB+40uRz4gu0pYBJAuxOJJo+PEurNQGznaNBuf2zfxg6GYRYUcPfd sbjXOfbOp3S0TpWivzVnwCiv6ZZrmtGASPqMed1yfYXXOeOBaJLhZ7MoM6ABa/u8xAwCTNymORV IUu/SZ/FA06UPc2KLrPWGQOjwN9JAhpR6EbtDpGfmw7zasg3XxXgDKCjX34kEcRa4ywFgMQqFZm 9+8sRhBH2UncZMZOMRMC6ohyJyoZj79MOGDzLO+LHPbRAjELtcRYucu4VAwyi83zyFL8GcU08F0 pNZnyxlTZtldzwp6UGSbSE2dbtokK0HwVlachS2zab1suiJmQ9FuquD+41wE/69GbZItQojBOCk KnJQToCyk7xrw5rFYvPpgP07bMdOFQeTjMMJ4zyq4KhISaxfHP1twVJUqdUn9rJrZJekdACytk1 F16asKUzQF3fEm9gffB+cDyyBVcQFmH1buMdSWh2Bn0nBqRXaFhLYesmDbnoweyNK5aTC2yyTP4 gg= 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 the do..do from the proc vector functions. The redundant "do" only adds confusion to the already large amount of functions in sysctl.c Signed-off-by: Joel Granados --- kernel/sysctl.c | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 4fa26b913f59c60a5b4fbc2d66d5d99c641eecba..aecb46bdf4cafc134f83f2014e8= 9a209efc8c10d 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -576,8 +576,8 @@ static const char proc_wspace_sep[] =3D { ' ', '\t', '\= n' }; * Do not export this macro outside the sysctl subsys. * It is meant to generate static functions only */ -#define do_proc_dotypevec(T) \ -static int do_proc_do##T##vec(const struct ctl_table *table, int dir, \ +#define do_proc_typevec(T) \ +static int do_proc_##T##vec(const struct ctl_table *table, int dir, \ void *buffer, size_t *lenp, loff_t *ppos, \ int (*conv)(bool *negp, ulong *u_ptr, T *k_ptr, \ int dir, const struct ctl_table *table)) \ @@ -647,9 +647,9 @@ out: \ return err; \ } =20 -do_proc_dotypevec(int) -do_proc_dotypevec(ulong) -do_proc_dotypevec(uint) +do_proc_typevec(int) +do_proc_typevec(ulong) +do_proc_typevec(uint) =20 /** * proc_douintvec_conv - read a vector of unsigned ints with a custom conv= erter @@ -676,7 +676,7 @@ int proc_douintvec_conv(const struct ctl_table *table, = int dir, void *buffer, if (!conv) conv =3D do_proc_uint_conv; =20 - return do_proc_douintvec(table, dir, buffer, lenp, ppos, conv); + return do_proc_uintvec(table, dir, buffer, lenp, ppos, conv); } =20 /** @@ -735,7 +735,7 @@ int proc_dobool(const struct ctl_table *table, int dir,= void *buffer, int proc_dointvec(const struct ctl_table *table, int dir, void *buffer, size_t *lenp, loff_t *ppos) { - return do_proc_dointvec(table, dir, buffer, lenp, ppos, do_proc_int_conv); + return do_proc_intvec(table, dir, buffer, lenp, ppos, do_proc_int_conv); } =20 /** @@ -754,8 +754,7 @@ int proc_dointvec(const struct ctl_table *table, int di= r, void *buffer, int proc_douintvec(const struct ctl_table *table, int dir, void *buffer, size_t *lenp, loff_t *ppos) { - return do_proc_douintvec(table, dir, buffer, lenp, ppos, - do_proc_uint_conv); + return do_proc_uintvec(table, dir, buffer, lenp, ppos, do_proc_uint_conv); } =20 /** @@ -778,8 +777,8 @@ int proc_douintvec(const struct ctl_table *table, int d= ir, void *buffer, int proc_dointvec_minmax(const struct ctl_table *table, int dir, void *buffer, size_t *lenp, loff_t *ppos) { - return do_proc_dointvec(table, dir, buffer, lenp, ppos, - do_proc_int_conv_minmax); + return do_proc_intvec(table, dir, buffer, lenp, ppos, + do_proc_int_conv_minmax); } =20 /** @@ -805,8 +804,8 @@ int proc_dointvec_minmax(const struct ctl_table *table,= int dir, int proc_douintvec_minmax(const struct ctl_table *table, int dir, void *buffer, size_t *lenp, loff_t *ppos) { - return do_proc_douintvec(table, dir, buffer, lenp, ppos, - do_proc_uint_conv_minmax); + return do_proc_uintvec(table, dir, buffer, lenp, ppos, + do_proc_uint_conv_minmax); } =20 /** @@ -849,8 +848,8 @@ int proc_dou8vec_minmax(const struct ctl_table *table, = int dir, tmp.extra2 =3D (unsigned int *) &max; =20 val =3D READ_ONCE(*data); - res =3D do_proc_douintvec(&tmp, dir, buffer, lenp, ppos, - do_proc_uint_conv_minmax); + res =3D do_proc_uintvec(&tmp, dir, buffer, lenp, ppos, + do_proc_uint_conv_minmax); if (res) return res; if (SYSCTL_USER_TO_KERN(dir)) @@ -980,7 +979,7 @@ int proc_doulongvec_minmax_conv(const struct ctl_table = *table, int dir, int (*conv)(bool *negp, ulong *u_ptr, ulong *k_ptr, int dir, const struct ctl_table *table)) { - return do_proc_doulongvec(table, dir, buffer, lenp, ppos, conv); + return do_proc_ulongvec(table, dir, buffer, lenp, ppos, conv); } =20 /** @@ -1002,8 +1001,8 @@ int proc_doulongvec_minmax_conv(const struct ctl_tabl= e *table, int dir, int proc_doulongvec_minmax(const struct ctl_table *table, int dir, void *buffer, size_t *lenp, loff_t *ppos) { - return do_proc_doulongvec(table, dir, buffer, lenp, ppos, - do_proc_ulong_conv); + return do_proc_ulongvec(table, dir, buffer, lenp, ppos, + do_proc_ulong_conv); } =20 int proc_dointvec_conv(const struct ctl_table *table, int dir, void *buffe= r, @@ -1013,7 +1012,7 @@ int proc_dointvec_conv(const struct ctl_table *table,= int dir, void *buffer, { if (!conv) conv =3D do_proc_int_conv; - return do_proc_dointvec(table, dir, buffer, lenp, ppos, conv); + return do_proc_intvec(table, dir, buffer, lenp, ppos, conv); } =20 /** --=20 2.50.1 From nobody Tue Feb 10 02:00:43 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 3E60A33970C; Fri, 19 Dec 2025 12:16:12 +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=1766146572; cv=none; b=IhQHV+F/QxkOK6bz/VoQ/CRXzBpmG0PeAFUzPbU1bDxWLWliXk1AzynLwkqCgtnhvGytylOWydHZFSVnPxqe2zHFrwanSqaWnl1Bjz9AdfZVeY5T1AZr7hcG3LEZmopeUb4grb7+22PHfNqmPdb9bu3aWHo2RW2HCjDfozhAHJ0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766146572; c=relaxed/simple; bh=PIAQtecICUqPpS+GwLLx44WXYsf3diE+/qtx8X2p5C0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=DCpqlcENGvAdT6Ub3ZZOFupIbfeufw3ojg1dmKXI58UdkAKE6iK7mEwBMjEEEIgFCMu1Ogn0fShNe7RlAFOWz59hzBy14zXFxwN/1ZkEvp3OgqlPOLKH/NLHRgX5Pn6GWyISW501zjzMHzZc1brrEePa6pKa/ersuLkq589KeZo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=JGaQ6VxY; 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="JGaQ6VxY" Received: by smtp.kernel.org (Postfix) with ESMTPS id DD070C2BC87; Fri, 19 Dec 2025 12:16:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1766146571; bh=PIAQtecICUqPpS+GwLLx44WXYsf3diE+/qtx8X2p5C0=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=JGaQ6VxYvnNa/xlO6FBJ8GU6thqnHnfEyhG6k5Dezj8CWE0g6FUeZjHhTMolJDxaz C8VmiFRUoDSQQqX+4jDLHX7PjfL7iq9z3xvoNJDh7/2yemePyOaH3KCDEqzAeJrIQR iNsv4TPztTz8lLbIcw9FquTFcTDiu+p9IfI3/JGv5hAeVpzIkpcJJslpYhKdNkskLc EcBEHnKoXkcb3x9eJNDDvulOMQNwb/8mEFebwQ+1SFT0FJdP5/OA1mj83no7jLW+YO xbzaSoNIQVxMkTtSJsUdObP8rTzQDZDSiwazzn3z/faggkFSWFyIkra4qn/p9TokB0 6seHwt4x+2DhA== 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 D6C51D78762; Fri, 19 Dec 2025 12:16:11 +0000 (UTC) From: Joel Granados Date: Fri, 19 Dec 2025 13:15:58 +0100 Subject: [PATCH 7/9] sysctl: Group proc_handler declarations and document 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: <20251219-jag-dovec_consolidate-v1-7-1413b92c6040@kernel.org> References: <20251219-jag-dovec_consolidate-v1-0-1413b92c6040@kernel.org> In-Reply-To: <20251219-jag-dovec_consolidate-v1-0-1413b92c6040@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=8609; i=joel.granados@kernel.org; h=from:subject:message-id; bh=PIAQtecICUqPpS+GwLLx44WXYsf3diE+/qtx8X2p5C0=; b=owJ4nAHtARL+kA0DAAoBupfNUreWQU8ByyZiAGlFQghNxbNE0xp+zkXK+eCJcGGdb1yg2BWNc wJoHAKW/A+2bokBswQAAQoAHRYhBK5HCVcl5jElzssnkLqXzVK3lkFPBQJpRUIIAAoJELqXzVK3 lkFPvi0L/iBM2N+2I9pEm4kzOd7bJy56+p8OEtVTzVSuM9Kl3BjiItPv2xK2QJSA+o9iE2rFjhH 1xPGl11hBXjaUE1pgRorIvvAXOUItMKGTVOJg/PcpK+72Mrxc7g0IDFN68iATrE8nySch/RGJDS ESVqk27uoEKTJV/8xmBfL+nCx6h2bjjz0A3hX13JoFfLeHy8kraSJ8qIRvaT3gqC6VsfPD5kqqm zluFu8ua7Ilwq/SAv+kalZRRT05t4pqU78SxGM8f5hbVhtEnv63zOFUq1Za9dJjBz23PIeLNfeM io4uqRzM92mKke2FJxt7Fm0Gae2bOhnct0hP0fNTozNKC280ElI5OLswWZ85DLTiwSXoZkk9MNZ xzvbWxv5m3UpK4+ZrsRwKlZ0SMRv+1YyCoSc1y+qTt+PXDV4koCo4zlz7hQRY+LiqO5GM0DSxEU bc2QO8PjYpt4xTAFX/u3XwKXQVjHV3risaV4WBEOJFY2k+ZB6h5YYVstm6I/jfp/3wodU5pI9l5 jA= 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 Make four groups in the sysctl header and document each group with an example of how to use them. 1. proc_handler : All functions that can be passed to the proc_handler pointer in ctl_table 2. proc handler aggregators: Functions to create proc handlers with custom converters 3. bi-directional converters: Functions to create read/write custom converters. Can be passed to proc handler aggregators 4. uni-directional converters: Functions to create read or write custom converters. Can be passed as args to bi-directional converters Use just one naming convention in the declarations: 'write' becomes 'dir' and 'buffer' becomes 'buf'. Signed-off-by: Joel Granados --- include/linux/sysctl.h | 128 +++++++++++++++++++++++++++++++++------------= ---- 1 file changed, 87 insertions(+), 41 deletions(-) diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h index 8f8e357b1f4d377a0891fbc85d34073cd30469b1..ad268dfd9e79f5540a4a85a9a43= 9819fb3172640 100644 --- a/include/linux/sysctl.h +++ b/include/linux/sysctl.h @@ -74,63 +74,109 @@ extern const int sysctl_vals[]; =20 extern const unsigned long sysctl_long_vals[]; =20 -typedef int proc_handler(const struct ctl_table *ctl, int write, void *buf= fer, - size_t *lenp, loff_t *ppos); - -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); +typedef int proc_handler(const struct ctl_table *ctl, int dir, void *buf, + size_t *lenp, loff_t *ppos); =20 -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, +/* proc_handler functions */ +int proc_dostring(const struct ctl_table *ctl, int dir, void *buf, size_t = *lenp, + loff_t *ppos); +int proc_dobool(const struct ctl_table *ctl, int dir, void *buf, size_t *l= enp, + loff_t *ppos); +int proc_dointvec(const struct ctl_table *ctl, int dir, void *buf, size_t = *lenp, + loff_t *ppos); +int proc_dointvec_minmax(const struct ctl_table *ctl, int dir, void *buf, size_t *lenp, loff_t *ppos); -int proc_dointvec_conv(const struct ctl_table *table, int dir, void *buffe= r, +int proc_douintvec(const struct ctl_table *ctl, int dir, void *buf, size_t= *lenp, + loff_t *ppos); +int proc_douintvec_minmax(const struct ctl_table *ctl, int dir, void *buf, + size_t *lenp, loff_t *ppos); +int proc_dou8vec_minmax(const struct ctl_table *ctl, int dir, void *buf, + size_t *lenp, loff_t *ppos); +int proc_doulongvec_minmax(const struct ctl_table *ctl, int dir, void *buf, + size_t *lenp, loff_t *ppos); +int proc_do_large_bitmap(const struct ctl_table *ctl, int dir, void *buf, + size_t *lenp, loff_t *ppos); +int proc_do_static_key(const struct ctl_table *ctl, int dir, void *buf, + size_t *lenp, loff_t *ppos); + +/* + * proc_handler aggregators + * + * Create a proc_handler with a custom converter. Use when the user space + * value is a transformation of the kernel value. Cannot be passed as + * proc_handlers. + * + * Example of creating your custom proc handler: + * int custom_converter(bool *negp, ulong *u_ptr, uint *k_ptr, + * int dir, const struct ctl_table *ctl) {...} + * int custom_proc_handler(const struct ctl_table *ctl, int dir, + * void *buf, size_t *lenp, loff_t *ppos + * { return proc_dointvec_conv(ctl, dir, buf, lenp, ppos, custom_converter= ); } + */ +int proc_dointvec_conv(const struct ctl_table *ctl, int dir, void *buf, 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 dir, const struct ctl_table *ctl)); +int proc_douintvec_conv(const struct ctl_table *ctl, int dir, void *buf, + size_t *lenp, loff_t *ppos, + int (*conv)(bool *negp, ulong *u_ptr, uint *k_ptr, + int dir, const struct ctl_table *ctl)); +int proc_doulongvec_minmax_conv(const struct ctl_table *ctl, int dir, void= *buf, + size_t *lenp, loff_t *ppos, + int (*conv)(bool *negp, ulong *u_ptr, ulong *k_ptr, + int dir, const struct ctl_table *ctl)); + +/* + * bi-directional converter functions + * + * Specify the converter function for both directions (user to kernel & ke= rnel + * to user). Use when you want to change the value of the variable before + * assignment. Used to create custom proc_handler aggregators. + * + * Example of creating your custom bi-directional converter: + * int custom_u2k(ulong *u_ptr, const uint *k_ptr) { ... } + * int custom_converter(bool *negp, ulong *u_ptr, uint *k_ptr, + * int dir, const struct ctl_table *ctl) + * { return proc_uint_conv(u_ptr, k_ptr, dir, ctl, true, + * custom_u2k, proc_uint_k2u_conv} + */ 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)); - -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); -int proc_douintvec_conv(const struct ctl_table *table, int write, void *bu= ffer, - size_t *lenp, loff_t *ppos, - int (*conv)(bool *negp, ulong *lvalp, uint *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)); - -int proc_dou8vec_minmax(const struct ctl_table *table, int write, void *bu= ffer, - size_t *lenp, loff_t *ppos); -int proc_doulongvec_minmax(const struct ctl_table *, int, void *, size_t *= , loff_t *); -int proc_doulongvec_minmax_conv(const struct ctl_table *table, int dir, - void *buffer, size_t *lenp, loff_t *ppos, - int (*conv)(bool *negp, ulong *u_ptr, ulong *k_ptr, - int dir, const struct ctl_table *table)); -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 proc_ulong_u2k_conv_uop(const ulong *u_ptr, ulong *k_ptr, - ulong (*u_ptr_op)(const ulong)); -int proc_ulong_k2u_conv_kop(ulong *u_ptr, const ulong *k_ptr, - ulong (*k_ptr_op)(const ulong)); int proc_ulong_conv(ulong *u_ptr, ulong *k_ptr, int dir, const struct ctl_table *tbl, bool k_ptr_range_check, int (*user_to_kern)(const ulong *u_ptr, ulong *k_ptr), int (*kern_to_user)(ulong *u_ptr, const ulong *k_ptr)); + +/* + * uni-directional converter functions + * + * Specify the converter function for one directions (user to kernel or + * kernel to user). Use to call the actual value conversion. Used to Create + * bi-directional converters. + * + * Example of creating a uni-directional converter: + * ulong op(const ulong val) { ... } + * int custom_unidir_conv(ulong *u_ptr, const uint *k_ptr) + * { return proc_uint_k2u_conv_kop(u_ptr, k_ptr, op); } + */ +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_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_ulong_u2k_conv_uop(const ulong *u_ptr, ulong *k_ptr, + ulong (*u_ptr_op)(const ulong)); +int proc_ulong_k2u_conv_kop(ulong *u_ptr, const ulong *k_ptr, + ulong (*k_ptr_op)(const ulong)); + /* * Register a set of sysctl names by calling register_sysctl * with an initialised array of struct ctl_table's. --=20 2.50.1 From nobody Tue Feb 10 02:00:43 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 3169C338F54; Fri, 19 Dec 2025 12:16:12 +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=1766146572; cv=none; b=luyy4byb/H7NW8/gaFiHjNO8+1019BOSEe1+i0PoNFtDPIM7oF983UUlLCTeSkylUQhBNvcV74YnLHQ3ZuQx54RzYpc/2nqqIwmttfZbQqE86Uzu1o3P07q4x9lZOb+/d+HBE+2gJCprWgahYRd1Jx9QMY5YbubmfKPRbFACkEM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766146572; c=relaxed/simple; bh=xCZl7r2DiBYglyBmPVRMcIhculDAeVzFm9aK8ZXJIjc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cbtQXXVhpCgeLlFjK3AZd/FSRZcEbGsLgyL06hef7MjoBUDfvkowkyuHUKdvdBbI8AWsgaDiJRwGnHX9tuA4kd4/vUAcsH30Spds/JfG5jRGe1jpiBGNc4/oW87QbymTi3B+JlaOgm6Tq9+oNE+hxWnIHEAx+gUF9rBQL0rw578= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=DOPsvsN8; 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="DOPsvsN8" Received: by smtp.kernel.org (Postfix) with ESMTPS id F2700C2BCAF; Fri, 19 Dec 2025 12:16:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1766146572; bh=xCZl7r2DiBYglyBmPVRMcIhculDAeVzFm9aK8ZXJIjc=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=DOPsvsN8P0nfZkZrulR4jclxnP6442AJNN43SZxsKuBtksrFrq4onFkjdmHev8rPk GX4qUV/zSmk5Bf0DCzXsrWg2lqi6G0qCZr7mQ48mgxIzeAc/LtteK1Jzu8ZaT7vb0D vgmQRtJyJFePnfxSRAN4g7ORCQkGCxTfB+jCSDBIkObWJC9mnmicMdTvSbatLUEETS 2VF6WpEQHGpRT5EwjXoRqCpnu/bgHxsNuqvxtkB1wxCVtnfebd6Q9NQFyP3gQ3dLKX A95xUezY9ztvyibFmKyaGmEh5PaxT8Hmdp3I5nR1BvNWKDMCkZZ9yUq59udBWZGvQO gAkN9Bo/p7n1g== 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 E3B73D78763; Fri, 19 Dec 2025 12:16:11 +0000 (UTC) From: Joel Granados Date: Fri, 19 Dec 2025 13:15:59 +0100 Subject: [PATCH 8/9] sysctl: Rename proc_doulongvec_minmax_conv to proc_doulongvec_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: <20251219-jag-dovec_consolidate-v1-8-1413b92c6040@kernel.org> References: <20251219-jag-dovec_consolidate-v1-0-1413b92c6040@kernel.org> In-Reply-To: <20251219-jag-dovec_consolidate-v1-0-1413b92c6040@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=3589; i=joel.granados@kernel.org; h=from:subject:message-id; bh=xCZl7r2DiBYglyBmPVRMcIhculDAeVzFm9aK8ZXJIjc=; b=owJ4nAHtARL+kA0DAAoBupfNUreWQU8ByyZiAGlFQgi96kPd13ciGcp88pvhu/VkjsU3FXBtp Mxa5v9E49/9iIkBswQAAQoAHRYhBK5HCVcl5jElzssnkLqXzVK3lkFPBQJpRUIIAAoJELqXzVK3 lkFPaMgMAI+NdzeKR6VUSNJVgXooT5Sp5zfgjmaasI82neNWyyQl1G6rfXaVC8WKlKxFj5BNOFG BZMx6JxaIKt7k2Pz4qJUVCf2Cdgml/fAdJrd8XiDqyvRgjse/HgmS2GlR87xfkM9SIKq7Jqb+mz XzIw+ng+7uvOrJk2L9bH7wrGXIpEK2AtKgGpyNbSjxNaWijxUb2z/kPaR81FSqTSEBzK+i37smf qZQuSKx2H00uTLj9i3NaMXu8jL7nK5MZ1sJBTpuYE82nKtVOHPzEMn24KOhOotyMRMDUZ+1TR16 g85keKU9nQ1HSbdAukpqor8NERV5wrEIi0gGLl+4JJD43qufT/W9yaNiao+Yk4XrB67AyiFo3Ae mdOQDmRDLVmoju+07JXMaFayTgCX2EjDKAxZ0krTEuuWh87YLbnS3OQ4bDD0eWvg4xSuScg9YM3 Nla2p1QFHpnFIvwLfUS3OA9C8ktNdZoHL5qbO5K3e0xbWufS56ESGPS+ORC3Fm9EjHvV1ogp4Z6 5c= 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 "_minmax" from proc_doulongvec_minmax_conv as it does not enforce min/max limits but serves as a generic converter for unsigned long vectors. Update function declaration in sysctl.h, definition in sysctl.c, and caller in jiffies.c accordingly. Signed-off-by: Joel Granados --- include/linux/sysctl.h | 8 ++++---- kernel/sysctl.c | 6 +++--- kernel/time/jiffies.c | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h index ad268dfd9e79f5540a4a85a9a439819fb3172640..39cf1bf9703fc66a3c9c3360ca0= 81b5590339caa 100644 --- a/include/linux/sysctl.h +++ b/include/linux/sysctl.h @@ -121,10 +121,10 @@ int proc_douintvec_conv(const struct ctl_table *ctl, = int dir, void *buf, size_t *lenp, loff_t *ppos, int (*conv)(bool *negp, ulong *u_ptr, uint *k_ptr, int dir, const struct ctl_table *ctl)); -int proc_doulongvec_minmax_conv(const struct ctl_table *ctl, int dir, void= *buf, - size_t *lenp, loff_t *ppos, - int (*conv)(bool *negp, ulong *u_ptr, ulong *k_ptr, - int dir, const struct ctl_table *ctl)); +int proc_doulongvec_conv(const struct ctl_table *ctl, int dir, void *buf, + size_t *lenp, loff_t *ppos, + int (*conv)(bool *negp, ulong *u_ptr, ulong *k_ptr, + int dir, const struct ctl_table *ctl)); =20 /* * bi-directional converter functions diff --git a/kernel/sysctl.c b/kernel/sysctl.c index aecb46bdf4cafc134f83f2014e89a209efc8c10d..3fa59ef77f931c2753584ed0300= 6f3ff9f5a1d0e 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -959,7 +959,7 @@ static int do_proc_ulong_conv(bool *negp, ulong *u_ptr,= ulong *k_ptr, int dir, } =20 /** - * proc_doulongvec_minmax_conv - read a vector of unsigned longs with a cu= stom converter + * proc_doulongvec_conv - read a vector of unsigned longs with a custom co= nverter * * @table: the sysctl table * @dir: %TRUE if this is a write to the sysctl file @@ -974,7 +974,7 @@ static int do_proc_ulong_conv(bool *negp, ulong *u_ptr,= ulong *k_ptr, int dir, * * Returns: 0 on success */ -int proc_doulongvec_minmax_conv(const struct ctl_table *table, int dir, +int proc_doulongvec_conv(const struct ctl_table *table, int dir, void *buffer, size_t *lenp, loff_t *ppos, int (*conv)(bool *negp, ulong *u_ptr, ulong *k_ptr, int dir, const struct ctl_table *table)) @@ -1239,7 +1239,7 @@ int proc_doulongvec_minmax(const struct ctl_table *ta= ble, int dir, return -ENOSYS; } =20 -int proc_doulongvec_minmax_conv(const struct ctl_table *table, int dir, +int proc_doulongvec_conv(const struct ctl_table *table, int dir, void *buffer, size_t *lenp, loff_t *ppos, int (*conv)(bool *negp, ulong *u_ptr, ulong *k_ptr, int dir, const struct ctl_table *table)) diff --git a/kernel/time/jiffies.c b/kernel/time/jiffies.c index 57ed5f363f94bd566aa53c061f20d3f4f2a05944..38a654e79b731956748c5ff9b47= 6fb2adea58d7b 100644 --- a/kernel/time/jiffies.c +++ b/kernel/time/jiffies.c @@ -337,8 +337,8 @@ int proc_dointvec_ms_jiffies_minmax(const struct ctl_ta= ble *table, int dir, int proc_doulongvec_ms_jiffies_minmax(const struct ctl_table *table, int d= ir, void *buffer, size_t *lenp, loff_t *ppos) { - return proc_doulongvec_minmax_conv(table, dir, buffer, lenp, ppos, - do_proc_ulong_conv_ms_jiffies); + return proc_doulongvec_conv(table, dir, buffer, lenp, ppos, + do_proc_ulong_conv_ms_jiffies); } EXPORT_SYMBOL(proc_doulongvec_ms_jiffies_minmax); =20 --=20 2.50.1 From nobody Tue Feb 10 02:00:43 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 63C55339860; Fri, 19 Dec 2025 12:16:12 +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=1766146572; cv=none; b=tWoGi5yvtsXsAFFReqFmKJAJf/OUr1p+zWrbrIZQXdjiefvaa4i74Tn2fxUIXauVZ9mtVdT2D7pXyDDYMU3tFjJwkQpCZ+syPcTtEmxGd8O4c+JNM0AxyHcmwt9qDw1HCjfRItaMhNUF2mJpYHoP5cAuGr6CVxgdys2+z85r7mY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766146572; c=relaxed/simple; bh=eyaAlhT7GvJk0qhWteiivwFW9DszaFjDaDK9NOAWZr0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=NjD+zEh/4Nwf0oinFojViQgLwIpC1QlDesRj/qxfdIKcCasEIIFarUeiEcOhU59iTUO/qOKYoCKoFenOTDpS4qfl0xhtsybzbW1JytdyA8wEW3ZvlCpUCD1LRThkan+QJNLNEx0t0RpxIywyRjMCIMd8gGLPfBDrSJxdrvuq9yo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Aa0EwxxR; 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="Aa0EwxxR" Received: by smtp.kernel.org (Postfix) with ESMTPS id 051B7C19424; Fri, 19 Dec 2025 12:16:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1766146572; bh=eyaAlhT7GvJk0qhWteiivwFW9DszaFjDaDK9NOAWZr0=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Aa0EwxxRe0j5hQaNpDvdrTmbVhOglobliWIxJaEyfeEOPTVeowDhGVl4WeYtiCsEk 3EtRZ7H6fZrss/icW+dprbYu+lCE6lIGa2Ak0DUPQoxNd/HtKXHtMG6xsLy2sAFN1q pgwi2F8PB+B6RrR//FAJIpWWfsYGgnDNsxbujUgNvJGIcZPZXIh/A+gFxR96mzZz8l LV4XSvl49q8GRc+IDzBv5f78PCt9XdY0dDNGQRgiN/GIJ8y+yTGVCLVP227vT4TBIJ q+Z7QIZEgzoN7bsmm8GvmgU6A764gclbHJiPpa8yXWGL2vtH7XHrG1HBqqY+U0QPj4 I0MCCbQa/MiEQ== 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 F24CBD78767; Fri, 19 Dec 2025 12:16:11 +0000 (UTC) From: Joel Granados Date: Fri, 19 Dec 2025 13:16:00 +0100 Subject: [PATCH 9/9] sysctl: Update API function documentation 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: <20251219-jag-dovec_consolidate-v1-9-1413b92c6040@kernel.org> References: <20251219-jag-dovec_consolidate-v1-0-1413b92c6040@kernel.org> In-Reply-To: <20251219-jag-dovec_consolidate-v1-0-1413b92c6040@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=5503; i=joel.granados@kernel.org; h=from:subject:message-id; bh=eyaAlhT7GvJk0qhWteiivwFW9DszaFjDaDK9NOAWZr0=; b=owJ4nAHtARL+kA0DAAoBupfNUreWQU8ByyZiAGlFQgl2j/tke9WV5lXX1Z5qLslstlVwvskoc H6HywWfCJe4E4kBswQAAQoAHRYhBK5HCVcl5jElzssnkLqXzVK3lkFPBQJpRUIJAAoJELqXzVK3 lkFPjyYL/0itMb/Er52OShWAef0GqQNRxocv7a4GVmiUHriWBBws1KMmOSYjzVpRaZPquXhK7Zo fpEhAEtuWEJiTIRKqibGbFsInUCrl3s8zoK5ZYAZFfQ1cVVHN2pxyQrJnO1M7Ef0RKan0oIOJZj 3+aS13Awg0i4ewXAJNcY521XcppJkp5Ej2dSKw+Jj/SSslteBDpMTJLw50HsIb5+mQDY+x3isWo 1Bmb/1QTdEBrOs21pmZ3cjIwTv2Ngcyci4MZmwi3nd39K5jRp5NdkcMPYUDnKU1DLWJQTAu35sw ZOXS/BNkA15KGxRR+yBeiQzyb+DWJRVttyP4kGYSx5ISN2IhsiG6KFqZ4qYtybJuEL3dPXscVdV LukowPs/md5D3knbOGzS7YrvJPzhjzBIhGkvK+EOE9qR71fmRTXuIVzrubj4ECvJXfE58OGTtrd O8LMTJhHz7xVDQY+JEZRBi4LejAo6W/q+txenZeSUYjmUaPeejNmX4IpsKs1UbYTxAfy7l/w2l3 3w= 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 Add colon ":" after argument name where it is missing Add doc for proc_int_conv and proc_dointvec_conv Signed-off-by: Joel Granados --- kernel/sysctl.c | 60 +++++++++++++++++++++++++++++++++++++++++++----------= ---- 1 file changed, 46 insertions(+), 14 deletions(-) diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 3fa59ef77f931c2753584ed03006f3ff9f5a1d0e..0965ea1212b4097fb21158b0800= 7cf550815a19f 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -365,7 +365,7 @@ static void proc_put_char(void **buf, size_t *size, cha= r c) * not NULL. Check that the values are less than UINT_MAX to avoid * having to support wrap around from userspace. * - * returns 0 on success. + * Returns: 0 on success. */ int proc_uint_u2k_conv_uop(const ulong *u_ptr, uint *k_ptr, ulong (*u_ptr_op)(const ulong)) @@ -386,7 +386,7 @@ int proc_uint_u2k_conv_uop(const ulong *u_ptr, uint *k_= ptr, * * Uses READ_ONCE to assign value to u_ptr. * - * returns 0 on success. + * Returns: 0 on success. */ int proc_uint_k2u_conv(ulong *u_ptr, const uint *k_ptr) { @@ -460,16 +460,16 @@ static int do_proc_uint_conv_minmax(bool *negp, ulong= *u_ptr, uint *k_ptr, =20 /** * 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; + * @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 + * @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. + * 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)) @@ -488,15 +488,15 @@ int proc_int_k2u_conv_kop(ulong *u_ptr, const int *k_= ptr, bool *negp, =20 /** * 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 + * @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. + * 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)) @@ -515,6 +515,23 @@ int proc_int_u2k_conv_uop(const ulong *u_ptr, int *k_p= tr, const bool *negp, return 0; } =20 +/** + * proc_int_conv - Change user or kernel pointer based on direction + * + * @negp: will be passed to uni-directional converters + * @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_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), @@ -910,7 +927,7 @@ int proc_ulong_conv(ulong *u_ptr, ulong *k_ptr, int dir, * Uses WRITE_ONCE to assign value to k_ptr. Executes u_ptr_op if * not NULL. * - * returns: 0 on success. + * Returns: 0 on success. */ int proc_ulong_u2k_conv_uop(const ulong *u_ptr, ulong *k_ptr, ulong (*u_ptr_op)(const ulong)) @@ -936,7 +953,7 @@ static int proc_ulong_u2k_conv(const ulong *u_ptr, ulon= g *k_ptr) * Uses READ_ONCE to assign value to u_ptr. Executes k_ptr_op if * not NULL. * - * returns: 0 on success. + * Returns: 0 on success. */ int proc_ulong_k2u_conv_kop(ulong *u_ptr, const ulong *k_ptr, ulong (*k_ptr_op)(const ulong)) @@ -1005,6 +1022,21 @@ int proc_doulongvec_minmax(const struct ctl_table *t= able, int dir, do_proc_ulong_conv); } =20 +/** + * proc_dointvec_conv - read a vector of ints with a custom converter + * + * @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. Defaults to do_proc_int_conv + * + * Reads/writes up to table->maxlen/sizeof(int) integer values from/to the + * user buffer, treated as an ASCII string. + * + * Returns: 0 on success + */ int proc_dointvec_conv(const struct ctl_table *table, int dir, void *buffe= r, size_t *lenp, loff_t *ppos, int (*conv)(bool *negp, unsigned long *u_ptr, int *k_ptr, --=20 2.50.1