On Sun, 2016-04-10 at 11:35 -0700, Greg Kroah-Hartman wrote: > 4.5-stable review patch. If anyone has any objections, please let me know. > > ------------------ > > From: Joshua Hunt <[email protected]> > > commit a1ee1932aa6bea0bb074f5e3ced112664e4637ed upstream. > > While working on a script to restore all sysctl params before a series of > tests I found that writing any value into the > /proc/sys/kernel/{nmi_watchdog,soft_watchdog,watchdog,watchdog_thresh} > causes them to call proc_watchdog_update(). > > NMI watchdog: enabled on all CPUs, permanently consumes one hw-PMU counter. > NMI watchdog: enabled on all CPUs, permanently consumes one hw-PMU counter. > NMI watchdog: enabled on all CPUs, permanently consumes one hw-PMU counter. > NMI watchdog: enabled on all CPUs, permanently consumes one hw-PMU counter. > > There doesn't appear to be a reason for doing this work every time a write > occurs, so only do it when the values change. > > Signed-off-by: Josh Hunt <[email protected]> > Acked-by: Don Zickus <[email protected]> > Reviewed-by: Aaron Tomlin <[email protected]> > Cc: Ulrich Obergfell <[email protected]> > Signed-off-by: Andrew Morton <[email protected]> > Signed-off-by: Linus Torvalds <[email protected]> > Signed-off-by: Greg Kroah-Hartman <[email protected]> > > --- > kernel/watchdog.c | 9 ++++++++- > 1 file changed, 8 insertions(+), 1 deletion(-) > > --- a/kernel/watchdog.c > +++ b/kernel/watchdog.c [...] > @@ -967,7 +970,7 @@ int proc_soft_watchdog(struct ctl_table > int proc_watchdog_thresh(struct ctl_table *table, int write, > void __user *buffer, size_t *lenp, loff_t *ppos) > { > - int err, old; > + int err, old, new; > > get_online_cpus(); > mutex_lock(&watchdog_proc_mutex); > @@ -987,6 +990,10 @@ int proc_watchdog_thresh(struct ctl_tabl > /* > * Update the sample period. Restore on failure. > */ > + new = ACCESS_ONCE(watchdog_thresh);
This ACCESS_ONCE() doesn't make any sense to me. Isn't watchdog_thresh
protected by watchdog_proc_mutex? If a race on watchdog_thresh is
still possible then the check for old == new isn't a valid
optimisation, and if it isn't possible then ACCESS_ONCE() shouldn't be
used here.
Ben.
> + if (old == new)
> + goto out;
> +
> set_sample_period();
> err = proc_watchdog_update();
> if (err) {
--
Ben Hutchings
This sentence contradicts itself - no actually it doesn't.
signature.asc
Description: This is a digitally signed message part

