Re: [PATCHv3 1/2] watchdog: stmp3xxx: Stop the watchdog on system halt

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello Uwe.

Uwe Kleine-König writes:
> Hello,
> 
> On Wed, Oct 07, 2015 at 12:19:11PM +0000, Harald Geyer wrote:
> > This allows the system to actually halt even if userspace forgot to
> > disable the watchdog first. Old behaviour was that the watchdog forced
> > the system to boot again.
> > 
> > Signed-off-by: Harald Geyer <harald@xxxxxxxxx>
> > ---
> > Changes since v2:
> > * split this out as a separate patch
> > 
> >  drivers/watchdog/stmp3xxx_rtc_wdt.c |   28 ++++++++++++++++++++++++++++
> >  1 file changed, 28 insertions(+)
> > 
> > diff --git a/drivers/watchdog/stmp3xxx_rtc_wdt.c b/drivers/watchdog/stmp3xxx_rtc_wdt.c
> > index 3ee6128..e09a01f 100644
> > --- a/drivers/watchdog/stmp3xxx_rtc_wdt.c
> > +++ b/drivers/watchdog/stmp3xxx_rtc_wdt.c
> > @@ -14,6 +14,8 @@
> >  #include <linux/watchdog.h>
> >  #include <linux/platform_device.h>
> >  #include <linux/stmp3xxx_rtc_wdt.h>
> > +#include <linux/notifier.h>
> > +#include <linux/reboot.h>
> >  
> >  #define WDOG_TICK_RATE 1000 /* 1 kHz clock */
> >  #define STMP3XXX_DEFAULT_TIMEOUT 19
> > @@ -69,6 +71,28 @@ static struct watchdog_device stmp3xxx_wdd = {
> >  	.status = WATCHDOG_NOWAYOUT_INIT_STATUS,
> >  };
> >  
> > +static int wdt_notify_sys(struct notifier_block *nb, unsigned long code,
> > +			  void *unused)
> > +{
> > +	struct device *dev = watchdog_get_drvdata(&stmp3xxx_wdd);
> > +	struct stmp3xxx_wdt_pdata *pdata = dev_get_platdata(dev);
> > +
> > +	switch (code) {
> > +	case SYS_DOWN:	/* keep enabled, system might crash while going down */
> > +		break;
> > +	case SYS_HALT:  /* allow the system to actually halt */
> 
> <nitpick>
> You used a tab before the comment "keep enabled ...", but spaces for
> "allow the system ...".
> </nitpick>

Ok
 
> > +	case SYS_POWER_OFF:
> > +		wdt_stop(&stmp3xxx_wdd);
> > +		break;
> > +	}
> > +
> > +	return NOTIFY_DONE;
> > +}
> > +
> > +static struct notifier_block wdt_notifier = {
> > +	.notifier_call  = wdt_notify_sys,
> 
> s/  / /

Ok

> > +};
> > +
> >  static int stmp3xxx_wdt_probe(struct platform_device *pdev)
> >  {
> >  	int ret;
> > @@ -84,6 +108,9 @@ static int stmp3xxx_wdt_probe(struct platform_device *pdev)
> >  		return ret;
> >  	}
> >  
> > +	if (register_reboot_notifier(&wdt_notifier))
> > +		dev_warn(&pdev->dev, "cannot register reboot notifier\n");
> 
> OK, you don't fail when registering the notifier fails, but ...
> 
> >  	dev_info(&pdev->dev, "initialized watchdog with heartbeat %ds\n",
> >  			stmp3xxx_wdd.timeout);
> >  	return 0;
> > @@ -91,6 +118,7 @@ static int stmp3xxx_wdt_probe(struct platform_device *pdev)
> >  
> >  static int stmp3xxx_wdt_remove(struct platform_device *pdev)
> >  {
> > +	unregister_reboot_notifier(&wdt_notifier);
> 
> ... I think it's not ok to unconditionally unregister it then, is it?
> (Looking at how unregister_reboot_notifier is implemented it might work
> as intended, but if that's only by chance I wouldn't rely on it.)

I'm not sure what you refer to by "how unregister_reboot_notifier is
implemented". The documentation for unregister_reboot_notifier says:
/**
  *      unregister_reboot_notifier - Unregister previously registered reboot notifier
  *      @nb: Hook to be unregistered
  *
  *      Unregisters a previously registered reboot
  *      notifier function.
  *
  *      Returns zero on success, or %-ENOENT on failure.
  */

If register_reboot_notifier failed, then unregister_reboot_notifier will
simply return -ENOENT, I don't see a problem here. As this is documented
API I think we can rely on it.

Can you also have a look at the following patch (next in this series,
unfortunately I failed a formatting the subject prefix properly):
http://www.spinics.net/lists/linux-watchdog/msg07483.html

That one is particularly messy, as I don't have all the HW documentation
I wish I had, so I'd appreciate if somebody, who has experience with
the hardware, looked at it.

Thanks,
Harald

> Best regards
> Uwe
> 
> >  	watchdog_unregister_device(&stmp3xxx_wdd);
> >  	return 0;
> >  }
> > -- 
> > 1.7.10.4
> > 
> > 
> > 
> 
> -- 
> Pengutronix e.K.                           | Uwe Kleine-König            |
> Industrial Linux Solutions                 | http://www.pengutronix.de/  |

-- 
If you want to support my work:
see http://friends.ccbib.org/harald/supporting/
or donate via bitcoin to 1FUtd8T9jRN1rFz63vZz7s2fDtB6d6A7aS
--
To unsubscribe from this list: send the line "unsubscribe linux-watchdog" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux