From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759529Ab3GZQID (ORCPT ); Fri, 26 Jul 2013 12:08:03 -0400 Received: from mx1.redhat.com ([209.132.183.28]:10398 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757958Ab3GZQH6 (ORCPT ); Fri, 26 Jul 2013 12:07:58 -0400 Date: Fri, 26 Jul 2013 12:07:45 -0400 From: Don Zickus To: Michal Hocko Cc: linux-kernel@vger.kernel.org, Andrew Morton , Frederic Weisbecker , Thomas Gleixner , Ingo Molnar Subject: Re: [PATCH 1/2] watchdog: update watchdog attributes atomically Message-ID: <20130726160745.GJ58219@redhat.com> References: <1374842975-22982-1-git-send-email-mhocko@suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1374842975-22982-1-git-send-email-mhocko@suse.cz> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Jul 26, 2013 at 02:49:34PM +0200, Michal Hocko wrote: > proc_dowatchdog doesn't synchronize multiple callers which > might lead to confusion when two parallel callers might confuse > watchdog_enable_all_cpus resp. watchdog_disable_all_cpus (e.g. watchdog > gets enabled even if watchdog_thresh was set to 0 already). > > This patch adds a local mutex which synchronizes callers to the sysctl > handler. > > Signed-off-by: Michal Hocko Acked-by: Don Zickus > --- > kernel/watchdog.c | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > > diff --git a/kernel/watchdog.c b/kernel/watchdog.c > index 1241d8c..2d64c02 100644 > --- a/kernel/watchdog.c > +++ b/kernel/watchdog.c > @@ -520,13 +520,15 @@ int proc_dowatchdog(struct ctl_table *table, int write, > void __user *buffer, size_t *lenp, loff_t *ppos) > { > int err, old_thresh, old_enabled; > + static DEFINE_MUTEX(watchdog_proc_mutex); > > + mutex_lock(&watchdog_proc_mutex); > old_thresh = ACCESS_ONCE(watchdog_thresh); > old_enabled = ACCESS_ONCE(watchdog_user_enabled); > > err = proc_dointvec_minmax(table, write, buffer, lenp, ppos); > if (err || !write) > - return err; > + goto out; > > set_sample_period(); > /* > @@ -544,7 +546,8 @@ int proc_dowatchdog(struct ctl_table *table, int write, > watchdog_thresh = old_thresh; > watchdog_user_enabled = old_enabled; > } > - > +out: > + mutex_unlock(&watchdog_proc_mutex); > return err; > } > #endif /* CONFIG_SYSCTL */ > -- > 1.8.3.2 >