Messages in this thread | | | Date | Wed, 29 Mar 2023 14:28:25 -0400 | Subject | Re: [PATCH] sched/numa: Fix divide by zero for sysctl_numa_balancing_scan_size. | From | chris hyser <> |
| |
On 3/29/23 12:26, Chris Hyser wrote: > From: chris hyser <chris.hyser@oracle.com>
Apologies. Something in my email chain put this in, but I think I figured it out and sent a version 1.
-chrish
> > Commit 6419265899d9 ("sched/fair: Fix division by zero > sysctl_numa_balancing_scan_size") prevented a divide by zero by using > sysctl mechanisms to return EINVAL for a sysctl_numa_balancing_scan_size > value of zero. When moved from a sysctl to a debugfs file, this checking > was lost. > > This patch puts zero checking back in place. > > Signed-off-by: Chris Hyser <chris.hyser@oracle.com> > --- > kernel/sched/debug.c | 50 +++++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 49 insertions(+), 1 deletion(-) > > diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c > index 1637b65ba07a..dfd0fe6123ec 100644 > --- a/kernel/sched/debug.c > +++ b/kernel/sched/debug.c > @@ -278,6 +278,54 @@ static const struct file_operations sched_dynamic_fops = { > > #endif /* CONFIG_PREEMPT_DYNAMIC */ > > +#ifdef CONFIG_NUMA_BALANCING > + > +static ssize_t sched_numa_scan_write(struct file *filp, const char __user *ubuf, > + size_t cnt, loff_t *ppos) > +{ > + char buf[16]; > + unsigned int scan_size; > + > + if (cnt > 15) > + cnt = 15; > + > + if (copy_from_user(&buf, ubuf, cnt)) > + return -EFAULT; > + buf[cnt] = '\0'; > + > + if (kstrtouint(buf, 10, &scan_size)) > + return -EINVAL; > + > + if (!scan_size) > + return -EINVAL; > + > + sysctl_numa_balancing_scan_size = scan_size; > + > + *ppos += cnt; > + return cnt; > +} > + > +static int sched_numa_scan_show(struct seq_file *m, void *v) > +{ > + seq_printf(m, "%d\n", sysctl_numa_balancing_scan_size); > + return 0; > +} > + > +static int sched_numa_scan_open(struct inode *inode, struct file *filp) > +{ > + return single_open(filp, sched_numa_scan_show, NULL); > +} > + > +static const struct file_operations sched_numa_scan_fops = { > + .open = sched_numa_scan_open, > + .write = sched_numa_scan_write, > + .read = seq_read, > + .llseek = seq_lseek, > + .release = single_release, > +}; > + > +#endif /* CONFIG_NUMA_BALANCING */ > + > __read_mostly bool sched_debug_verbose; > > static const struct seq_operations sched_debug_sops; > @@ -332,7 +380,7 @@ static __init int sched_init_debug(void) > debugfs_create_u32("scan_delay_ms", 0644, numa, &sysctl_numa_balancing_scan_delay); > debugfs_create_u32("scan_period_min_ms", 0644, numa, &sysctl_numa_balancing_scan_period_min); > debugfs_create_u32("scan_period_max_ms", 0644, numa, &sysctl_numa_balancing_scan_period_max); > - debugfs_create_u32("scan_size_mb", 0644, numa, &sysctl_numa_balancing_scan_size); > + debugfs_create_file("scan_size_mb", 0644, numa, NULL, &sched_numa_scan_fops); > debugfs_create_u32("hot_threshold_ms", 0644, numa, &sysctl_numa_balancing_hot_threshold); > #endif >
| |