Commit 4cbc6902 authored by Wolfram Sang's avatar Wolfram Sang Committed by Guenter Roeck
Browse files

watchdog: softdog: make pretimeout support a compile option



It occurred to me that the panic pretimeout governor will stall the
softdog, because it is purely software which simply breaks when the
kernel panics. Testing governors with the softdog on the other hand is
really useful, so make this feature a compile time option which nees to
be enabled explicitly. This also removes the overhead if pretimeout
support is not used because it will now be compiled away (saving ~10% on
ARM32).

Signed-off-by: default avatarWolfram Sang <wsa+renesas@sang-engineering.com>
Reviewed-by: default avatarVladimir Zapolskiy <vladimir_zapolskiy@mentor.com>
Reviewed-by: default avatarGuenter Roeck <linux@roeck-us.net>
Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
parent 8ce6796d
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -71,6 +71,14 @@ config SOFT_WATCHDOG
	  To compile this driver as a module, choose M here: the
	  module will be called softdog.

config SOFT_WATCHDOG_PRETIMEOUT
	bool "Software watchdog pretimeout governor support"
	depends on SOFT_WATCHDOG && WATCHDOG_PRETIMEOUT_GOV
	help
	  Enable this if you want to use pretimeout governors with the software
	  watchdog. Be aware that governors might affect the watchdog because it
	  is purely software, e.g. the panic governor will stall it!

config DA9052_WATCHDOG
	tristate "Dialog DA9052 Watchdog"
	depends on PMIC_DA9052 || COMPILE_TEST
+13 −8
Original line number Diff line number Diff line
@@ -87,11 +87,13 @@ static int softdog_ping(struct watchdog_device *w)
	if (!mod_timer(&softdog_ticktock, jiffies + (w->timeout * HZ)))
		__module_get(THIS_MODULE);

	if (IS_ENABLED(CONFIG_SOFT_WATCHDOG_PRETIMEOUT)) {
		if (w->pretimeout)
			mod_timer(&softdog_preticktock, jiffies +
				  (w->timeout - w->pretimeout) * HZ);
		else
			del_timer(&softdog_preticktock);
	}

	return 0;
}
@@ -101,6 +103,7 @@ static int softdog_stop(struct watchdog_device *w)
	if (del_timer(&softdog_ticktock))
		module_put(THIS_MODULE);

	if (IS_ENABLED(CONFIG_SOFT_WATCHDOG_PRETIMEOUT))
		del_timer(&softdog_preticktock);

	return 0;
@@ -108,8 +111,7 @@ static int softdog_stop(struct watchdog_device *w)

static struct watchdog_info softdog_info = {
	.identity = "Software Watchdog",
	.options = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING | WDIOF_MAGICCLOSE |
		   WDIOF_PRETIMEOUT,
	.options = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING | WDIOF_MAGICCLOSE,
};

static const struct watchdog_ops softdog_ops = {
@@ -134,6 +136,9 @@ static int __init softdog_init(void)
	watchdog_set_nowayout(&softdog_dev, nowayout);
	watchdog_stop_on_reboot(&softdog_dev);

	if (IS_ENABLED(CONFIG_SOFT_WATCHDOG_PRETIMEOUT))
		softdog_info.options |= WDIOF_PRETIMEOUT;

	ret = watchdog_register_device(&softdog_dev);
	if (ret)
		return ret;