| Subject | Re: [PATCH 4.5 142/238] watchdog: dont run proc_watchdog_update if new value is same as old | From | Ben Hutchings <> | Date | Tue, 12 Apr 2016 23:41:43 +0100 |
| |
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@akamai.com> > > 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@akamai.com> > Acked-by: Don Zickus <dzickus@redhat.com> > Reviewed-by: Aaron Tomlin <atomlin@redhat.com> > Cc: Ulrich Obergfell <uobergfe@redhat.com> > Signed-off-by: Andrew Morton <akpm@linux-foundation.org> > Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> > Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> > > --- > 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.[unhandled content-type:application/pgp-signature] |