lkml.org 
[lkml]   [2021]   [Dec]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    SubjectRe: [PATCH] sysctl: Add a group of macro functions to initcall the sysctl table of each feature
    From
    Date
    On 2021/12/7 9:50, Joe Perches wrote:
    > On Mon, 2021-12-06 at 17:38 -0800, Andrew Morton wrote:
    >> On Tue, 7 Dec 2021 09:13:20 +0800 Xiaoming Ni <nixiaoming@huawei.com> wrote:
    >>
    >>> To avoid duplicated code, add a set of macro functions to initialize the
    >>> sysctl table for each feature.
    >>>
    >>> The system initialization process is as follows:
    >>>
    >>> start_kernel () {
    >>> ...
    >>> /* init proc and sysctl base,
    >>> * proc_root_init()-->proc_sys_init()-->sysctl_init_bases()
    >>> */
    >>> proc_root_init(); /* init proc and sysctl base */
    >>> ...
    >>> arch_call_rest_init();
    >>> }
    >>>
    >>> arch_call_rest_init()-->rest_init()-->kernel_init()
    >>> kernel_init() {
    >>> ...
    >>> kernel_init_freeable(); /* do all initcalls */
    >>> ...
    >>> do_sysctl_args(); /* Process the sysctl parameter: sysctl.*= */
    >>> }
    >>>
    >>> kernel_init_freeable()--->do_basic_setup()-->do_initcalls()
    >>> do_initcalls() {
    >>> for (level = 0; level < ARRAY_SIZE(initcall_levels) - 1; level++) {
    >>> do_initcall_level
    >>> }
    >>>
    >>> The sysctl interface of each subfeature should be registered after
    >>> sysctl_init_bases() and before do_sysctl_args(). It seems that the sysctl
    >>> interface does not depend on initcall_levels. To prevent the sysctl
    >>> interface from being initialized before the feature itself. The
    >>> lowest-level late_initcall() is used as the common sysctl interface
    >>> registration level.
    >>
    >> I'm not normally a fan of wrapping commonly-used code sequences into
    >> magical macros, but this one does seem to make sense.
    >>
    >> I wonder if it is possible to cook up a checkpatch rule to tell people
    >> to henceforth use the magic macros rather than to open-code things in
    >> the old way. Sounds hard.
    >
    > Almost impossible for checkpatch.
    > Likely easier in coccinelle.
    >

    Maybe we can add a rudimentary check to the checkpatch.

    diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
    index b01c36a15d9d..26e953ae4cc5 100755
    --- a/scripts/checkpatch.pl
    +++ b/scripts/checkpatch.pl
    @@ -7212,6 +7212,12 @@ sub process {
    "Deprecated use of '$deprecated_api',
    prefer '$new_api' instead\n" . $herecurr);
    }

    +# check register_sysctl_init
    + if ($prevline =~ /{/ && $rawline =~
    /\sregister_sysctl_init\(\"(kernel|fs|vm|debug|dev)\",\s+(.*)\)\;/) {
    + WARN("DEPRECATED_API",
    + "Deprecated use of
    'register_sysctl_init(\"$1\", $2);', prefer '$1_sysctl_initcall($2);'
    instead\n".$herecurr);
    + }
    +
    # check for various structs that are normally const (ops, kgdb,
    device_tree)
    # and avoid what seem like struct definitions 'struct foo {'
    if (defined($const_structs) &&


    Thanks
    Xiaoming Ni

    \
     
     \ /
      Last update: 2021-12-07 07:26    [W:2.927 / U:0.984 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site