| From: Alexey Dobriyan <adobriyan@gmail.com> |
| Subject: proc: use initializer for clearing some buffers |
| Date: Fri, 29 Sep 2023 19:30:18 +0300 |
| |
| Save LOC by using dark magic of initialisation instead of memset(). |
| |
| Those buffer aren't passed to userspace directly so padding is not |
| an issue. |
| |
| Link: https://lkml.kernel.org/r/3821d3a2-6e10-4629-b0d5-9519d828ab72@p183 |
| Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| fs/proc/base.c | 16 ++++++---------- |
| fs/proc/task_mmu.c | 11 +++-------- |
| 2 files changed, 9 insertions(+), 18 deletions(-) |
| |
| --- a/fs/proc/base.c~proc-use-initializer-for-clearing-some-buffers |
| +++ a/fs/proc/base.c |
| @@ -1153,11 +1153,10 @@ err_unlock: |
| static ssize_t oom_adj_write(struct file *file, const char __user *buf, |
| size_t count, loff_t *ppos) |
| { |
| - char buffer[PROC_NUMBUF]; |
| + char buffer[PROC_NUMBUF] = {}; |
| int oom_adj; |
| int err; |
| |
| - memset(buffer, 0, sizeof(buffer)); |
| if (count > sizeof(buffer) - 1) |
| count = sizeof(buffer) - 1; |
| if (copy_from_user(buffer, buf, count)) { |
| @@ -1213,11 +1212,10 @@ static ssize_t oom_score_adj_read(struct |
| static ssize_t oom_score_adj_write(struct file *file, const char __user *buf, |
| size_t count, loff_t *ppos) |
| { |
| - char buffer[PROC_NUMBUF]; |
| + char buffer[PROC_NUMBUF] = {}; |
| int oom_score_adj; |
| int err; |
| |
| - memset(buffer, 0, sizeof(buffer)); |
| if (count > sizeof(buffer) - 1) |
| count = sizeof(buffer) - 1; |
| if (copy_from_user(buffer, buf, count)) { |
| @@ -1358,13 +1356,13 @@ static ssize_t proc_fault_inject_write(s |
| const char __user * buf, size_t count, loff_t *ppos) |
| { |
| struct task_struct *task; |
| - char buffer[PROC_NUMBUF]; |
| + char buffer[PROC_NUMBUF] = {}; |
| int make_it_fail; |
| int rv; |
| |
| if (!capable(CAP_SYS_RESOURCE)) |
| return -EPERM; |
| - memset(buffer, 0, sizeof(buffer)); |
| + |
| if (count > sizeof(buffer) - 1) |
| count = sizeof(buffer) - 1; |
| if (copy_from_user(buffer, buf, count)) |
| @@ -1509,11 +1507,10 @@ sched_autogroup_write(struct file *file, |
| { |
| struct inode *inode = file_inode(file); |
| struct task_struct *p; |
| - char buffer[PROC_NUMBUF]; |
| + char buffer[PROC_NUMBUF] = {}; |
| int nice; |
| int err; |
| |
| - memset(buffer, 0, sizeof(buffer)); |
| if (count > sizeof(buffer) - 1) |
| count = sizeof(buffer) - 1; |
| if (copy_from_user(buffer, buf, count)) |
| @@ -1666,10 +1663,9 @@ static ssize_t comm_write(struct file *f |
| { |
| struct inode *inode = file_inode(file); |
| struct task_struct *p; |
| - char buffer[TASK_COMM_LEN]; |
| + char buffer[TASK_COMM_LEN] = {}; |
| const size_t maxlen = sizeof(buffer) - 1; |
| |
| - memset(buffer, 0, sizeof(buffer)); |
| if (copy_from_user(buffer, buf, count > maxlen ? maxlen : count)) |
| return -EFAULT; |
| |
| --- a/fs/proc/task_mmu.c~proc-use-initializer-for-clearing-some-buffers |
| +++ a/fs/proc/task_mmu.c |
| @@ -849,9 +849,7 @@ static void __show_smap(struct seq_file |
| static int show_smap(struct seq_file *m, void *v) |
| { |
| struct vm_area_struct *vma = v; |
| - struct mem_size_stats mss; |
| - |
| - memset(&mss, 0, sizeof(mss)); |
| + struct mem_size_stats mss = {}; |
| |
| smap_gather_stats(vma, &mss, 0); |
| |
| @@ -877,7 +875,7 @@ static int show_smap(struct seq_file *m, |
| static int show_smaps_rollup(struct seq_file *m, void *v) |
| { |
| struct proc_maps_private *priv = m->private; |
| - struct mem_size_stats mss; |
| + struct mem_size_stats mss = {}; |
| struct mm_struct *mm = priv->mm; |
| struct vm_area_struct *vma; |
| unsigned long vma_start = 0, last_vma_end = 0; |
| @@ -893,8 +891,6 @@ static int show_smaps_rollup(struct seq_ |
| goto out_put_task; |
| } |
| |
| - memset(&mss, 0, sizeof(mss)); |
| - |
| ret = mmap_read_lock_killable(mm); |
| if (ret) |
| goto out_put_mm; |
| @@ -1246,14 +1242,13 @@ static ssize_t clear_refs_write(struct f |
| size_t count, loff_t *ppos) |
| { |
| struct task_struct *task; |
| - char buffer[PROC_NUMBUF]; |
| + char buffer[PROC_NUMBUF] = {}; |
| struct mm_struct *mm; |
| struct vm_area_struct *vma; |
| enum clear_refs_types type; |
| int itype; |
| int rv; |
| |
| - memset(buffer, 0, sizeof(buffer)); |
| if (count > sizeof(buffer) - 1) |
| count = sizeof(buffer) - 1; |
| if (copy_from_user(buffer, buf, count)) |
| _ |