diff mbox series

[RFC] watchdog: rti-wdt: Provide set_timeout handler to make existing userspace happy

Message ID 4d82b8ce-bc34-e4b2-c5fe-9e883b0db59d@siemens.com (mailing list archive)
State Rejected
Headers show
Series [RFC] watchdog: rti-wdt: Provide set_timeout handler to make existing userspace happy | expand

Commit Message

Jan Kiszka Sept. 13, 2021, 11:41 a.m. UTC
From: Jan Kiszka <jan.kiszka@siemens.com>

Prominent userspace - systemd - cannot handle watchdogs without
WDIOF_SETTIMEOUT, even if it was configured to the same time as the
driver selected or was used by firmware to start the watchdog. To avoid
failing in this case, implement a handler that only fails if a deviating
set_timeout is requested.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---

See also https://github.com/systemd/systemd/issues/20683

 drivers/watchdog/rti_wdt.c | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

Comments

Guenter Roeck Sept. 13, 2021, 2:37 p.m. UTC | #1
On 9/13/21 4:41 AM, Jan Kiszka wrote:
> From: Jan Kiszka <jan.kiszka@siemens.com>
> 
> Prominent userspace - systemd - cannot handle watchdogs without
> WDIOF_SETTIMEOUT, even if it was configured to the same time as the
> driver selected or was used by firmware to start the watchdog. To avoid
> failing in this case, implement a handler that only fails if a deviating
> set_timeout is requested.
> 
> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>

NACK. This is a userspace problem. The ABI clearly states that
WDIOF_SETTIMEOUT is optional, and userspace must not depend on it.
We can not start making kernel changes just to make broken userspace
code happy. systemd should be fixed instead.

Guenter

> ---
> 
> See also https://github.com/systemd/systemd/issues/20683
> 
>   drivers/watchdog/rti_wdt.c | 17 ++++++++++++++++-
>   1 file changed, 16 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/watchdog/rti_wdt.c b/drivers/watchdog/rti_wdt.c
> index 359302f71f7e..365255b15a0d 100644
> --- a/drivers/watchdog/rti_wdt.c
> +++ b/drivers/watchdog/rti_wdt.c
> @@ -173,13 +173,27 @@ static unsigned int rti_wdt_get_timeleft_ms(struct watchdog_device *wdd)
>   	return timer_counter;
>   }
>   
> +static int rti_wdt_set_timeout(struct watchdog_device *wdd,
> +			       unsigned int timeout)
> +{
> +	/*
> +	 * Updating the timeout after start is actually not supported, but
> +	 * let's ignore requests for the already configured value. Helps
> +	 * existing userspace such as systemd.
> +	 */
> +	if (timeout != heartbeat)
> +		return -EOPNOTSUPP;
> +
> +	return 0;
> +}
> +
>   static unsigned int rti_wdt_get_timeleft(struct watchdog_device *wdd)
>   {
>   	return rti_wdt_get_timeleft_ms(wdd) / 1000;
>   }
>   
>   static const struct watchdog_info rti_wdt_info = {
> -	.options = WDIOF_KEEPALIVEPING,
> +	.options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT,
>   	.identity = "K3 RTI Watchdog",
>   };
>   
> @@ -187,6 +201,7 @@ static const struct watchdog_ops rti_wdt_ops = {
>   	.owner		= THIS_MODULE,
>   	.start		= rti_wdt_start,
>   	.ping		= rti_wdt_ping,
> +	.set_timeout	= rti_wdt_set_timeout,
>   	.get_timeleft	= rti_wdt_get_timeleft,
>   };
>   
>
Francesco Dolcini April 21, 2024, 8:49 a.m. UTC | #2
Hello Jan,

On Mon, Sep 13, 2021 at 01:41:43PM +0200, Jan Kiszka wrote:
> From: Jan Kiszka <jan.kiszka@siemens.com>
> 
> Prominent userspace - systemd - cannot handle watchdogs without
> WDIOF_SETTIMEOUT, even if it was configured to the same time as the
> driver selected or was used by firmware to start the watchdog. To avoid
> failing in this case, implement a handler that only fails if a deviating
> set_timeout is requested.
> 
> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>

Are you aware of this patch https://lore.kernel.org/all/20240417205700.3947408-1-jm@ti.com/ ?

Francesco
Guenter Roeck April 21, 2024, 11:50 p.m. UTC | #3
On Mon, Sep 13, 2021 at 01:41:43PM +0200, Jan Kiszka wrote:
> From: Jan Kiszka <jan.kiszka@siemens.com>
> 
> Prominent userspace - systemd - cannot handle watchdogs without
> WDIOF_SETTIMEOUT, even if it was configured to the same time as the
> driver selected or was used by firmware to start the watchdog. To avoid
> failing in this case, implement a handler that only fails if a deviating
> set_timeout is requested.
> 
> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>

NACK.

This will need to be fixed in systemd. set_timeout is and will remain
optional.

Guenter

> ---
> 
> See also https://github.com/systemd/systemd/issues/20683
> 
>  drivers/watchdog/rti_wdt.c | 17 ++++++++++++++++-
>  1 file changed, 16 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/watchdog/rti_wdt.c b/drivers/watchdog/rti_wdt.c
> index 359302f71f7e..365255b15a0d 100644
> --- a/drivers/watchdog/rti_wdt.c
> +++ b/drivers/watchdog/rti_wdt.c
> @@ -173,13 +173,27 @@ static unsigned int rti_wdt_get_timeleft_ms(struct watchdog_device *wdd)
>  	return timer_counter;
>  }
>  
> +static int rti_wdt_set_timeout(struct watchdog_device *wdd,
> +			       unsigned int timeout)
> +{
> +	/*
> +	 * Updating the timeout after start is actually not supported, but
> +	 * let's ignore requests for the already configured value. Helps
> +	 * existing userspace such as systemd.
> +	 */
> +	if (timeout != heartbeat)
> +		return -EOPNOTSUPP;
> +
> +	return 0;
> +}
> +
>  static unsigned int rti_wdt_get_timeleft(struct watchdog_device *wdd)
>  {
>  	return rti_wdt_get_timeleft_ms(wdd) / 1000;
>  }
>  
>  static const struct watchdog_info rti_wdt_info = {
> -	.options = WDIOF_KEEPALIVEPING,
> +	.options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT,
>  	.identity = "K3 RTI Watchdog",
>  };
>  
> @@ -187,6 +201,7 @@ static const struct watchdog_ops rti_wdt_ops = {
>  	.owner		= THIS_MODULE,
>  	.start		= rti_wdt_start,
>  	.ping		= rti_wdt_ping,
> +	.set_timeout	= rti_wdt_set_timeout,
>  	.get_timeleft	= rti_wdt_get_timeleft,
>  };
>  
> -- 
> 2.31.1
Jan Kiszka April 22, 2024, 5:35 a.m. UTC | #4
On 21.04.24 10:49, Francesco Dolcini wrote:
> Hello Jan,
> 
> On Mon, Sep 13, 2021 at 01:41:43PM +0200, Jan Kiszka wrote:
>> From: Jan Kiszka <jan.kiszka@siemens.com>
>>
>> Prominent userspace - systemd - cannot handle watchdogs without
>> WDIOF_SETTIMEOUT, even if it was configured to the same time as the
>> driver selected or was used by firmware to start the watchdog. To avoid
>> failing in this case, implement a handler that only fails if a deviating
>> set_timeout is requested.
>>
>> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
> 
> Are you aware of this patch https://lore.kernel.org/all/20240417205700.3947408-1-jm@ti.com/ ?
> 

Thanks for the heads-up, we will surely try to test things on our setups
as well. But commenting on this dead and not directly related thread may
have caused some confusion...

Jan
Jan Kiszka April 22, 2024, 5:36 a.m. UTC | #5
On 22.04.24 01:50, Guenter Roeck wrote:
> On Mon, Sep 13, 2021 at 01:41:43PM +0200, Jan Kiszka wrote:
>> From: Jan Kiszka <jan.kiszka@siemens.com>
>>
>> Prominent userspace - systemd - cannot handle watchdogs without
>> WDIOF_SETTIMEOUT, even if it was configured to the same time as the
>> driver selected or was used by firmware to start the watchdog. To avoid
>> failing in this case, implement a handler that only fails if a deviating
>> set_timeout is requested.
>>
>> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
> 
> NACK.
> 
> This will need to be fixed in systemd. set_timeout is and will remain
> optional.

Err, this patch was sent in 2021, and even systemd is long fixed (since
v250).

Jan
Francesco Dolcini April 22, 2024, 8:20 a.m. UTC | #6
Il 22 aprile 2024 07:35:52 CEST, Jan Kiszka <jan.kiszka@siemens.com> ha scritto:
>On 21.04.24 10:49, Francesco Dolcini wrote:
>> On Mon, Sep 13, 2021 at 01:41:43PM +0200, Jan Kiszka wrote:
>>> From: Jan Kiszka <jan.kiszka@siemens.com>
>>>
>>> Prominent userspace - systemd - cannot handle watchdogs without
>>> WDIOF_SETTIMEOUT, even if it was configured to the same time as the
>>> driver selected or was used by firmware to start the watchdog. To avoid
>>> failing in this case, implement a handler that only fails if a deviating
>>> set_timeout is requested.
>>>
>>> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
>> 
>> Are you aware of this patch https://lore.kernel.org/all/20240417205700.3947408-1-jm@ti.com/ ?
>> 
>
>Thanks for the heads-up, we will surely try to test things on our setups
>as well. But commenting on this dead and not directly related thread may
>have caused some confusion...

I was too terse.

We have working systemd watchdog with that patch applied, this is the reason I mentioned it here, it might also solve your issue.

Francesco
Francesco Dolcini April 22, 2024, 8:23 a.m. UTC | #7
Il 22 aprile 2024 10:20:07 CEST, Francesco Dolcini <francesco@dolcini.it> ha scritto:
>
>
>Il 22 aprile 2024 07:35:52 CEST, Jan Kiszka <jan.kiszka@siemens.com> ha scritto:
>>On 21.04.24 10:49, Francesco Dolcini wrote:
>>> On Mon, Sep 13, 2021 at 01:41:43PM +0200, Jan Kiszka wrote:
>>>> From: Jan Kiszka <jan.kiszka@siemens.com>
>>>>
>>>> Prominent userspace - systemd - cannot handle watchdogs without
>>>> WDIOF_SETTIMEOUT, even if it was configured to the same time as the
>>>> driver selected or was used by firmware to start the watchdog. To avoid
>>>> failing in this case, implement a handler that only fails if a deviating
>>>> set_timeout is requested.
>>>>
>>>> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
>>> 
>>> Are you aware of this patch https://lore.kernel.org/all/20240417205700.3947408-1-jm@ti.com/ ?
>>> 
>>
>>Thanks for the heads-up, we will surely try to test things on our setups
>>as well. But commenting on this dead and not directly related thread may
>>have caused some confusion...
>
>I was too terse.

And I did not realize your patch was from 2021. Sorry for the confusion.


Francesco
diff mbox series

Patch

diff --git a/drivers/watchdog/rti_wdt.c b/drivers/watchdog/rti_wdt.c
index 359302f71f7e..365255b15a0d 100644
--- a/drivers/watchdog/rti_wdt.c
+++ b/drivers/watchdog/rti_wdt.c
@@ -173,13 +173,27 @@  static unsigned int rti_wdt_get_timeleft_ms(struct watchdog_device *wdd)
 	return timer_counter;
 }
 
+static int rti_wdt_set_timeout(struct watchdog_device *wdd,
+			       unsigned int timeout)
+{
+	/*
+	 * Updating the timeout after start is actually not supported, but
+	 * let's ignore requests for the already configured value. Helps
+	 * existing userspace such as systemd.
+	 */
+	if (timeout != heartbeat)
+		return -EOPNOTSUPP;
+
+	return 0;
+}
+
 static unsigned int rti_wdt_get_timeleft(struct watchdog_device *wdd)
 {
 	return rti_wdt_get_timeleft_ms(wdd) / 1000;
 }
 
 static const struct watchdog_info rti_wdt_info = {
-	.options = WDIOF_KEEPALIVEPING,
+	.options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT,
 	.identity = "K3 RTI Watchdog",
 };
 
@@ -187,6 +201,7 @@  static const struct watchdog_ops rti_wdt_ops = {
 	.owner		= THIS_MODULE,
 	.start		= rti_wdt_start,
 	.ping		= rti_wdt_ping,
+	.set_timeout	= rti_wdt_set_timeout,
 	.get_timeleft	= rti_wdt_get_timeleft,
 };