[WATCHDOG] w836?7hf_wdt spinlock fixes.
authorWim Van Sebroeck <wim@iguana.be>
Sat, 2 Sep 2006 16:50:20 +0000 (18:50 +0200)
committerWim Van Sebroeck <wim@iguana.be>
Wed, 4 Oct 2006 20:41:48 +0000 (22:41 +0200)
Add io spinlocks to prevent possible race
conditions between start and stop operations
that are issued from different child processes
where the master process opened /dev/watchdog.

Signed-off-by: Wim Van Sebroeck <wim@iguana.be>
drivers/char/watchdog/w83627hf_wdt.c
drivers/char/watchdog/w83697hf_wdt.c

index b4adc52..07d4bff 100644 (file)
@@ -33,6 +33,7 @@
 #include <linux/notifier.h>
 #include <linux/reboot.h>
 #include <linux/init.h>
+#include <linux/spinlock.h>
 
 #include <asm/io.h>
 #include <asm/uaccess.h>
@@ -44,6 +45,7 @@
 
 static unsigned long wdt_is_open;
 static char expect_close;
+static spinlock_t io_lock;
 
 /* You must set this - there is no sane way to probe for this board. */
 static int wdt_io = 0x2E;
@@ -110,12 +112,16 @@ w83627hf_init(void)
 static void
 wdt_ctrl(int timeout)
 {
+       spin_lock(&io_lock);
+       
        w83627hf_select_wd_register();
 
        outb_p(0xF6, WDT_EFER);    /* Select CRF6 */
        outb_p(timeout, WDT_EFDR); /* Write Timeout counter to CRF6 */
 
        w83627hf_unselect_wd_register();
+
+       spin_unlock(&io_lock);
 }
 
 static int
@@ -303,6 +309,8 @@ wdt_init(void)
 {
        int ret;
 
+       spin_lock_init(&io_lock);
+
        printk(KERN_INFO "WDT driver for the Winbond(TM) W83627HF Super I/O chip initialising.\n");
 
        if (wdt_set_heartbeat(timeout)) {
index ef6612e..21e822e 100644 (file)
@@ -33,6 +33,7 @@
 #include <linux/notifier.h>
 #include <linux/reboot.h>
 #include <linux/init.h>
+#include <linux/spinlock.h>
 
 #include <asm/io.h>
 #include <asm/uaccess.h>
@@ -44,6 +45,7 @@
 
 static unsigned long wdt_is_open;
 static char expect_close;
+static spinlock_t io_lock;
 
 /* You must set this - there is no sane way to probe for this board. */
 static int wdt_io = 0x2E;
@@ -114,12 +116,16 @@ w83697hf_init(void)
 static void
 wdt_ctrl(int timeout)
 {
+       spin_lock(&io_lock);
+
        w83697hf_select_wd_register();
 
        outb_p(0xF4, WDT_EFER);    /* Select CRF4 */
        outb_p(timeout, WDT_EFDR); /* Write Timeout counter to CRF4 */
 
        w83697hf_unselect_wd_register();
+
+       spin_unlock(&io_lock);
 }
 
 static int
@@ -307,6 +313,8 @@ wdt_init(void)
 {
        int ret;
 
+       spin_lock_init(&io_lock);
+
        printk(KERN_INFO "WDT driver for the Winbond(TM) W83697HF Super I/O chip initialising.\n");
 
        if (wdt_set_heartbeat(timeout)) {