All of lore.kernel.org
 help / color / mirror / Atom feed
From: ebiederm@xmission.com (Eric W. Biederman)
To: Xiaoming Ni <nixiaoming@huawei.com>
Cc: Luis Chamberlain <mcgrof@kernel.org>, <akpm@linux-foundation.org>,
	<keescook@chromium.org>, <yzaikin@google.com>,
	<peterz@infradead.org>, <gregkh@linuxfoundation.org>,
	<pjt@google.com>, <liu.hailong6@zte.com.cn>,
	<andriy.shevchenko@linux.intel.com>, <sre@kernel.org>,
	<penguin-kernel@i-love.sakura.ne.jp>, <pmladek@suse.com>,
	<senozhatsky@chromium.org>, <wangqing@vivo.com>, <bcrl@kvack.org>,
	<viro@zeniv.linux.org.uk>, <jack@suse.cz>, <amir73il@gmail.com>,
	<linux-fsdevel@vger.kernel.org>, <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v2 2/9] sysctl: Move some boundary constants from sysctl.c to sysctl_vals
Date: Wed, 24 Nov 2021 11:38:19 -0600	[thread overview]
Message-ID: <87zgpte9o4.fsf@email.froward.int.ebiederm.org> (raw)
In-Reply-To: <a2d657e4-617a-ff4b-1334-928560701589@huawei.com> (Xiaoming Ni's message of "Wed, 24 Nov 2021 15:05:00 +0800")

Xiaoming Ni <nixiaoming@huawei.com> writes:

> On 2021/11/24 12:51, Eric W. Biederman wrote:
>> Luis Chamberlain <mcgrof@kernel.org> writes:
>>
>>> From: Xiaoming Ni <nixiaoming@huawei.com>
>>>
>>> sysctl has helpers which let us specify boundary values for a min or
>>> max int value. Since these are used for a boundary check only they don't
>>> change, so move these variables to sysctl_vals to avoid adding duplicate
>>> variables. This will help with our cleanup of kernel/sysctl.c.
>>
>> Ouch.
>>
>> I kind of, sort of, have to protest.
>>
>> Where the macros that use sysctl_vals don't have a type they have caused
>> mysterious code breakage because people did not realize they can not be
>> used with sysctls that take a long instead of an int.
>>
>> This came up with when the internal storage for ucounts see
>> kernel/ucount.c changed from an int to a long.  We were quite a while
>> tracking what was going on until we realized that the code could not use
>> SYSCTL_ZERO and SYSCTL_INT_MAX and that we had to defined our own thatSYSCTL_ZERO and SYSCTL_ZERO involve dozens of files and are used in hundreds of places.
>> were long.
>>
> static unsigned long zero_ul;
> static unsigned long one_ul = 1;
> static unsigned long long_max = LONG_MAX;
> EXPORT_SYMBOL(proc_doulongvec_minmax);
>
> Yes, min/max of type unsigned long is used in multiple sysctl
> interfaces. It is necessary to add an unsigned long sysctl_val array
> to avoid repeated definitions in different .c files.
>
>> So before we extend something like this can we please change the
>> macro naming convention so that it includes the size of the type
>> we want.
>>
> The int type is the most widely used type. By default, numeric
> constants are also of the int type. SYSCTL_ZERO and SYSCTL_ZERO
> involve dozens of files and are used in hundreds of places. Whether
> only non-int macros need to be named with their type size?
>
>>
>> I am also not a fan of sysctl_vals living in proc_sysctl.  They
>> have nothing to do with the code in that file.  They would do much
>> better in kernel/sysctl.c close to the helpers that use them.
>>
> yes
>

Looking a little more.  I think it makes sense to do something like:

diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h
index 1fa2b69c6fc3..c299009421ea 100644
--- a/include/linux/sysctl.h
+++ b/include/linux/sysctl.h
@@ -121,8 +121,8 @@ struct ctl_table {
        struct ctl_table *child;        /* Deprecated */
        proc_handler *proc_handler;     /* Callback for text formatting */
        struct ctl_table_poll *poll;
-       void *extra1;
-       void *extra2;
+       long min;
+       long max;
 } __randomize_layout;

Nearly every use of .extra1 and .extra2 are for min and max values.
A long takes the same storage as a void * parameter.

So it would be a net saving in storage as you don't have separate
storage for the values anywhere.

There are a few cases where .extra1 is used for something else
so keeping a "void *extra" field will probably be needed.

By finishing the removal of the child field adding a "void *extra"
field can be done at no storage cost.

Having the min and max parameters in the structure has the major
advantage that there is no redirection, and no fancy games.  People
can just read the value from the structure initializer.  Plus a
conversion from int to long won't requiring changing the min and
max constants.

So really I think instead of doubling down on the error prone case
that we have and extending sysctl_vals we should just get rid of
it entirely.

It is a bit more work to make that change but the long term result is
much better.

Any chance we can do that for a cleanup instead of extending sysctl_vals?

Eric

  reply	other threads:[~2021-11-24 17:39 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-11-23 20:23 [PATCH v2 0/9] sysctl: first set of kernel/sysctl cleanups Luis Chamberlain
2021-11-23 20:23 ` [PATCH v2 1/9] sysctl: add a new register_sysctl_init() interface Luis Chamberlain
2021-11-25 16:14   ` Petr Mladek
2021-11-29 21:01     ` Luis Chamberlain
2021-11-23 20:23 ` [PATCH v2 2/9] sysctl: Move some boundary constants from sysctl.c to sysctl_vals Luis Chamberlain
2021-11-24  4:51   ` Eric W. Biederman
2021-11-24  7:05     ` Xiaoming Ni
2021-11-24 17:38       ` Eric W. Biederman [this message]
2021-11-24 23:12         ` Luis Chamberlain
2021-11-23 20:23 ` [PATCH v2 3/9] hung_task: Move hung_task sysctl interface to hung_task.c Luis Chamberlain
2021-11-26  9:46   ` Petr Mladek
2021-11-23 20:23 ` [PATCH v2 4/9] watchdog: move watchdog sysctl interface to watchdog.c Luis Chamberlain
2021-11-26  9:40   ` Petr Mladek
2021-11-23 20:23 ` [PATCH v2 5/9] sysctl: make ngroups_max const Luis Chamberlain
2021-11-23 20:23 ` [PATCH v2 6/9] sysctl: use const for typically used max/min proc sysctls Luis Chamberlain
2021-11-23 20:23 ` [PATCH v2 7/9] sysctl: use SYSCTL_ZERO to replace some static int zero uses Luis Chamberlain
2021-11-23 20:23 ` [PATCH v2 8/9] aio: move aio sysctl to aio.c Luis Chamberlain
2021-11-24  9:32   ` Jan Kara
2021-11-23 20:23 ` [PATCH v2 9/9] dnotify: move dnotify sysctl to dnotify.c Luis Chamberlain
2021-11-24  9:31   ` Jan Kara
2021-11-24  0:14 ` [PATCH v2 0/9] sysctl: first set of kernel/sysctl cleanups Andrew Morton
2021-11-24  0:27   ` Luis Chamberlain

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87zgpte9o4.fsf@email.froward.int.ebiederm.org \
    --to=ebiederm@xmission.com \
    --cc=akpm@linux-foundation.org \
    --cc=amir73il@gmail.com \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=bcrl@kvack.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=jack@suse.cz \
    --cc=keescook@chromium.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=liu.hailong6@zte.com.cn \
    --cc=mcgrof@kernel.org \
    --cc=nixiaoming@huawei.com \
    --cc=penguin-kernel@i-love.sakura.ne.jp \
    --cc=peterz@infradead.org \
    --cc=pjt@google.com \
    --cc=pmladek@suse.com \
    --cc=senozhatsky@chromium.org \
    --cc=sre@kernel.org \
    --cc=viro@zeniv.linux.org.uk \
    --cc=wangqing@vivo.com \
    --cc=yzaikin@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.