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 appreciatedSame 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"
Christophequoted
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
- signature.asc [application/pgp-signature] 659 bytes