Thread (19 messages) 19 messages, 8 authors, 2023-10-10

Re: [PATCH v2 00/15] sysctl: Remove sentinel elements from drivers

From: Joel Granados <hidden>
Date: 2023-10-03 08:45:47
Also in: dri-devel, intel-gfx, linux-hyperv, linux-raid, linux-rdma, linux-scsi, linux-serial, lkml, netdev, xen-devel

On Mon, Oct 02, 2023 at 12:27:18PM +0000, Christophe Leroy wrote:

Le 02/10/2023 à 10:55, Joel Granados via B4 Relay a écrit :
quoted
From: Joel Granados <redacted>
<--- snip --->
quoted
         - The "yesall" config saves 2432 bytes [4]
         - The "tiny" config saves 64 bytes [5]
     * memory usage:
         In this case there were no bytes saved because I do not have any
         of the drivers in the patch. To measure it comment the printk in
         `new_dir` and uncomment the if conditional in `new_links` [3].

---
Changes in v2:
- Left the dangling comma in the ctl_table arrays.
- Link to v1: https://lore.kernel.org/r/20230928-jag-sysctl_remove_empty_elem_drivers-v1-0-e59120fca9f9@samsung.com (local)

Comments/feedback greatly appreciated
Same problem on powerpc CI tests, all boot target failed, most of them 
with similar OOPS, see 
https://patchwork.ozlabs.org/project/linuxppc-dev/patch/20231002-jag-sysctl_remove_empty_elem_drivers-v2-15-02dd0d46f71e@samsung.com/
I found the culprit!. Here you are rebasing on top of v6.5.0-rc6 "INFO:
Looking for kernel version: 6.5.0-rc6-gbf2ac4d7d596". The error makes
sense becuase in that version we have not introduced the stopping
criteria based on the ctl_table array size, so the loop continues
looking for an empty sentinel past valid memory (and does not find it).
The ctl_table check catches it but then fails to do a proper error
because we have already tried to access invalid memory. The solution
here is to make sure to rebase in on top of the latest rc in v6.6.
What is strange is that I pushed your series into my github account, and 
got no failure, see https://github.com/chleroy/linux/actions/runs/6378951278
And here it works because you use the latest rc : "INFO: Looking for
kernel version: 6.6.0-rc3-g23d4b5db743c"
Christophe
quoted
Best

Joel

[1]
We are able to remove a sentinel table without behavioral change by
introducing a table_size argument in the same place where procname is
checked for NULL. The idea is for it to keep stopping when it hits
->procname == NULL, while the sentinel is still present. And when the
sentinel is removed, it will stop on the table_size. You can go to
(https://lore.kernel.org/all/20230809105006.1198165-1-j.granados@samsung.com/ (local))
for more information.

[2]
Links Related to the ctl_table sentinel removal:
* Good summary from Luis sent with the "pull request" for the
   preparation patches.
   https://lore.kernel.org/all/ZO5Yx5JFogGi%2FcBo@bombadil.infradead.org/ (local)
* Another very good summary from Luis.
   https://lore.kernel.org/all/ZMFizKFkVxUFtSqa@bombadil.infradead.org/ (local)
* This is a patch set that replaces register_sysctl_table with register_sysctl
   https://lore.kernel.org/all/20230302204612.782387-1-mcgrof@kernel.org/ (local)
* Patch set to deprecate register_sysctl_paths()
   https://lore.kernel.org/all/20230302202826.776286-1-mcgrof@kernel.org/ (local)
* Here there is an explicit expectation for the removal of the sentinel element.
   https://lore.kernel.org/all/20230321130908.6972-1-frank.li@vivo.com (local)
* The "ARRAY_SIZE" approach was mentioned (proposed?) in this thread
   https://lore.kernel.org/all/20220220060626.15885-1-tangmeng@uniontech.com (local)

[3]
To measure the in memory savings apply this on top of this patchset.

"
diff --git a/fs/proc/proc_sysctl.c b/fs/proc/proc_sysctl.c
index c88854df0b62..e0073a627bac 100644
--- a/fs/proc/proc_sysctl.c
+++ b/fs/proc/proc_sysctl.c
@@ -976,6 +976,8 @@ static struct ctl_dir *new_dir(struct ctl_table_set *set,
         table[0].procname = new_name;
         table[0].mode = S_IFDIR|S_IRUGO|S_IXUGO;
         init_header(&new->header, set->dir.header.root, set, node, table, 1);
+       // Counts additional sentinel used for each new dir.
+       printk("%ld sysctl saved mem kzalloc \n", sizeof(struct ctl_table));

         return new;
  }
@@ -1199,6 +1201,9 @@ static struct ctl_table_header *new_links(struct ctl_dir *dir, struct ctl_table_
                 link_name += len;
                 link++;
         }
+       // Counts additional sentinel used for each new registration
+       //if ((head->ctl_table + head->ctl_table_size)->procname)
+               printk("%ld sysctl saved mem kzalloc \n", sizeof(struct ctl_table));
         init_header(links, dir->header.root, dir->header.set, node, link_table,
                     head->ctl_table_size);
         links->nreg = nr_entries;
"
and then run the following bash script in the kernel:

accum=0
for n in $(dmesg | grep kzalloc | awk '{print $3}') ; do
     echo $n
     accum=$(calc "$accum + $n")
done
echo $accum

[4]
add/remove: 0/0 grow/shrink: 0/21 up/down: 0/-2432 (-2432)
Function                                     old     new   delta
xpc_sys_xpc_hb                               192     128     -64
xpc_sys_xpc                                  128      64     -64
vrf_table                                    128      64     -64
ucma_ctl_table                               128      64     -64
tty_table                                    192     128     -64
sg_sysctls                                   128      64     -64
scsi_table                                   128      64     -64
random_table                                 448     384     -64
raid_table                                   192     128     -64
oa_table                                     192     128     -64
mac_hid_files                                256     192     -64
iwcm_ctl_table                               128      64     -64
ipmi_table                                   128      64     -64
hv_ctl_table                                 128      64     -64
hpet_table                                   128      64     -64
firmware_config_table                        192     128     -64
cdrom_table                                  448     384     -64
balloon_table                                128      64     -64
parport_sysctl_template                      912     720    -192
parport_default_sysctl_table                 584     136    -448
parport_device_sysctl_template               776     136    -640
Total: Before=429940038, After=429937606, chg -0.00%

[5]
add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-64 (-64)
Function                                     old     new   delta
random_table                                 448     384     -64
Total: Before=1885527, After=1885463, chg -0.00%

[6] https://lore.kernel.org/all/20230913-jag-sysctl_remove_empty_elem_arch-v2-0-d1bd13a29bae@samsung.com/ (local)

Signed-off-by: Joel Granados <redacted>

To: Luis Chamberlain <mcgrof@kernel.org>
To: willy@infradead.org
To: josh@joshtriplett.org
To: Kees Cook <redacted>
To: Phillip Potter <phil@philpotter.co.uk>
To: Clemens Ladisch <clemens@ladisch.de>
To: Arnd Bergmann <arnd@arndb.de>
To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: Juergen Gross <jgross@suse.com>
To: Stefano Stabellini <sstabellini@kernel.org>
To: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>
To: Jiri Slaby <jirislaby@kernel.org>
To: "James E.J. Bottomley" <redacted>
To: "Martin K. Petersen" <martin.petersen@oracle.com>
To: Doug Gilbert <dgilbert@interlog.com>
To: Sudip Mukherjee <sudipm.mukherjee@gmail.com>
To: Jason Gunthorpe <jgg@ziepe.ca>
To: Leon Romanovsky <leon@kernel.org>
To: Corey Minyard <redacted>
To: Theodore Ts'o <tytso@mit.edu>
To: "Jason A. Donenfeld" <Jason@zx2c4.com>
To: David Ahern <dsahern@kernel.org>
To: "David S. Miller" <davem@davemloft.net>
To: Eric Dumazet <edumazet@google.com>
To: Jakub Kicinski <kuba@kernel.org>
To: Paolo Abeni <pabeni@redhat.com>
To: Robin Holt <robinmholt@gmail.com>
To: Steve Wahl <steve.wahl@hpe.com>
To: Russ Weight <redacted>
To: "Rafael J. Wysocki" <rafael@kernel.org>
To: Song Liu <song@kernel.org>
To: "K. Y. Srinivasan" <kys@microsoft.com>
To: Haiyang Zhang <haiyangz@microsoft.com>
To: Wei Liu <wei.liu@kernel.org>
To: Dexuan Cui <decui@microsoft.com>
To: Jani Nikula <jani.nikula@linux.intel.com>
To: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
To: Rodrigo Vivi <rodrigo.vivi@intel.com>
To: Tvrtko Ursulin <redacted>
To: David Airlie <airlied@gmail.com>
To: Daniel Vetter <redacted>
Cc: linux-kernel@vger.kernel.org
Cc: xen-devel@lists.xenproject.org
Cc: linux-serial@vger.kernel.org
Cc: linux-scsi@vger.kernel.org
Cc: linuxppc-dev@lists.ozlabs.org
Cc: linux-rdma@vger.kernel.org
Cc: openipmi-developer@lists.sourceforge.net
Cc: netdev@vger.kernel.org
Cc: linux-raid@vger.kernel.org
Cc: linux-hyperv@vger.kernel.org
Cc: intel-gfx@lists.freedesktop.org
Cc: dri-devel@lists.freedesktop.org

---

---
Joel Granados (15):
       cdrom: Remove now superfluous sentinel element from ctl_table array
       hpet: Remove now superfluous sentinel element from ctl_table array
       xen: Remove now superfluous sentinel element from ctl_table array
       tty: Remove now superfluous sentinel element from ctl_table array
       scsi: Remove now superfluous sentinel element from ctl_table array
       parport: Remove the now superfluous sentinel element from ctl_table array
       macintosh: Remove the now superfluous sentinel element from ctl_table array
       infiniband: Remove the now superfluous sentinel element from ctl_table array
       char-misc: Remove the now superfluous sentinel element from ctl_table array
       vrf: Remove the now superfluous sentinel element from ctl_table array
       sgi-xp: Remove the now superfluous sentinel element from ctl_table array
       fw loader: Remove the now superfluous sentinel element from ctl_table array
       raid: Remove now superfluous sentinel element from ctl_table array
       Drivers: hv: Remove now superfluous sentinel element from ctl_table array
       intel drm: Remove now superfluous sentinel element from ctl_table array

  drivers/base/firmware_loader/fallback_table.c |  1 -
  drivers/cdrom/cdrom.c                         |  1 -
  drivers/char/hpet.c                           |  1 -
  drivers/char/ipmi/ipmi_poweroff.c             |  1 -
  drivers/char/random.c                         |  1 -
  drivers/gpu/drm/i915/i915_perf.c              |  1 -
  drivers/hv/hv_common.c                        |  1 -
  drivers/infiniband/core/iwcm.c                |  1 -
  drivers/infiniband/core/ucma.c                |  1 -
  drivers/macintosh/mac_hid.c                   |  1 -
  drivers/md/md.c                               |  1 -
  drivers/misc/sgi-xp/xpc_main.c                |  2 --
  drivers/net/vrf.c                             |  1 -
  drivers/parport/procfs.c                      | 28 +++++++++++----------------
  drivers/scsi/scsi_sysctl.c                    |  1 -
  drivers/scsi/sg.c                             |  1 -
  drivers/tty/tty_io.c                          |  1 -
  drivers/xen/balloon.c                         |  1 -
  18 files changed, 11 insertions(+), 35 deletions(-)
---
base-commit: 0e945134b680040b8613e962f586d91b6d40292d
change-id: 20230927-jag-sysctl_remove_empty_elem_drivers-f034962a0d8c

Best regards,
-- 

Joel Granados

Attachments

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help