watchdog: new option to skip ping in close
PATCH v2 1/1 watchdog: new option to skip ping in close
If a daemon has /dev/watchdog open, and exits (say by crashing or sigkill), watchdog_release() generates a new watchdog_ping(), extending the life of the machine. However, the daemon may require control over whether or not the watchdog is pinged, and the ping generated by close compromises this control.
--- drivers/watchdog/watchdog_dev.c | 7 ++++++- include/linux/watchdog.h | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-)
drivers/watchdog/watchdog_dev.c +6 -1
@@ -394,6 +394,9 @@ static long watchdog_ioctl(struct file *file, unsigned int cmd,if (err)return err;return put_user (val, p); +case WDIOC_NOCLOSEPING : +set_bit (WDOG_NO_CLOSE_PING , &wdd->status); +return 0 ;default :return -ENOTTY ; }
@@ -480,7 +483,9 @@ static int watchdog_release(struct inode *inode, struct file *file)if (!test_bit (WDOG_UNREGISTERED , &wdd->status))dev_crit (wdd->dev,"watchdog did not stop!\n" );mutex_unlock (&wdd->lock); -watchdog_ping (wdd); + +if (!test_bit (WDOG_NO_CLOSE_PING , &wdd->status)) +watchdog_ping (wdd); }/* Allow the owner module to be unloaded again */
include/linux/watchdog.h +2 -0
@@ -31,6 +31,7 @@ struct watchdog_info {#define WDIOC_SETPRETIMEOUT _IOWR(WATCHDOG_IOCTL_BASE, 8, int)#define WDIOC_GETPRETIMEOUT _IOR(WATCHDOG_IOCTL_BASE, 9, int)#define WDIOC_GETTIMELEFT _IOR(WATCHDOG_IOCTL_BASE, 10, int) +#define WDIOC_NOCLOSEPING _IOR(WATCHDOG_IOCTL_BASE, 11, int)#define WDIOF_UNKNOWN -1/* Unknown flag error */ #define WDIOS_UNKNOWN -1/* Unknown status error */
@@ -140,6 +141,7 @@ struct watchdog_device {#define WDOG_ALLOW_RELEASE 2/* Did we receive the magic char ? */ #define WDOG_NO_WAY_OUT 3/* Is 'nowayout' feature set ? */ #define WDOG_UNREGISTERED 4/* Has the device been unregistered */ +#define WDOG_NO_CLOSE_PING 5/* Do not ping in watchdog_release() */ };#ifdef CONFIG_WATCHDOG_NOWAYOUT
Signature · 1 line
1.7.10.1.362.g242cab3
Hi,
Code wise this version gets an ACK from me, API wise I'm not sure, so lets see what Wim Van Sebroeck (the watchdog subsys maintainer) has to say on this patch.
Regards,
Hans
Quoted 58 lines · David Teigland
If a daemon has
/dev/watchdogopen, and exits (say by crashing or sigkill),watchdog_release()generates a newwatchdog_ping(), extending the life of the machine. However, the daemon may require control over whether or not the watchdog is pinged, and the ping generated by close compromises this control.Signed-off-by David Teigland <[email protected]>--- drivers/watchdog/watchdog_dev.c | 7 ++++++- include/linux/watchdog.h | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-)drivers/watchdog/watchdog_dev.c +6
-1@@ -394,6 +394,9 @@ static long watchdog_ioctl(struct file *file, unsigned int cmd,if (err)return err;return put_user (val, p); +case WDIOC_NOCLOSEPING : +set_bit (WDOG_NO_CLOSE_PING , &wdd->status); +return 0 ;default :return -ENOTTY ; }@@ -480,7 +483,9 @@ static int watchdog_release(struct inode *inode, struct file *file)if (!test_bit (WDOG_UNREGISTERED , &wdd->status))dev_crit (wdd->dev,"watchdog did not stop!\n" );mutex_unlock (&wdd->lock); -watchdog_ping (wdd); + +if (!test_bit (WDOG_NO_CLOSE_PING , &wdd->status)) +watchdog_ping (wdd); }/* Allow the owner module to be unloaded again */ include/linux/watchdog.h +2
-0@@ -31,6 +31,7 @@ struct watchdog_info {#define WDIOC_SETPRETIMEOUT _IOWR(WATCHDOG_IOCTL_BASE, 8, int)#define WDIOC_GETPRETIMEOUT _IOR(WATCHDOG_IOCTL_BASE, 9, int)#define WDIOC_GETTIMELEFT _IOR(WATCHDOG_IOCTL_BASE, 10, int) +#define WDIOC_NOCLOSEPING _IOR(WATCHDOG_IOCTL_BASE, 11, int)#define WDIOF_UNKNOWN -1/* Unknown flag error */ #define WDIOS_UNKNOWN -1/* Unknown status error */ @@ -140,6 +141,7 @@ struct watchdog_device {#define WDOG_ALLOW_RELEASE 2/* Did we receive the magic char ? */ #define WDOG_NO_WAY_OUT 3/* Is 'nowayout' feature set ? */ #define WDOG_UNREGISTERED 4/* Has the device been unregistered */ +#define WDOG_NO_CLOSE_PING 5/* Do not ping in watchdog_release() */ };#ifdef CONFIG_WATCHDOG_NOWAYOUT