diff mbox series

watchdog: qcom: Start the watchdog in probe

Message ID 20240131-qcom-wdt-start-probe-v1-1-bee0a86e2bba@quicinc.com (mailing list archive)
State New
Headers show
Series watchdog: qcom: Start the watchdog in probe | expand

Commit Message

Pavan Kondeti Jan. 31, 2024, 4:15 a.m. UTC
When CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED is enabled, kernel can pet the
watchdog until user space takes over. Make use of this feature and
start the watchdog in probe.

Signed-off-by: Pavankumar Kondeti <quic_pkondeti@quicinc.com>
---
 drivers/watchdog/qcom-wdt.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)


---
base-commit: 41bccc98fb7931d63d03f326a746ac4d429c1dd3
change-id: 20240131-qcom-wdt-start-probe-b8e0560aef7d

Best regards,

Comments

Guenter Roeck Jan. 31, 2024, 6:01 a.m. UTC | #1
On 1/30/24 20:15, Pavankumar Kondeti wrote:
> When CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED is enabled, kernel can pet the
> watchdog until user space takes over. Make use of this feature and
> start the watchdog in probe.
> 
> Signed-off-by: Pavankumar Kondeti <quic_pkondeti@quicinc.com>
> ---
>   drivers/watchdog/qcom-wdt.c | 6 +++++-
>   1 file changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/watchdog/qcom-wdt.c b/drivers/watchdog/qcom-wdt.c
> index 9e790f0c2096..4fb5dbf5faee 100644
> --- a/drivers/watchdog/qcom-wdt.c
> +++ b/drivers/watchdog/qcom-wdt.c
> @@ -276,12 +276,16 @@ static int qcom_wdt_probe(struct platform_device *pdev)
>   	watchdog_init_timeout(&wdt->wdd, 0, dev);
>   
>   	/*
> +	 * Kernel can pet the watchdog until user space takes over.
> +	 * Start the watchdog here to make use of this feature.
> +	 

No, that is not what CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED is about.
Please see its description.

NACK.

Guenter

>   	 * If WDT is already running, call WDT start which
>   	 * will stop the WDT, set timeouts as bootloader
>   	 * might use different ones and set running bit
>   	 * to inform the WDT subsystem to ping the WDT

>   	 */
> -	if (qcom_wdt_is_running(&wdt->wdd)) {
> +	if (IS_ENABLED(CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED) ||
> +	    qcom_wdt_is_running(&wdt->wdd)) {
>   		qcom_wdt_start(&wdt->wdd);
>   		set_bit(WDOG_HW_RUNNING, &wdt->wdd.status);
>   	}
> 
> ---
> base-commit: 41bccc98fb7931d63d03f326a746ac4d429c1dd3
> change-id: 20240131-qcom-wdt-start-probe-b8e0560aef7d
> 
> Best regards,
Pavan Kondeti Jan. 31, 2024, 6:16 a.m. UTC | #2
On Tue, Jan 30, 2024 at 10:01:15PM -0800, Guenter Roeck wrote:
> On 1/30/24 20:15, Pavankumar Kondeti wrote:
> > When CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED is enabled, kernel can pet the
> > watchdog until user space takes over. Make use of this feature and
> > start the watchdog in probe.
> > 
> > Signed-off-by: Pavankumar Kondeti <quic_pkondeti@quicinc.com>
> > ---
> >   drivers/watchdog/qcom-wdt.c | 6 +++++-
> >   1 file changed, 5 insertions(+), 1 deletion(-)
> > 
> > diff --git a/drivers/watchdog/qcom-wdt.c b/drivers/watchdog/qcom-wdt.c
> > index 9e790f0c2096..4fb5dbf5faee 100644
> > --- a/drivers/watchdog/qcom-wdt.c
> > +++ b/drivers/watchdog/qcom-wdt.c
> > @@ -276,12 +276,16 @@ static int qcom_wdt_probe(struct platform_device *pdev)
> >   	watchdog_init_timeout(&wdt->wdd, 0, dev);
> >   	/*
> > +	 * Kernel can pet the watchdog until user space takes over.
> > +	 * Start the watchdog here to make use of this feature.
> > +	
> 
> No, that is not what CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED is about.
> Please see its description.
> 
> NACK.
> 
Thanks for taking a look Guenter. I thought of using
WATCHDOG_HANDLE_BOOT_ENABLED and infiniite open timeout as a hint to start
the watchdog in probe. After seeing your NACK for this patch, I guess 
that would also would have been rejected.

Do you think we can revive this [1] to add support for watchdog pet from
the kernel? It would be helpful in cases where the user space has no
support for watchdog pet (say minimal ramdisk).

[1]
https://lore.kernel.org/linux-watchdog/20210924133509.3454834-1-f.suligoi@asem.it/#t
Guenter Roeck Jan. 31, 2024, 6:37 a.m. UTC | #3
On 1/30/24 22:16, Pavan Kondeti wrote:
> On Tue, Jan 30, 2024 at 10:01:15PM -0800, Guenter Roeck wrote:
>> On 1/30/24 20:15, Pavankumar Kondeti wrote:
>>> When CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED is enabled, kernel can pet the
>>> watchdog until user space takes over. Make use of this feature and
>>> start the watchdog in probe.
>>>
>>> Signed-off-by: Pavankumar Kondeti <quic_pkondeti@quicinc.com>
>>> ---
>>>    drivers/watchdog/qcom-wdt.c | 6 +++++-
>>>    1 file changed, 5 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/drivers/watchdog/qcom-wdt.c b/drivers/watchdog/qcom-wdt.c
>>> index 9e790f0c2096..4fb5dbf5faee 100644
>>> --- a/drivers/watchdog/qcom-wdt.c
>>> +++ b/drivers/watchdog/qcom-wdt.c
>>> @@ -276,12 +276,16 @@ static int qcom_wdt_probe(struct platform_device *pdev)
>>>    	watchdog_init_timeout(&wdt->wdd, 0, dev);
>>>    	/*
>>> +	 * Kernel can pet the watchdog until user space takes over.
>>> +	 * Start the watchdog here to make use of this feature.
>>> +	
>>
>> No, that is not what CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED is about.
>> Please see its description.
>>
>> NACK.
>>
> Thanks for taking a look Guenter. I thought of using
> WATCHDOG_HANDLE_BOOT_ENABLED and infiniite open timeout as a hint to start
> the watchdog in probe. After seeing your NACK for this patch, I guess
> that would also would have been rejected.
> 
WATCHDOG_HANDLE_BOOT_ENABLED is not supposed to be used in drivers.
It is a flag for the watchdog core. Before you bring it up, stm32_iwdg.c
is a corner case because (presumably) the driver can not determine
if the watchdog is running.

> Do you think we can revive this [1] to add support for watchdog pet from
> the kernel? It would be helpful in cases where the user space has no
> support for watchdog pet (say minimal ramdisk).
> 

If done properly, sure. Looking at the exchange, the patch still had issues
which I don't think were ever resolved.

Personally I would not want to rely on this, though. It won't address situations
where userspace hangs but low level kernel interrupts still work. I think
it is mostly useful to cover the time from loading the watchdog driver
to starting the watchdog daemon, but even that would better be solved by
starting the watchdog in the ROM monitor or BIOS. A minimal watchdog daemon
would not consume that much memory, so I don't think "user space has no
support for watchdog pet (say minimal ramdisk)" would ever be a real problem.
Such a minimal system would probably (hopefully) be based on busybox which
does support a watchdog.

Guenter
Pavan Kondeti Jan. 31, 2024, 6:51 a.m. UTC | #4
On Tue, Jan 30, 2024 at 10:37:50PM -0800, Guenter Roeck wrote:
> On 1/30/24 22:16, Pavan Kondeti wrote:
> > On Tue, Jan 30, 2024 at 10:01:15PM -0800, Guenter Roeck wrote:
> > > On 1/30/24 20:15, Pavankumar Kondeti wrote:
> > > > When CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED is enabled, kernel can pet the
> > > > watchdog until user space takes over. Make use of this feature and
> > > > start the watchdog in probe.
> > > > 
> > > > Signed-off-by: Pavankumar Kondeti <quic_pkondeti@quicinc.com>
> > > > ---
> > > >    drivers/watchdog/qcom-wdt.c | 6 +++++-
> > > >    1 file changed, 5 insertions(+), 1 deletion(-)
> > > > 
> > > > diff --git a/drivers/watchdog/qcom-wdt.c b/drivers/watchdog/qcom-wdt.c
> > > > index 9e790f0c2096..4fb5dbf5faee 100644
> > > > --- a/drivers/watchdog/qcom-wdt.c
> > > > +++ b/drivers/watchdog/qcom-wdt.c
> > > > @@ -276,12 +276,16 @@ static int qcom_wdt_probe(struct platform_device *pdev)
> > > >    	watchdog_init_timeout(&wdt->wdd, 0, dev);
> > > >    	/*
> > > > +	 * Kernel can pet the watchdog until user space takes over.
> > > > +	 * Start the watchdog here to make use of this feature.
> > > > +	
> > > 
> > > No, that is not what CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED is about.
> > > Please see its description.
> > > 
> > > NACK.
> > > 
> > Thanks for taking a look Guenter. I thought of using
> > WATCHDOG_HANDLE_BOOT_ENABLED and infiniite open timeout as a hint to start
> > the watchdog in probe. After seeing your NACK for this patch, I guess
> > that would also would have been rejected.
> > 
> WATCHDOG_HANDLE_BOOT_ENABLED is not supposed to be used in drivers.
> It is a flag for the watchdog core. Before you bring it up, stm32_iwdg.c
> is a corner case because (presumably) the driver can not determine
> if the watchdog is running.
> 
> > Do you think we can revive this [1] to add support for watchdog pet from
> > the kernel? It would be helpful in cases where the user space has no
> > support for watchdog pet (say minimal ramdisk).
> > 
> 
> If done properly, sure. Looking at the exchange, the patch still had issues
> which I don't think were ever resolved.

Thanks. I will take a look at your review feedback on the series and
address them before sending the next revision.

> 
> Personally I would not want to rely on this, though. It won't address situations
> where userspace hangs but low level kernel interrupts still work. I think
> it is mostly useful to cover the time from loading the watchdog driver
> to starting the watchdog daemon, but even that would better be solved by
> starting the watchdog in the ROM monitor or BIOS. A minimal watchdog daemon
> would not consume that much memory, so I don't think "user space has no
> support for watchdog pet (say minimal ramdisk)" would ever be a real problem.
> Such a minimal system would probably (hopefully) be based on busybox which
> does support a watchdog.
> 

Got it. I will find ways to start the watchdog in firmware so that we
don't need anything special handling.

Thanks,
Pavan
diff mbox series

Patch

diff --git a/drivers/watchdog/qcom-wdt.c b/drivers/watchdog/qcom-wdt.c
index 9e790f0c2096..4fb5dbf5faee 100644
--- a/drivers/watchdog/qcom-wdt.c
+++ b/drivers/watchdog/qcom-wdt.c
@@ -276,12 +276,16 @@  static int qcom_wdt_probe(struct platform_device *pdev)
 	watchdog_init_timeout(&wdt->wdd, 0, dev);
 
 	/*
+	 * Kernel can pet the watchdog until user space takes over.
+	 * Start the watchdog here to make use of this feature.
+	 *
 	 * If WDT is already running, call WDT start which
 	 * will stop the WDT, set timeouts as bootloader
 	 * might use different ones and set running bit
 	 * to inform the WDT subsystem to ping the WDT
 	 */
-	if (qcom_wdt_is_running(&wdt->wdd)) {
+	if (IS_ENABLED(CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED) ||
+	    qcom_wdt_is_running(&wdt->wdd)) {
 		qcom_wdt_start(&wdt->wdd);
 		set_bit(WDOG_HW_RUNNING, &wdt->wdd.status);
 	}