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 <johunt@xxxxxxxxxx> > > 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 <johunt@xxxxxxxxxx> > Acked-by: Don Zickus <dzickus@xxxxxxxxxx> > Reviewed-by: Aaron Tomlin <atomlin@xxxxxxxxxx> > Cc: Ulrich Obergfell <uobergfe@xxxxxxxxxx> > Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> > Signed-off-by: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> > Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> > > --- > 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.
Attachment:
signature.asc
Description: This is a digitally signed message part