The patch titled Subject: proc: calculate end pointer for /proc/*/* lookup at compile time has been added to the -mm tree. Its filename is proc-calculate-end-pointer-for-proc-lookup-at-compile-time.patch This patch should soon appear at http://ozlabs.org/~akpm/mmots/broken-out/proc-calculate-end-pointer-for-proc-lookup-at-compile-time.patch and later at http://ozlabs.org/~akpm/mmotm/broken-out/proc-calculate-end-pointer-for-proc-lookup-at-compile-time.patch Before you just go and hit "reply", please: a) Consider who else should be cc'ed b) Prefer to cc a suitable mailing list as well c) Ideally: find the original patch on the mailing list and do a reply-to-all to that, adding suitable additional cc's *** Remember to use Documentation/process/submit-checklist.rst when testing your code *** The -mm tree is included into linux-next and is updated there every 3-4 working days ------------------------------------------------------ From: Alexey Dobriyan <adobriyan@xxxxxxxxx> Subject: proc: calculate end pointer for /proc/*/* lookup at compile time Compilers like to transform loops like for (i = 0; i < n; i++) { [use p[i]] } into for (p = p0; p < end; p++) { ... } Do it by hand, so that it results in overall simpler loop and smaller code. Space savings: $ ./scripts/bloat-o-meter ../vmlinux-001 ../obj/vmlinux add/remove: 0/0 grow/shrink: 2/1 up/down: 4/-9 (-5) Function old new delta proc_tid_base_lookup 17 19 +2 proc_tgid_base_lookup 17 19 +2 proc_pident_lookup 179 170 -9 Note: this trick bloats readdir, so don't do it :-\ Link: http://lkml.kernel.org/r/20190114200422.GB9680@avx2 Signed-off-by: Alexey Dobriyan <adobriyan@xxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- fs/proc/base.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) --- a/fs/proc/base.c~proc-calculate-end-pointer-for-proc-lookup-at-compile-time +++ a/fs/proc/base.c @@ -2446,11 +2446,10 @@ static struct dentry *proc_pident_instan static struct dentry *proc_pident_lookup(struct inode *dir, struct dentry *dentry, - const struct pid_entry *ents, - unsigned int nents) + const struct pid_entry *p, + const struct pid_entry *end) { struct task_struct *task = get_proc_task(dir); - const struct pid_entry *p, *last; struct dentry *res = ERR_PTR(-ENOENT); if (!task) @@ -2460,8 +2459,7 @@ static struct dentry *proc_pident_lookup * Yes, it does not scale. And it should not. Don't add * new entries into /proc/<tgid>/ without very good reasons. */ - last = &ents[nents]; - for (p = ents; p < last; p++) { + for (; p < end; p++) { if (p->len != dentry->d_name.len) continue; if (!memcmp(dentry->d_name.name, p->name, p->len)) { @@ -2600,7 +2598,8 @@ static struct dentry *proc_attr_dir_look struct dentry *dentry, unsigned int flags) { return proc_pident_lookup(dir, dentry, - attr_dir_stuff, ARRAY_SIZE(attr_dir_stuff)); + attr_dir_stuff, + attr_dir_stuff + ARRAY_SIZE(attr_dir_stuff)); } static const struct inode_operations proc_attr_dir_inode_operations = { @@ -3036,7 +3035,8 @@ static const struct file_operations proc static struct dentry *proc_tgid_base_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags) { return proc_pident_lookup(dir, dentry, - tgid_base_stuff, ARRAY_SIZE(tgid_base_stuff)); + tgid_base_stuff, + tgid_base_stuff + ARRAY_SIZE(tgid_base_stuff)); } static const struct inode_operations proc_tgid_base_inode_operations = { @@ -3408,7 +3408,8 @@ static int proc_tid_base_readdir(struct static struct dentry *proc_tid_base_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags) { return proc_pident_lookup(dir, dentry, - tid_base_stuff, ARRAY_SIZE(tid_base_stuff)); + tid_base_stuff, + tid_base_stuff + ARRAY_SIZE(tid_base_stuff)); } static const struct file_operations proc_tid_base_operations = { _ Patches currently in -mm which might be from adobriyan@xxxxxxxxx are proc-fix-proc-net-after-setns2.patch proc-fix-proc-net-after-setns2-v2.patch mm-shuffle-gfp_-flags.patch proc-return-exit-code-4-for-skipped-tests.patch proc-read-kernel-cpu-stat-pointer-once.patch proc-calculate-end-pointer-for-proc-lookup-at-compile-time.patch proc-use-seq_puts-everywhere.patch