* [PATCH 01/11] reboot: replace __hw_protection_shutdown bool action parameter with an enum
2024-12-19 7:31 [PATCH 00/11] reboot: support runtime configuration of emergency hw_protection action Ahmad Fatoum
@ 2024-12-19 7:31 ` Ahmad Fatoum
2024-12-19 7:31 ` [PATCH 02/11] reboot: reboot, not shutdown, on hw_protection_reboot timeout Ahmad Fatoum
` (10 subsequent siblings)
11 siblings, 0 replies; 18+ messages in thread
From: Ahmad Fatoum @ 2024-12-19 7:31 UTC (permalink / raw)
To: Daniel Lezcano, Fabio Estevam, Rafael J. Wysocki, Zhang Rui,
Lukasz Luba, Jonathan Corbet, Serge Hallyn, Liam Girdwood,
Mark Brown, Matti Vaittinen, Benson Leung, Tzung-Bi Shih,
Guenter Roeck, Rob Herring, Krzysztof Kozlowski, Conor Dooley
Cc: linux-kernel, linux-pm, linux-doc, linux-security-module,
chrome-platform, devicetree, kernel, Ahmad Fatoum
Currently __hw_protection_shutdown() either reboots or shuts down the
system according to its shutdown argument.
To make the logic easier to follow, both inside __hw_protection_shutdown
and at caller sites, lets replace the bool parameter with an enum.
This will be extra useful, when in a later commit, a third action is
added to the enumeration.
No functional change.
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
include/linux/reboot.h | 10 +++++++---
kernel/reboot.c | 9 +++++----
2 files changed, 12 insertions(+), 7 deletions(-)
diff --git a/include/linux/reboot.h b/include/linux/reboot.h
index abcdde4df697969a8027bcb052efc00daabbbf6a..d6780fbf51535e1f98b576da0a06701402dfd447 100644
--- a/include/linux/reboot.h
+++ b/include/linux/reboot.h
@@ -177,16 +177,20 @@ void ctrl_alt_del(void);
extern void orderly_poweroff(bool force);
extern void orderly_reboot(void);
-void __hw_protection_shutdown(const char *reason, int ms_until_forced, bool shutdown);
+
+enum hw_protection_action { HWPROT_ACT_SHUTDOWN, HWPROT_ACT_REBOOT };
+
+void __hw_protection_shutdown(const char *reason, int ms_until_forced,
+ enum hw_protection_action action);
static inline void hw_protection_reboot(const char *reason, int ms_until_forced)
{
- __hw_protection_shutdown(reason, ms_until_forced, false);
+ __hw_protection_shutdown(reason, ms_until_forced, HWPROT_ACT_REBOOT);
}
static inline void hw_protection_shutdown(const char *reason, int ms_until_forced)
{
- __hw_protection_shutdown(reason, ms_until_forced, true);
+ __hw_protection_shutdown(reason, ms_until_forced, HWPROT_ACT_SHUTDOWN);
}
/*
diff --git a/kernel/reboot.c b/kernel/reboot.c
index a701000bab3470df28665e8c9591cd82a033c6c2..f92aa66cbfec0f57ded43ba352a39c54d0c24a25 100644
--- a/kernel/reboot.c
+++ b/kernel/reboot.c
@@ -994,7 +994,8 @@ static void hw_failure_emergency_poweroff(int poweroff_delay_ms)
* pending even if the previous request has given a large timeout for forced
* shutdown/reboot.
*/
-void __hw_protection_shutdown(const char *reason, int ms_until_forced, bool shutdown)
+void __hw_protection_shutdown(const char *reason, int ms_until_forced,
+ enum hw_protection_action action)
{
static atomic_t allow_proceed = ATOMIC_INIT(1);
@@ -1009,10 +1010,10 @@ void __hw_protection_shutdown(const char *reason, int ms_until_forced, bool shut
* orderly_poweroff failure
*/
hw_failure_emergency_poweroff(ms_until_forced);
- if (shutdown)
- orderly_poweroff(true);
- else
+ if (action == HWPROT_ACT_REBOOT)
orderly_reboot();
+ else
+ orderly_poweroff(true);
}
EXPORT_SYMBOL_GPL(__hw_protection_shutdown);
--
2.39.5
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 02/11] reboot: reboot, not shutdown, on hw_protection_reboot timeout
2024-12-19 7:31 [PATCH 00/11] reboot: support runtime configuration of emergency hw_protection action Ahmad Fatoum
2024-12-19 7:31 ` [PATCH 01/11] reboot: replace __hw_protection_shutdown bool action parameter with an enum Ahmad Fatoum
@ 2024-12-19 7:31 ` Ahmad Fatoum
2024-12-20 6:12 ` kernel test robot
2024-12-19 7:31 ` [PATCH 03/11] docs: thermal: sync hardware protection doc with code Ahmad Fatoum
` (9 subsequent siblings)
11 siblings, 1 reply; 18+ messages in thread
From: Ahmad Fatoum @ 2024-12-19 7:31 UTC (permalink / raw)
To: Daniel Lezcano, Fabio Estevam, Rafael J. Wysocki, Zhang Rui,
Lukasz Luba, Jonathan Corbet, Serge Hallyn, Liam Girdwood,
Mark Brown, Matti Vaittinen, Benson Leung, Tzung-Bi Shih,
Guenter Roeck, Rob Herring, Krzysztof Kozlowski, Conor Dooley
Cc: linux-kernel, linux-pm, linux-doc, linux-security-module,
chrome-platform, devicetree, kernel, Ahmad Fatoum
hw_protection_shutdown() will kick off an orderly shutdown and if that
takes longer than a configurable amount of time, an emergency shutdown
will occur.
Recently, hw_protection_reboot() was added for those systems that don't
implement a proper shutdown and are better served by rebooting and
having the boot firmware worry about doing something about the critical
condition.
On timeout of the orderly reboot of hw_protection_reboot(), the system
would go into shutdown, instead of reboot. This is not a good idea, as
going into shutdown was explicitly not asked for.
Fix this by always doing an emergency reboot if hw_protection_reboot()
is called and the orderly reboot takes too long.
Fixes: 79fa723ba84c ("reboot: Introduce thermal_zone_device_critical_reboot()")
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
kernel/reboot.c | 46 +++++++++++++++++++++++++++++++++++-----------
1 file changed, 35 insertions(+), 11 deletions(-)
diff --git a/kernel/reboot.c b/kernel/reboot.c
index f92aa66cbfec0f57ded43ba352a39c54d0c24a25..8e3680d36654587b57db44806a3d7b0228b10f67 100644
--- a/kernel/reboot.c
+++ b/kernel/reboot.c
@@ -932,6 +932,20 @@ void orderly_reboot(void)
}
EXPORT_SYMBOL_GPL(orderly_reboot);
+static const char *hw_protection_action_str(enum hw_protection_action action)
+{
+ switch (action) {
+ case HWPROT_ACT_SHUTDOWN:
+ return "shutdown";
+ case HWPROT_ACT_REBOOT:
+ return "reboot";
+ default:
+ return "undefined";
+ }
+}
+
+static enum hw_protection_action hw_failure_emergency_action;
+
/**
* hw_failure_emergency_poweroff_func - emergency poweroff work after a known delay
* @work: work_struct associated with the emergency poweroff function
@@ -941,21 +955,29 @@ EXPORT_SYMBOL_GPL(orderly_reboot);
*/
static void hw_failure_emergency_poweroff_func(struct work_struct *work)
{
+ const char *action_str = hw_protection_action_str(hw_failure_emergency_action);
+
+ pr_emerg("Hardware protection timed-out. Trying forced %s\n",
+ action_str);
+
/*
- * We have reached here after the emergency shutdown waiting period has
- * expired. This means orderly_poweroff has not been able to shut off
- * the system for some reason.
+ * We have reached here after the emergency action waiting period has
+ * expired. This means orderly_poweroff/reboot has not been able to
+ * shut off the system for some reason.
*
- * Try to shut down the system immediately using kernel_power_off
- * if populated
+ * Try to shut off the system immediately if possible
*/
- pr_emerg("Hardware protection timed-out. Trying forced poweroff\n");
- kernel_power_off();
+
+ if (hw_failure_emergency_action == HWPROT_ACT_REBOOT)
+ kernel_restart(NULL);
+ else
+ kernel_power_off();
/*
* Worst of the worst case trigger emergency restart
*/
- pr_emerg("Hardware protection shutdown failed. Trying emergency restart\n");
+ pr_emerg("Hardware protection %s failed. Trying emergency restart\n",
+ action_str);
emergency_restart();
}
@@ -963,15 +985,17 @@ static DECLARE_DELAYED_WORK(hw_failure_emergency_poweroff_work,
hw_failure_emergency_poweroff_func);
/**
- * hw_failure_emergency_poweroff - Trigger an emergency system poweroff
+ * hw_failure_emergency_schedule - Schedule an emergency system shutdown or reboot
*
* This may be called from any critical situation to trigger a system shutdown
* after a given period of time. If time is negative this is not scheduled.
*/
-static void hw_failure_emergency_poweroff(int poweroff_delay_ms)
+static void hw_failure_emergency_schedule(enum hw_protection_action action,
+ int poweroff_delay_ms)
{
if (poweroff_delay_ms <= 0)
return;
+ hw_failure_emergency_action = action;
schedule_delayed_work(&hw_failure_emergency_poweroff_work,
msecs_to_jiffies(poweroff_delay_ms));
}
@@ -1009,7 +1033,7 @@ void __hw_protection_shutdown(const char *reason, int ms_until_forced,
* Queue a backup emergency shutdown in the event of
* orderly_poweroff failure
*/
- hw_failure_emergency_poweroff(ms_until_forced);
+ hw_failure_emergency_schedule(action, ms_until_forced);
if (action == HWPROT_ACT_REBOOT)
orderly_reboot();
else
--
2.39.5
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH 02/11] reboot: reboot, not shutdown, on hw_protection_reboot timeout
2024-12-19 7:31 ` [PATCH 02/11] reboot: reboot, not shutdown, on hw_protection_reboot timeout Ahmad Fatoum
@ 2024-12-20 6:12 ` kernel test robot
2025-01-06 14:28 ` Ahmad Fatoum
0 siblings, 1 reply; 18+ messages in thread
From: kernel test robot @ 2024-12-20 6:12 UTC (permalink / raw)
To: Ahmad Fatoum, Daniel Lezcano, Fabio Estevam, Rafael J. Wysocki,
Zhang Rui, Lukasz Luba, Jonathan Corbet, Serge Hallyn,
Liam Girdwood, Mark Brown, Matti Vaittinen, Matti Vaittinen,
Benson Leung, Tzung-Bi Shih, Guenter Roeck, Rob Herring,
Krzysztof Kozlowski, Conor Dooley
Cc: oe-kbuild-all, linux-kernel, linux-pm, linux-doc,
linux-security-module, chrome-platform, devicetree, kernel,
Ahmad Fatoum
Hi Ahmad,
kernel test robot noticed the following build warnings:
[auto build test WARNING on 78d4f34e2115b517bcbfe7ec0d018bbbb6f9b0b8]
url: https://github.com/intel-lab-lkp/linux/commits/Ahmad-Fatoum/reboot-replace-__hw_protection_shutdown-bool-action-parameter-with-an-enum/20241219-155416
base: 78d4f34e2115b517bcbfe7ec0d018bbbb6f9b0b8
patch link: https://lore.kernel.org/r/20241219-hw_protection-reboot-v1-2-263a0c1df802%40pengutronix.de
patch subject: [PATCH 02/11] reboot: reboot, not shutdown, on hw_protection_reboot timeout
config: i386-buildonly-randconfig-003-20241220 (https://download.01.org/0day-ci/archive/20241220/202412201310.JWkUQ9qf-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241220/202412201310.JWkUQ9qf-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202412201310.JWkUQ9qf-lkp@intel.com/
All warnings (new ones prefixed by >>):
kernel/reboot.c:241: warning: Function parameter or struct member 'cmd' not described in 'do_kernel_restart'
>> kernel/reboot.c:995: warning: Function parameter or struct member 'action' not described in 'hw_failure_emergency_schedule'
>> kernel/reboot.c:995: warning: Function parameter or struct member 'poweroff_delay_ms' not described in 'hw_failure_emergency_schedule'
kernel/reboot.c:1023: warning: Function parameter or struct member 'action' not described in '__hw_protection_shutdown'
kernel/reboot.c:1023: warning: Excess function parameter 'shutdown' description in '__hw_protection_shutdown'
vim +995 kernel/reboot.c
dfa19b11385d4c Matti Vaittinen 2021-06-03 983
dfa19b11385d4c Matti Vaittinen 2021-06-03 984 static DECLARE_DELAYED_WORK(hw_failure_emergency_poweroff_work,
dfa19b11385d4c Matti Vaittinen 2021-06-03 985 hw_failure_emergency_poweroff_func);
dfa19b11385d4c Matti Vaittinen 2021-06-03 986
dfa19b11385d4c Matti Vaittinen 2021-06-03 987 /**
595ab92650cc28 Ahmad Fatoum 2024-12-19 988 * hw_failure_emergency_schedule - Schedule an emergency system shutdown or reboot
dfa19b11385d4c Matti Vaittinen 2021-06-03 989 *
dfa19b11385d4c Matti Vaittinen 2021-06-03 990 * This may be called from any critical situation to trigger a system shutdown
dfa19b11385d4c Matti Vaittinen 2021-06-03 991 * after a given period of time. If time is negative this is not scheduled.
dfa19b11385d4c Matti Vaittinen 2021-06-03 992 */
595ab92650cc28 Ahmad Fatoum 2024-12-19 993 static void hw_failure_emergency_schedule(enum hw_protection_action action,
595ab92650cc28 Ahmad Fatoum 2024-12-19 994 int poweroff_delay_ms)
dfa19b11385d4c Matti Vaittinen 2021-06-03 @995 {
dfa19b11385d4c Matti Vaittinen 2021-06-03 996 if (poweroff_delay_ms <= 0)
dfa19b11385d4c Matti Vaittinen 2021-06-03 997 return;
595ab92650cc28 Ahmad Fatoum 2024-12-19 998 hw_failure_emergency_action = action;
dfa19b11385d4c Matti Vaittinen 2021-06-03 999 schedule_delayed_work(&hw_failure_emergency_poweroff_work,
dfa19b11385d4c Matti Vaittinen 2021-06-03 1000 msecs_to_jiffies(poweroff_delay_ms));
dfa19b11385d4c Matti Vaittinen 2021-06-03 1001 }
dfa19b11385d4c Matti Vaittinen 2021-06-03 1002
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 02/11] reboot: reboot, not shutdown, on hw_protection_reboot timeout
2024-12-20 6:12 ` kernel test robot
@ 2025-01-06 14:28 ` Ahmad Fatoum
0 siblings, 0 replies; 18+ messages in thread
From: Ahmad Fatoum @ 2025-01-06 14:28 UTC (permalink / raw)
To: kernel test robot, Daniel Lezcano, Fabio Estevam,
Rafael J. Wysocki, Zhang Rui, Lukasz Luba, Jonathan Corbet,
Serge Hallyn, Liam Girdwood, Mark Brown, Matti Vaittinen,
Matti Vaittinen, Benson Leung, Tzung-Bi Shih, Guenter Roeck,
Rob Herring, Krzysztof Kozlowski, Conor Dooley
Cc: oe-kbuild-all, linux-kernel, linux-pm, linux-doc,
linux-security-module, chrome-platform, devicetree, kernel
On 20.12.24 07:12, kernel test robot wrote:
> Hi Ahmad,
>
> kernel test robot noticed the following build warnings:
>
> [auto build test WARNING on 78d4f34e2115b517bcbfe7ec0d018bbbb6f9b0b8]
>
> url: https://github.com/intel-lab-lkp/linux/commits/Ahmad-Fatoum/reboot-replace-__hw_protection_shutdown-bool-action-parameter-with-an-enum/20241219-155416
> base: 78d4f34e2115b517bcbfe7ec0d018bbbb6f9b0b8
> patch link: https://lore.kernel.org/r/20241219-hw_protection-reboot-v1-2-263a0c1df802%40pengutronix.de
> patch subject: [PATCH 02/11] reboot: reboot, not shutdown, on hw_protection_reboot timeout
> config: i386-buildonly-randconfig-003-20241220 (https://download.01.org/0day-ci/archive/20241220/202412201310.JWkUQ9qf-lkp@intel.com/config)
> compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
> reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241220/202412201310.JWkUQ9qf-lkp@intel.com/reproduce)
>
> If you fix the issue in a separate patch/commit (i.e. not just a new version of
> the same patch/commit), kindly add following tags
> | Reported-by: kernel test robot <lkp@intel.com>
> | Closes: https://lore.kernel.org/oe-kbuild-all/202412201310.JWkUQ9qf-lkp@intel.com/
>
> All warnings (new ones prefixed by >>):
>
> kernel/reboot.c:241: warning: Function parameter or struct member 'cmd' not described in 'do_kernel_restart'
>>> kernel/reboot.c:995: warning: Function parameter or struct member 'action' not described in 'hw_failure_emergency_schedule'
>>> kernel/reboot.c:995: warning: Function parameter or struct member 'poweroff_delay_ms' not described in 'hw_failure_emergency_schedule'
Will fix the kernel doc issues for v2.
> kernel/reboot.c:1023: warning: Function parameter or struct member 'action' not described in '__hw_protection_shutdown'
> kernel/reboot.c:1023: warning: Excess function parameter 'shutdown' description in '__hw_protection_shutdown'
>
>
> vim +995 kernel/reboot.c
>
> dfa19b11385d4c Matti Vaittinen 2021-06-03 983
> dfa19b11385d4c Matti Vaittinen 2021-06-03 984 static DECLARE_DELAYED_WORK(hw_failure_emergency_poweroff_work,
> dfa19b11385d4c Matti Vaittinen 2021-06-03 985 hw_failure_emergency_poweroff_func);
> dfa19b11385d4c Matti Vaittinen 2021-06-03 986
> dfa19b11385d4c Matti Vaittinen 2021-06-03 987 /**
> 595ab92650cc28 Ahmad Fatoum 2024-12-19 988 * hw_failure_emergency_schedule - Schedule an emergency system shutdown or reboot
> dfa19b11385d4c Matti Vaittinen 2021-06-03 989 *
> dfa19b11385d4c Matti Vaittinen 2021-06-03 990 * This may be called from any critical situation to trigger a system shutdown
> dfa19b11385d4c Matti Vaittinen 2021-06-03 991 * after a given period of time. If time is negative this is not scheduled.
> dfa19b11385d4c Matti Vaittinen 2021-06-03 992 */
> 595ab92650cc28 Ahmad Fatoum 2024-12-19 993 static void hw_failure_emergency_schedule(enum hw_protection_action action,
> 595ab92650cc28 Ahmad Fatoum 2024-12-19 994 int poweroff_delay_ms)
> dfa19b11385d4c Matti Vaittinen 2021-06-03 @995 {
> dfa19b11385d4c Matti Vaittinen 2021-06-03 996 if (poweroff_delay_ms <= 0)
> dfa19b11385d4c Matti Vaittinen 2021-06-03 997 return;
> 595ab92650cc28 Ahmad Fatoum 2024-12-19 998 hw_failure_emergency_action = action;
> dfa19b11385d4c Matti Vaittinen 2021-06-03 999 schedule_delayed_work(&hw_failure_emergency_poweroff_work,
> dfa19b11385d4c Matti Vaittinen 2021-06-03 1000 msecs_to_jiffies(poweroff_delay_ms));
> dfa19b11385d4c Matti Vaittinen 2021-06-03 1001 }
> dfa19b11385d4c Matti Vaittinen 2021-06-03 1002
>
--
Pengutronix e.K. | |
Steuerwalder Str. 21 | http://www.pengutronix.de/ |
31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH 03/11] docs: thermal: sync hardware protection doc with code
2024-12-19 7:31 [PATCH 00/11] reboot: support runtime configuration of emergency hw_protection action Ahmad Fatoum
2024-12-19 7:31 ` [PATCH 01/11] reboot: replace __hw_protection_shutdown bool action parameter with an enum Ahmad Fatoum
2024-12-19 7:31 ` [PATCH 02/11] reboot: reboot, not shutdown, on hw_protection_reboot timeout Ahmad Fatoum
@ 2024-12-19 7:31 ` Ahmad Fatoum
2024-12-19 7:31 ` [PATCH 04/11] reboot: rename now misleading hw_protection symbols Ahmad Fatoum
` (8 subsequent siblings)
11 siblings, 0 replies; 18+ messages in thread
From: Ahmad Fatoum @ 2024-12-19 7:31 UTC (permalink / raw)
To: Daniel Lezcano, Fabio Estevam, Rafael J. Wysocki, Zhang Rui,
Lukasz Luba, Jonathan Corbet, Serge Hallyn, Liam Girdwood,
Mark Brown, Matti Vaittinen, Benson Leung, Tzung-Bi Shih,
Guenter Roeck, Rob Herring, Krzysztof Kozlowski, Conor Dooley
Cc: linux-kernel, linux-pm, linux-doc, linux-security-module,
chrome-platform, devicetree, kernel, Ahmad Fatoum
Originally, the thermal framework's only hardware protection action was
to trigger a shutdown. This has been changed a little over a year ago to
also support rebooting as alternative hardware protection action.
Update the documentation to reflect this.
Fixes: 62e79e38b257 ("thermal/thermal_of: Allow rebooting after critical temp")
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
Documentation/driver-api/thermal/sysfs-api.rst | 25 ++++++++++++++-----------
1 file changed, 14 insertions(+), 11 deletions(-)
diff --git a/Documentation/driver-api/thermal/sysfs-api.rst b/Documentation/driver-api/thermal/sysfs-api.rst
index c803b89b7248f9f26ac24608b0144db5e9c2ddb4..6b481364457b8ec56302e80bb443291c2b4a94d5 100644
--- a/Documentation/driver-api/thermal/sysfs-api.rst
+++ b/Documentation/driver-api/thermal/sysfs-api.rst
@@ -413,18 +413,21 @@ This function serves as an arbitrator to set the state of a cooling
device. It sets the cooling device to the deepest cooling state if
possible.
-5. thermal_emergency_poweroff
-=============================
+5. Critical Events
+==================
-On an event of critical trip temperature crossing the thermal framework
-shuts down the system by calling hw_protection_shutdown(). The
-hw_protection_shutdown() first attempts to perform an orderly shutdown
-but accepts a delay after which it proceeds doing a forced power-off
-or as last resort an emergency_restart.
+On an event of critical trip temperature crossing, the thermal framework
+will trigger a hardware protection power-off (shutdown) or reboot,
+depending on configuration.
+
+At first, the kernel will attempt an orderly power-off or reboot, but
+accepts a delay after which it proceeds to do a forced power-off or
+reboot, respectively. If this fails, ``emergency restart()`` is invoked
+as last resort.
The delay should be carefully profiled so as to give adequate time for
-orderly poweroff.
+orderly power-off or reboot.
-If the delay is set to 0 emergency poweroff will not be supported. So a
-carefully profiled non-zero positive value is a must for emergency
-poweroff to be triggered.
+If the delay is set to 0, the emergency action will not be supported. So a
+carefully profiled non-zero positive value is a must for the emergency
+action to be triggered.
--
2.39.5
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 04/11] reboot: rename now misleading hw_protection symbols
2024-12-19 7:31 [PATCH 00/11] reboot: support runtime configuration of emergency hw_protection action Ahmad Fatoum
` (2 preceding siblings ...)
2024-12-19 7:31 ` [PATCH 03/11] docs: thermal: sync hardware protection doc with code Ahmad Fatoum
@ 2024-12-19 7:31 ` Ahmad Fatoum
2024-12-20 6:56 ` kernel test robot
2024-12-19 7:31 ` [PATCH 05/11] reboot: indicate whether it is a HARDWARE PROTECTION reboot or shutdown Ahmad Fatoum
` (7 subsequent siblings)
11 siblings, 1 reply; 18+ messages in thread
From: Ahmad Fatoum @ 2024-12-19 7:31 UTC (permalink / raw)
To: Daniel Lezcano, Fabio Estevam, Rafael J. Wysocki, Zhang Rui,
Lukasz Luba, Jonathan Corbet, Serge Hallyn, Liam Girdwood,
Mark Brown, Matti Vaittinen, Benson Leung, Tzung-Bi Shih,
Guenter Roeck, Rob Herring, Krzysztof Kozlowski, Conor Dooley
Cc: linux-kernel, linux-pm, linux-doc, linux-security-module,
chrome-platform, devicetree, kernel, Ahmad Fatoum
The __hw_protection_shutdown, hw_failure_emergency_poweroff_work and
hw_failure_emergency_poweroff_func symbol names have become misleading,
because they can either cause a shutdown (poweroff) or a reboot
depending on an argument or a global variable.
To avoid further confusion, let's rename them, so they don't suggest
that a poweroff is all they can do.
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
include/linux/reboot.h | 8 ++++----
kernel/reboot.c | 22 +++++++++++-----------
2 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/include/linux/reboot.h b/include/linux/reboot.h
index d6780fbf51535e1f98b576da0a06701402dfd447..b1e2c86d29a281abbcfe69bc00321df185c32c91 100644
--- a/include/linux/reboot.h
+++ b/include/linux/reboot.h
@@ -180,17 +180,17 @@ extern void orderly_reboot(void);
enum hw_protection_action { HWPROT_ACT_SHUTDOWN, HWPROT_ACT_REBOOT };
-void __hw_protection_shutdown(const char *reason, int ms_until_forced,
- enum hw_protection_action action);
+void __hw_protection_trigger(const char *reason, int ms_until_forced,
+ enum hw_protection_action action);
static inline void hw_protection_reboot(const char *reason, int ms_until_forced)
{
- __hw_protection_shutdown(reason, ms_until_forced, HWPROT_ACT_REBOOT);
+ __hw_protection_trigger(reason, ms_until_forced, HWPROT_ACT_REBOOT);
}
static inline void hw_protection_shutdown(const char *reason, int ms_until_forced)
{
- __hw_protection_shutdown(reason, ms_until_forced, HWPROT_ACT_SHUTDOWN);
+ __hw_protection_trigger(reason, ms_until_forced, HWPROT_ACT_SHUTDOWN);
}
/*
diff --git a/kernel/reboot.c b/kernel/reboot.c
index 8e3680d36654587b57db44806a3d7b0228b10f67..da6c8bdeeefe627a76c7ec6e8926138ebbe3ae4e 100644
--- a/kernel/reboot.c
+++ b/kernel/reboot.c
@@ -947,13 +947,13 @@ static const char *hw_protection_action_str(enum hw_protection_action action)
static enum hw_protection_action hw_failure_emergency_action;
/**
- * hw_failure_emergency_poweroff_func - emergency poweroff work after a known delay
- * @work: work_struct associated with the emergency poweroff function
+ * hw_failure_emergency_action_func - emergency action after a known delay
+ * @work: work_struct associated with the emergency action function
*
* This function is called in very critical situations to force
- * a kernel poweroff after a configurable timeout value.
+ * a kernel poweroff or reboot after a configurable timeout value.
*/
-static void hw_failure_emergency_poweroff_func(struct work_struct *work)
+static void hw_failure_emergency_action_func(struct work_struct *work)
{
const char *action_str = hw_protection_action_str(hw_failure_emergency_action);
@@ -981,8 +981,8 @@ static void hw_failure_emergency_poweroff_func(struct work_struct *work)
emergency_restart();
}
-static DECLARE_DELAYED_WORK(hw_failure_emergency_poweroff_work,
- hw_failure_emergency_poweroff_func);
+static DECLARE_DELAYED_WORK(hw_failure_emergency_action_work,
+ hw_failure_emergency_action_func);
/**
* hw_failure_emergency_schedule - Schedule an emergency system shutdown or reboot
@@ -996,12 +996,12 @@ static void hw_failure_emergency_schedule(enum hw_protection_action action,
if (poweroff_delay_ms <= 0)
return;
hw_failure_emergency_action = action;
- schedule_delayed_work(&hw_failure_emergency_poweroff_work,
+ schedule_delayed_work(&hw_failure_emergency_action_work,
msecs_to_jiffies(poweroff_delay_ms));
}
/**
- * __hw_protection_shutdown - Trigger an emergency system shutdown or reboot
+ * __hw_protection_trigger - Trigger an emergency system shutdown or reboot
*
* @reason: Reason of emergency shutdown or reboot to be printed.
* @ms_until_forced: Time to wait for orderly shutdown or reboot before
@@ -1018,8 +1018,8 @@ static void hw_failure_emergency_schedule(enum hw_protection_action action,
* pending even if the previous request has given a large timeout for forced
* shutdown/reboot.
*/
-void __hw_protection_shutdown(const char *reason, int ms_until_forced,
- enum hw_protection_action action)
+void __hw_protection_trigger(const char *reason, int ms_until_forced,
+ enum hw_protection_action action)
{
static atomic_t allow_proceed = ATOMIC_INIT(1);
@@ -1039,7 +1039,7 @@ void __hw_protection_shutdown(const char *reason, int ms_until_forced,
else
orderly_poweroff(true);
}
-EXPORT_SYMBOL_GPL(__hw_protection_shutdown);
+EXPORT_SYMBOL_GPL(__hw_protection_trigger);
static int __init reboot_setup(char *str)
{
--
2.39.5
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH 04/11] reboot: rename now misleading hw_protection symbols
2024-12-19 7:31 ` [PATCH 04/11] reboot: rename now misleading hw_protection symbols Ahmad Fatoum
@ 2024-12-20 6:56 ` kernel test robot
0 siblings, 0 replies; 18+ messages in thread
From: kernel test robot @ 2024-12-20 6:56 UTC (permalink / raw)
To: Ahmad Fatoum, Daniel Lezcano, Fabio Estevam, Rafael J. Wysocki,
Zhang Rui, Lukasz Luba, Jonathan Corbet, Serge Hallyn,
Liam Girdwood, Mark Brown, Matti Vaittinen, Matti Vaittinen,
Benson Leung, Tzung-Bi Shih, Guenter Roeck, Rob Herring,
Krzysztof Kozlowski, Conor Dooley
Cc: oe-kbuild-all, linux-kernel, linux-pm, linux-doc,
linux-security-module, chrome-platform, devicetree, kernel,
Ahmad Fatoum
Hi Ahmad,
kernel test robot noticed the following build warnings:
[auto build test WARNING on 78d4f34e2115b517bcbfe7ec0d018bbbb6f9b0b8]
url: https://github.com/intel-lab-lkp/linux/commits/Ahmad-Fatoum/reboot-replace-__hw_protection_shutdown-bool-action-parameter-with-an-enum/20241219-155416
base: 78d4f34e2115b517bcbfe7ec0d018bbbb6f9b0b8
patch link: https://lore.kernel.org/r/20241219-hw_protection-reboot-v1-4-263a0c1df802%40pengutronix.de
patch subject: [PATCH 04/11] reboot: rename now misleading hw_protection symbols
config: i386-buildonly-randconfig-003-20241220 (https://download.01.org/0day-ci/archive/20241220/202412201443.inJcQtcl-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241220/202412201443.inJcQtcl-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202412201443.inJcQtcl-lkp@intel.com/
All warnings (new ones prefixed by >>):
kernel/reboot.c:241: warning: Function parameter or struct member 'cmd' not described in 'do_kernel_restart'
kernel/reboot.c:995: warning: Function parameter or struct member 'action' not described in 'hw_failure_emergency_schedule'
kernel/reboot.c:995: warning: Function parameter or struct member 'poweroff_delay_ms' not described in 'hw_failure_emergency_schedule'
>> kernel/reboot.c:1023: warning: Function parameter or struct member 'action' not described in '__hw_protection_trigger'
>> kernel/reboot.c:1023: warning: Excess function parameter 'shutdown' description in '__hw_protection_trigger'
vim +1023 kernel/reboot.c
dfa19b11385d4c Matti Vaittinen 2021-06-03 1002
dfa19b11385d4c Matti Vaittinen 2021-06-03 1003 /**
c37fda1c195d45 Ahmad Fatoum 2024-12-19 1004 * __hw_protection_trigger - Trigger an emergency system shutdown or reboot
dfa19b11385d4c Matti Vaittinen 2021-06-03 1005 *
79fa723ba84c2b Fabio Estevam 2023-11-29 1006 * @reason: Reason of emergency shutdown or reboot to be printed.
79fa723ba84c2b Fabio Estevam 2023-11-29 1007 * @ms_until_forced: Time to wait for orderly shutdown or reboot before
79fa723ba84c2b Fabio Estevam 2023-11-29 1008 * triggering it. Negative value disables the forced
79fa723ba84c2b Fabio Estevam 2023-11-29 1009 * shutdown or reboot.
79fa723ba84c2b Fabio Estevam 2023-11-29 1010 * @shutdown: If true, indicates that a shutdown will happen
79fa723ba84c2b Fabio Estevam 2023-11-29 1011 * after the critical tempeature is reached.
79fa723ba84c2b Fabio Estevam 2023-11-29 1012 * If false, indicates that a reboot will happen
79fa723ba84c2b Fabio Estevam 2023-11-29 1013 * after the critical tempeature is reached.
dfa19b11385d4c Matti Vaittinen 2021-06-03 1014 *
79fa723ba84c2b Fabio Estevam 2023-11-29 1015 * Initiate an emergency system shutdown or reboot in order to protect
79fa723ba84c2b Fabio Estevam 2023-11-29 1016 * hardware from further damage. Usage examples include a thermal protection.
79fa723ba84c2b Fabio Estevam 2023-11-29 1017 * NOTE: The request is ignored if protection shutdown or reboot is already
79fa723ba84c2b Fabio Estevam 2023-11-29 1018 * pending even if the previous request has given a large timeout for forced
79fa723ba84c2b Fabio Estevam 2023-11-29 1019 * shutdown/reboot.
dfa19b11385d4c Matti Vaittinen 2021-06-03 1020 */
c37fda1c195d45 Ahmad Fatoum 2024-12-19 1021 void __hw_protection_trigger(const char *reason, int ms_until_forced,
d3e5893beaf551 Ahmad Fatoum 2024-12-19 1022 enum hw_protection_action action)
dfa19b11385d4c Matti Vaittinen 2021-06-03 @1023 {
dfa19b11385d4c Matti Vaittinen 2021-06-03 1024 static atomic_t allow_proceed = ATOMIC_INIT(1);
dfa19b11385d4c Matti Vaittinen 2021-06-03 1025
dfa19b11385d4c Matti Vaittinen 2021-06-03 1026 pr_emerg("HARDWARE PROTECTION shutdown (%s)\n", reason);
dfa19b11385d4c Matti Vaittinen 2021-06-03 1027
dfa19b11385d4c Matti Vaittinen 2021-06-03 1028 /* Shutdown should be initiated only once. */
dfa19b11385d4c Matti Vaittinen 2021-06-03 1029 if (!atomic_dec_and_test(&allow_proceed))
07a22b61946f0b Petr Mladek 2022-06-23 1030 return;
dfa19b11385d4c Matti Vaittinen 2021-06-03 1031
dfa19b11385d4c Matti Vaittinen 2021-06-03 1032 /*
dfa19b11385d4c Matti Vaittinen 2021-06-03 1033 * Queue a backup emergency shutdown in the event of
dfa19b11385d4c Matti Vaittinen 2021-06-03 1034 * orderly_poweroff failure
dfa19b11385d4c Matti Vaittinen 2021-06-03 1035 */
595ab92650cc28 Ahmad Fatoum 2024-12-19 1036 hw_failure_emergency_schedule(action, ms_until_forced);
d3e5893beaf551 Ahmad Fatoum 2024-12-19 1037 if (action == HWPROT_ACT_REBOOT)
79fa723ba84c2b Fabio Estevam 2023-11-29 1038 orderly_reboot();
d3e5893beaf551 Ahmad Fatoum 2024-12-19 1039 else
d3e5893beaf551 Ahmad Fatoum 2024-12-19 1040 orderly_poweroff(true);
dfa19b11385d4c Matti Vaittinen 2021-06-03 1041 }
c37fda1c195d45 Ahmad Fatoum 2024-12-19 1042 EXPORT_SYMBOL_GPL(__hw_protection_trigger);
dfa19b11385d4c Matti Vaittinen 2021-06-03 1043
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH 05/11] reboot: indicate whether it is a HARDWARE PROTECTION reboot or shutdown
2024-12-19 7:31 [PATCH 00/11] reboot: support runtime configuration of emergency hw_protection action Ahmad Fatoum
` (3 preceding siblings ...)
2024-12-19 7:31 ` [PATCH 04/11] reboot: rename now misleading hw_protection symbols Ahmad Fatoum
@ 2024-12-19 7:31 ` Ahmad Fatoum
2024-12-19 7:31 ` [PATCH 06/11] reboot: add support for configuring emergency hardware protection action Ahmad Fatoum
` (6 subsequent siblings)
11 siblings, 0 replies; 18+ messages in thread
From: Ahmad Fatoum @ 2024-12-19 7:31 UTC (permalink / raw)
To: Daniel Lezcano, Fabio Estevam, Rafael J. Wysocki, Zhang Rui,
Lukasz Luba, Jonathan Corbet, Serge Hallyn, Liam Girdwood,
Mark Brown, Matti Vaittinen, Benson Leung, Tzung-Bi Shih,
Guenter Roeck, Rob Herring, Krzysztof Kozlowski, Conor Dooley
Cc: linux-kernel, linux-pm, linux-doc, linux-security-module,
chrome-platform, devicetree, kernel, Ahmad Fatoum
It currently depends on the caller, whether we attempt a hardware
protection shutdown (poweroff) or a reboot. A follow-up commit will make
this partially user-configurable, so it's a good idea to have the
emergency message clearly state whether the kernel is going for a reboot
or a shutdown.
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
kernel/reboot.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/kernel/reboot.c b/kernel/reboot.c
index da6c8bdeeefe627a76c7ec6e8926138ebbe3ae4e..aa6317939af41c9730ec5a74b7faf03f7c0f25a7 100644
--- a/kernel/reboot.c
+++ b/kernel/reboot.c
@@ -1023,7 +1023,8 @@ void __hw_protection_trigger(const char *reason, int ms_until_forced,
{
static atomic_t allow_proceed = ATOMIC_INIT(1);
- pr_emerg("HARDWARE PROTECTION shutdown (%s)\n", reason);
+ pr_emerg("HARDWARE PROTECTION %s (%s)\n",
+ hw_protection_action_str(action), reason);
/* Shutdown should be initiated only once. */
if (!atomic_dec_and_test(&allow_proceed))
--
2.39.5
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 06/11] reboot: add support for configuring emergency hardware protection action
2024-12-19 7:31 [PATCH 00/11] reboot: support runtime configuration of emergency hw_protection action Ahmad Fatoum
` (4 preceding siblings ...)
2024-12-19 7:31 ` [PATCH 05/11] reboot: indicate whether it is a HARDWARE PROTECTION reboot or shutdown Ahmad Fatoum
@ 2024-12-19 7:31 ` Ahmad Fatoum
2024-12-19 7:31 ` [PATCH 07/11] regulator: allow user configuration of " Ahmad Fatoum
` (5 subsequent siblings)
11 siblings, 0 replies; 18+ messages in thread
From: Ahmad Fatoum @ 2024-12-19 7:31 UTC (permalink / raw)
To: Daniel Lezcano, Fabio Estevam, Rafael J. Wysocki, Zhang Rui,
Lukasz Luba, Jonathan Corbet, Serge Hallyn, Liam Girdwood,
Mark Brown, Matti Vaittinen, Benson Leung, Tzung-Bi Shih,
Guenter Roeck, Rob Herring, Krzysztof Kozlowski, Conor Dooley
Cc: linux-kernel, linux-pm, linux-doc, linux-security-module,
chrome-platform, devicetree, kernel, Ahmad Fatoum, Matteo Croce
We currently leave the decision of whether to shutdown or reboot to
protect hardware in an emergency situation to the individual drivers.
This works out in some cases, where the driver detecting the critical
failure has inside knowledge: It binds to the system management controller
for example or is guided by hardware description that defines what to do.
In the general case, however, the driver detecting the issue can't know
what the appropriate course of action is and shouldn't be dictating the
policy of dealing with it.
Therefore, add a global hw_protection toggle that allows the user to
specify whether shutdown or reboot should be the default action when the
driver doesn't set policy.
This introduces no functional change yet as hw_protection_trigger() has
no callers, but these will be added in subsequent commits.
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
Documentation/ABI/testing/sysfs-kernel-reboot | 8 +++++
Documentation/admin-guide/kernel-parameters.txt | 6 ++++
include/linux/reboot.h | 19 +++++++++-
include/uapi/linux/capability.h | 1 +
kernel/reboot.c | 46 +++++++++++++++++++++++++
5 files changed, 79 insertions(+), 1 deletion(-)
diff --git a/Documentation/ABI/testing/sysfs-kernel-reboot b/Documentation/ABI/testing/sysfs-kernel-reboot
index 837330fb251134ffdf29cd68f0b2a845b088e5a0..133f54707d533665c68a5946394540ec50b149e5 100644
--- a/Documentation/ABI/testing/sysfs-kernel-reboot
+++ b/Documentation/ABI/testing/sysfs-kernel-reboot
@@ -30,3 +30,11 @@ KernelVersion: 5.11
Contact: Matteo Croce <mcroce@microsoft.com>
Description: Don't wait for any other CPUs on reboot and
avoid anything that could hang.
+
+What: /sys/kernel/reboot/hw_protection
+Date: Feb 2025
+KernelVersion: 6.14
+Contact: Ahmad Fatoum <a.fatoum@pengutronix.de>
+Description: Hardware protection action taken on critical events like
+ overtemperature or imminent voltage loss.
+ Valid values are: reboot shutdown
diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index 3872bc6ec49d63772755504966ae70113f24a1db..ff244e6a0e04d2c172825818defd5d94448f8518 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -1921,6 +1921,12 @@
which allow the hypervisor to 'idle' the guest
on lock contention.
+ hw_protection= [HW]
+ Format: reboot | shutdown
+
+ Hardware protection action taken on critical events like
+ overtemperature or imminent voltage loss.
+
i2c_bus= [HW] Override the default board specific I2C bus speed
or register an additional I2C bus that is not
registered from board initialization code.
diff --git a/include/linux/reboot.h b/include/linux/reboot.h
index b1e2c86d29a281abbcfe69bc00321df185c32c91..281696f509932e444eadd453fb0233aa7a07fbce 100644
--- a/include/linux/reboot.h
+++ b/include/linux/reboot.h
@@ -178,11 +178,28 @@ void ctrl_alt_del(void);
extern void orderly_poweroff(bool force);
extern void orderly_reboot(void);
-enum hw_protection_action { HWPROT_ACT_SHUTDOWN, HWPROT_ACT_REBOOT };
+enum hw_protection_action { HWPROT_ACT_DEFAULT, HWPROT_ACT_SHUTDOWN, HWPROT_ACT_REBOOT };
void __hw_protection_trigger(const char *reason, int ms_until_forced,
enum hw_protection_action action);
+/**
+ * hw_protection_trigger - Trigger default emergency system hardware protection action
+ *
+ * @reason: Reason of emergency shutdown or reboot to be printed.
+ * @ms_until_forced: Time to wait for orderly shutdown or reboot before
+ * triggering it. Negative value disables the forced
+ * shutdown or reboot.
+ *
+ * Initiate an emergency system shutdown or reboot in order to protect
+ * hardware from further damage. The exact action taken is controllable at
+ * runtime and defaults to shutdown.
+ */
+static inline void hw_protection_trigger(const char *reason, int ms_until_forced)
+{
+ __hw_protection_trigger(reason, ms_until_forced, HWPROT_ACT_DEFAULT);
+}
+
static inline void hw_protection_reboot(const char *reason, int ms_until_forced)
{
__hw_protection_trigger(reason, ms_until_forced, HWPROT_ACT_REBOOT);
diff --git a/include/uapi/linux/capability.h b/include/uapi/linux/capability.h
index 5bb9060986974726025eaabee24a0b720ff94657..2e21b5594f81313e8e17aeeb98a09f098355515f 100644
--- a/include/uapi/linux/capability.h
+++ b/include/uapi/linux/capability.h
@@ -275,6 +275,7 @@ struct vfs_ns_cap_data {
/* Allow setting encryption key on loopback filesystem */
/* Allow setting zone reclaim policy */
/* Allow everything under CAP_BPF and CAP_PERFMON for backward compatibility */
+/* Allow setting hardware protection emergency action */
#define CAP_SYS_ADMIN 21
diff --git a/kernel/reboot.c b/kernel/reboot.c
index aa6317939af41c9730ec5a74b7faf03f7c0f25a7..08e7e5f00308ae66120688b83771a1b7fc8403cb 100644
--- a/kernel/reboot.c
+++ b/kernel/reboot.c
@@ -36,6 +36,8 @@ enum reboot_mode reboot_mode DEFAULT_REBOOT_MODE;
EXPORT_SYMBOL_GPL(reboot_mode);
enum reboot_mode panic_reboot_mode = REBOOT_UNDEFINED;
+static enum hw_protection_action hw_protection_action = HWPROT_ACT_SHUTDOWN;
+
/*
* This variable is used privately to keep track of whether or not
* reboot_type is still set to its default value (i.e., reboot= hasn't
@@ -1023,6 +1025,9 @@ void __hw_protection_trigger(const char *reason, int ms_until_forced,
{
static atomic_t allow_proceed = ATOMIC_INIT(1);
+ if (action == HWPROT_ACT_DEFAULT)
+ action = hw_protection_action;
+
pr_emerg("HARDWARE PROTECTION %s (%s)\n",
hw_protection_action_str(action), reason);
@@ -1042,6 +1047,46 @@ void __hw_protection_trigger(const char *reason, int ms_until_forced,
}
EXPORT_SYMBOL_GPL(__hw_protection_trigger);
+static bool hw_protection_action_parse(const char *str,
+ enum hw_protection_action *action)
+{
+ if (sysfs_streq(str, "shutdown"))
+ *action = HWPROT_ACT_SHUTDOWN;
+ else if (sysfs_streq(str, "reboot"))
+ *action = HWPROT_ACT_REBOOT;
+ else
+ return false;
+
+ return true;
+}
+
+static int __init hw_protection_setup(char *str)
+{
+ hw_protection_action_parse(str, &hw_protection_action);
+ return 1;
+}
+__setup("hw_protection=", hw_protection_setup);
+
+static ssize_t hw_protection_show(struct kobject *kobj,
+ struct kobj_attribute *attr, char *buf)
+{
+ return sysfs_emit(buf, "%s\n",
+ hw_protection_action_str(hw_protection_action));
+}
+static ssize_t hw_protection_store(struct kobject *kobj,
+ struct kobj_attribute *attr, const char *buf,
+ size_t count)
+{
+ if (!capable(CAP_SYS_ADMIN))
+ return -EPERM;
+
+ if (!hw_protection_action_parse(buf, &hw_protection_action))
+ return -EINVAL;
+
+ return count;
+}
+static struct kobj_attribute hw_protection_attr = __ATTR_RW(hw_protection);
+
static int __init reboot_setup(char *str)
{
for (;;) {
@@ -1301,6 +1346,7 @@ static struct kobj_attribute reboot_cpu_attr = __ATTR_RW(cpu);
#endif
static struct attribute *reboot_attrs[] = {
+ &hw_protection_attr.attr,
&reboot_mode_attr.attr,
#ifdef CONFIG_X86
&reboot_force_attr.attr,
--
2.39.5
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 07/11] regulator: allow user configuration of hardware protection action
2024-12-19 7:31 [PATCH 00/11] reboot: support runtime configuration of emergency hw_protection action Ahmad Fatoum
` (5 preceding siblings ...)
2024-12-19 7:31 ` [PATCH 06/11] reboot: add support for configuring emergency hardware protection action Ahmad Fatoum
@ 2024-12-19 7:31 ` Ahmad Fatoum
2024-12-19 7:31 ` [PATCH 08/11] platform/chrome: cros_ec_lpc: prepare for hw_protection_shutdown removal Ahmad Fatoum
` (4 subsequent siblings)
11 siblings, 0 replies; 18+ messages in thread
From: Ahmad Fatoum @ 2024-12-19 7:31 UTC (permalink / raw)
To: Daniel Lezcano, Fabio Estevam, Rafael J. Wysocki, Zhang Rui,
Lukasz Luba, Jonathan Corbet, Serge Hallyn, Liam Girdwood,
Mark Brown, Matti Vaittinen, Benson Leung, Tzung-Bi Shih,
Guenter Roeck, Rob Herring, Krzysztof Kozlowski, Conor Dooley
Cc: linux-kernel, linux-pm, linux-doc, linux-security-module,
chrome-platform, devicetree, kernel, Ahmad Fatoum
When the core detects permanent regulator hardware failure or imminent
power failure of a critical supply, it will call hw_protection_shutdown
in an attempt to do a limited orderly shutdown followed by powering off
the system.
This doesn't work out well for many unattended embedded systems that don't
have support for shutdown and that power on automatically when power is
supplied:
- A brief power cycle gets detected by the driver
- The kernel powers down the system and SoC goes into shutdown mode
- Power is restored
- The system remains oblivious to the restored power
- System needs to be manually power cycled for a duration long enough
to drain the capacitors
Allow users to fix this by calling the newly introduced
hw_protection_trigger() instead: This way the hw_protection commandline
or sysfs parameter is used to dictate the policy of dealing with the
regulator fault.
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
drivers/regulator/core.c | 4 ++--
drivers/regulator/irq_helpers.c | 16 ++++++++--------
2 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index 8cb948a91e60d958c6b5ec97d736e6e3bf4b47eb..74c8f1262f2cd4e796ba8f4f1bdf17b685a615c1 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -5137,8 +5137,8 @@ static void regulator_handle_critical(struct regulator_dev *rdev,
if (!reason)
return;
- hw_protection_shutdown(reason,
- rdev->constraints->uv_less_critical_window_ms);
+ hw_protection_trigger(reason,
+ rdev->constraints->uv_less_critical_window_ms);
}
/**
diff --git a/drivers/regulator/irq_helpers.c b/drivers/regulator/irq_helpers.c
index 0aa188b2bbb26797b7907cbfb581459ef41df286..5742faee8071dd8104c094587d66693f48fb0f9b 100644
--- a/drivers/regulator/irq_helpers.c
+++ b/drivers/regulator/irq_helpers.c
@@ -64,16 +64,16 @@ static void regulator_notifier_isr_work(struct work_struct *work)
reread:
if (d->fatal_cnt && h->retry_cnt > d->fatal_cnt) {
if (!d->die)
- return hw_protection_shutdown("Regulator HW failure? - no IC recovery",
- REGULATOR_FORCED_SAFETY_SHUTDOWN_WAIT_MS);
+ return hw_protection_trigger("Regulator HW failure? - no IC recovery",
+ REGULATOR_FORCED_SAFETY_SHUTDOWN_WAIT_MS);
ret = d->die(rid);
/*
* If the 'last resort' IC recovery failed we will have
* nothing else left to do...
*/
if (ret)
- return hw_protection_shutdown("Regulator HW failure. IC recovery failed",
- REGULATOR_FORCED_SAFETY_SHUTDOWN_WAIT_MS);
+ return hw_protection_trigger("Regulator HW failure. IC recovery failed",
+ REGULATOR_FORCED_SAFETY_SHUTDOWN_WAIT_MS);
/*
* If h->die() was implemented we assume recovery has been
@@ -263,14 +263,14 @@ static irqreturn_t regulator_notifier_isr(int irq, void *data)
if (d->fatal_cnt && h->retry_cnt > d->fatal_cnt) {
/* If we have no recovery, just try shut down straight away */
if (!d->die) {
- hw_protection_shutdown("Regulator failure. Retry count exceeded",
- REGULATOR_FORCED_SAFETY_SHUTDOWN_WAIT_MS);
+ hw_protection_trigger("Regulator failure. Retry count exceeded",
+ REGULATOR_FORCED_SAFETY_SHUTDOWN_WAIT_MS);
} else {
ret = d->die(rid);
/* If die() failed shut down as a last attempt to save the HW */
if (ret)
- hw_protection_shutdown("Regulator failure. Recovery failed",
- REGULATOR_FORCED_SAFETY_SHUTDOWN_WAIT_MS);
+ hw_protection_trigger("Regulator failure. Recovery failed",
+ REGULATOR_FORCED_SAFETY_SHUTDOWN_WAIT_MS);
}
}
--
2.39.5
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 08/11] platform/chrome: cros_ec_lpc: prepare for hw_protection_shutdown removal
2024-12-19 7:31 [PATCH 00/11] reboot: support runtime configuration of emergency hw_protection action Ahmad Fatoum
` (6 preceding siblings ...)
2024-12-19 7:31 ` [PATCH 07/11] regulator: allow user configuration of " Ahmad Fatoum
@ 2024-12-19 7:31 ` Ahmad Fatoum
2024-12-19 7:31 ` [PATCH 09/11] dt-bindings: thermal: give OS some leeway in absence of critical-action Ahmad Fatoum
` (3 subsequent siblings)
11 siblings, 0 replies; 18+ messages in thread
From: Ahmad Fatoum @ 2024-12-19 7:31 UTC (permalink / raw)
To: Daniel Lezcano, Fabio Estevam, Rafael J. Wysocki, Zhang Rui,
Lukasz Luba, Jonathan Corbet, Serge Hallyn, Liam Girdwood,
Mark Brown, Matti Vaittinen, Benson Leung, Tzung-Bi Shih,
Guenter Roeck, Rob Herring, Krzysztof Kozlowski, Conor Dooley
Cc: linux-kernel, linux-pm, linux-doc, linux-security-module,
chrome-platform, devicetree, kernel, Ahmad Fatoum
In the general case, a driver doesn't know which of system shutdown or
reboot is the better action to take to protect hardware in an emergency
situation. For this reason, hw_protection_shutdown is going to be
removed in favor of hw_protection_trigger, which defaults to shutdown,
but may be configured at kernel runtime to be a reboot instead.
The ChromeOS EC situation is different as we do know that shutdown is
the correct action as the EC is programmed to force reset after the
short period, thus replace hw_protection_shutdown with
__hw_protection_trigger with HWPROT_ACT_SHUTDOWN as argument to
maintain the same behavior.
No functional change.
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
drivers/platform/chrome/cros_ec_lpc.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/platform/chrome/cros_ec_lpc.c b/drivers/platform/chrome/cros_ec_lpc.c
index 924bf4d3cc77b9f27d415a10c61ae06886fa7f80..068781b75529d80b51b3773845bcf457fa958710 100644
--- a/drivers/platform/chrome/cros_ec_lpc.c
+++ b/drivers/platform/chrome/cros_ec_lpc.c
@@ -414,7 +414,7 @@ static void cros_ec_lpc_acpi_notify(acpi_handle device, u32 value, void *data)
blocking_notifier_call_chain(&ec_dev->panic_notifier, 0, ec_dev);
kobject_uevent_env(&ec_dev->dev->kobj, KOBJ_CHANGE, (char **)env);
/* Begin orderly shutdown. EC will force reset after a short period. */
- hw_protection_shutdown("CrOS EC Panic", -1);
+ __hw_protection_trigger("CrOS EC Panic", -1, HWPROT_ACT_SHUTDOWN);
/* Do not query for other events after a panic is reported */
return;
}
--
2.39.5
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 09/11] dt-bindings: thermal: give OS some leeway in absence of critical-action
2024-12-19 7:31 [PATCH 00/11] reboot: support runtime configuration of emergency hw_protection action Ahmad Fatoum
` (7 preceding siblings ...)
2024-12-19 7:31 ` [PATCH 08/11] platform/chrome: cros_ec_lpc: prepare for hw_protection_shutdown removal Ahmad Fatoum
@ 2024-12-19 7:31 ` Ahmad Fatoum
2025-01-02 17:33 ` Rob Herring (Arm)
2024-12-19 7:31 ` [PATCH 10/11] thermal: core: allow user configuration of hardware protection action Ahmad Fatoum
` (2 subsequent siblings)
11 siblings, 1 reply; 18+ messages in thread
From: Ahmad Fatoum @ 2024-12-19 7:31 UTC (permalink / raw)
To: Daniel Lezcano, Fabio Estevam, Rafael J. Wysocki, Zhang Rui,
Lukasz Luba, Jonathan Corbet, Serge Hallyn, Liam Girdwood,
Mark Brown, Matti Vaittinen, Benson Leung, Tzung-Bi Shih,
Guenter Roeck, Rob Herring, Krzysztof Kozlowski, Conor Dooley
Cc: linux-kernel, linux-pm, linux-doc, linux-security-module,
chrome-platform, devicetree, kernel, Ahmad Fatoum
An operating system may allow its user to configure the action to be
undertaken on critical overtemperature events.
However, the bindings currently mandate an absence of the critical-action
property to be equal to critical-action = "shutdown", which would mean
any differing user configuration would violate the bindings.
Resolve this by documenting the absence of the property to mean that the
OS gets to decide.
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
Documentation/devicetree/bindings/thermal/thermal-zones.yaml | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/Documentation/devicetree/bindings/thermal/thermal-zones.yaml b/Documentation/devicetree/bindings/thermal/thermal-zones.yaml
index 0f435be1dbd8cfb4502be9d198ed6d51058f453b..0de0a9757ccc201ebbb0c8c8efb9f8da662f8e9c 100644
--- a/Documentation/devicetree/bindings/thermal/thermal-zones.yaml
+++ b/Documentation/devicetree/bindings/thermal/thermal-zones.yaml
@@ -82,9 +82,8 @@ patternProperties:
$ref: /schemas/types.yaml#/definitions/string
description: |
The action the OS should perform after the critical temperature is reached.
- By default the system will shutdown as a safe action to prevent damage
- to the hardware, if the property is not set.
- The shutdown action should be always the default and preferred one.
+ If the property is not set, it is up to the system to select the correct
+ action. The recommended and preferred default is shutdown.
Choose 'reboot' with care, as the hardware may be in thermal stress,
thus leading to infinite reboots that may cause damage to the hardware.
Make sure the firmware/bootloader will act as the last resort and take
--
2.39.5
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH 09/11] dt-bindings: thermal: give OS some leeway in absence of critical-action
2024-12-19 7:31 ` [PATCH 09/11] dt-bindings: thermal: give OS some leeway in absence of critical-action Ahmad Fatoum
@ 2025-01-02 17:33 ` Rob Herring (Arm)
0 siblings, 0 replies; 18+ messages in thread
From: Rob Herring (Arm) @ 2025-01-02 17:33 UTC (permalink / raw)
To: Ahmad Fatoum
Cc: Fabio Estevam, kernel, Lukasz Luba, Krzysztof Kozlowski,
Tzung-Bi Shih, Liam Girdwood, linux-pm, Daniel Lezcano,
chrome-platform, Guenter Roeck, Jonathan Corbet, linux-doc,
Benson Leung, linux-security-module, Rafael J. Wysocki,
devicetree, Serge Hallyn, Zhang Rui, Mark Brown, Matti Vaittinen,
Conor Dooley, linux-kernel
On Thu, 19 Dec 2024 08:31:30 +0100, Ahmad Fatoum wrote:
> An operating system may allow its user to configure the action to be
> undertaken on critical overtemperature events.
>
> However, the bindings currently mandate an absence of the critical-action
> property to be equal to critical-action = "shutdown", which would mean
> any differing user configuration would violate the bindings.
>
> Resolve this by documenting the absence of the property to mean that the
> OS gets to decide.
>
> Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
> ---
> Documentation/devicetree/bindings/thermal/thermal-zones.yaml | 5 ++---
> 1 file changed, 2 insertions(+), 3 deletions(-)
>
Acked-by: Rob Herring (Arm) <robh@kernel.org>
^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH 10/11] thermal: core: allow user configuration of hardware protection action
2024-12-19 7:31 [PATCH 00/11] reboot: support runtime configuration of emergency hw_protection action Ahmad Fatoum
` (8 preceding siblings ...)
2024-12-19 7:31 ` [PATCH 09/11] dt-bindings: thermal: give OS some leeway in absence of critical-action Ahmad Fatoum
@ 2024-12-19 7:31 ` Ahmad Fatoum
2024-12-19 7:31 ` [PATCH 11/11] reboot: retire hw_protection_reboot and hw_protection_shutdown helpers Ahmad Fatoum
2024-12-22 9:38 ` [PATCH 00/11] reboot: support runtime configuration of emergency hw_protection action Matti Vaittinen
11 siblings, 0 replies; 18+ messages in thread
From: Ahmad Fatoum @ 2024-12-19 7:31 UTC (permalink / raw)
To: Daniel Lezcano, Fabio Estevam, Rafael J. Wysocki, Zhang Rui,
Lukasz Luba, Jonathan Corbet, Serge Hallyn, Liam Girdwood,
Mark Brown, Matti Vaittinen, Benson Leung, Tzung-Bi Shih,
Guenter Roeck, Rob Herring, Krzysztof Kozlowski, Conor Dooley
Cc: linux-kernel, linux-pm, linux-doc, linux-security-module,
chrome-platform, devicetree, kernel, Ahmad Fatoum
In the general case, we don't know which of system shutdown or
reboot is the better action to take to protect hardware in an emergency
situation. We thus allow the policy to come from the device-tree in the
form of an optional critical-action OF property, but so far there was no
way for the end user to configure this.
With recent addition of the hw_protection parameter, the user can now
choose a default action for the case, where the driver isn't fully sure
what's the better course of action.
Let's make use of this by passing HWPROT_ACT_DEFAULT in absence of the
critical-action OF property.
As HWPROT_ACT_DEFAULT is shutdown by default, this introduces no
functional change for users, unless they start using the new parameter.
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
drivers/thermal/thermal_core.c | 17 ++++++++++-------
drivers/thermal/thermal_core.h | 1 +
drivers/thermal/thermal_of.c | 7 +++++--
3 files changed, 16 insertions(+), 9 deletions(-)
diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c
index 19a3894ad752a91ef621794abbeec9abfb2323ec..abe990b7b40b0c7fa5034093b961e239840a18c1 100644
--- a/drivers/thermal/thermal_core.c
+++ b/drivers/thermal/thermal_core.c
@@ -369,7 +369,8 @@ void thermal_governor_update_tz(struct thermal_zone_device *tz,
tz->governor->update_tz(tz, reason);
}
-static void thermal_zone_device_halt(struct thermal_zone_device *tz, bool shutdown)
+static void thermal_zone_device_halt(struct thermal_zone_device *tz,
+ enum hw_protection_action action)
{
/*
* poweroff_delay_ms must be a carefully profiled positive value.
@@ -380,21 +381,23 @@ static void thermal_zone_device_halt(struct thermal_zone_device *tz, bool shutdo
dev_emerg(&tz->device, "%s: critical temperature reached\n", tz->type);
- if (shutdown)
- hw_protection_shutdown(msg, poweroff_delay_ms);
- else
- hw_protection_reboot(msg, poweroff_delay_ms);
+ __hw_protection_trigger(msg, poweroff_delay_ms, action);
}
void thermal_zone_device_critical(struct thermal_zone_device *tz)
{
- thermal_zone_device_halt(tz, true);
+ thermal_zone_device_halt(tz, HWPROT_ACT_DEFAULT);
}
EXPORT_SYMBOL(thermal_zone_device_critical);
+void thermal_zone_device_critical_shutdown(struct thermal_zone_device *tz)
+{
+ thermal_zone_device_halt(tz, HWPROT_ACT_SHUTDOWN);
+}
+
void thermal_zone_device_critical_reboot(struct thermal_zone_device *tz)
{
- thermal_zone_device_halt(tz, false);
+ thermal_zone_device_halt(tz, HWPROT_ACT_REBOOT);
}
static void handle_critical_trips(struct thermal_zone_device *tz,
diff --git a/drivers/thermal/thermal_core.h b/drivers/thermal/thermal_core.h
index be271e7c8f4141146a03efecc82fc4036ec12df6..7d6637126007168ac05010af0f16a4c8012a0d77 100644
--- a/drivers/thermal/thermal_core.h
+++ b/drivers/thermal/thermal_core.h
@@ -262,6 +262,7 @@ int thermal_build_list_of_policies(char *buf);
void __thermal_zone_device_update(struct thermal_zone_device *tz,
enum thermal_notify_event event);
void thermal_zone_device_critical_reboot(struct thermal_zone_device *tz);
+void thermal_zone_device_critical_shutdown(struct thermal_zone_device *tz);
void thermal_governor_update_tz(struct thermal_zone_device *tz,
enum thermal_notify_event reason);
diff --git a/drivers/thermal/thermal_of.c b/drivers/thermal/thermal_of.c
index fab11b98ca4952d23d0232998433bd0650b53d24..c574e775d686599deddd08f932a5a6dd781d342e 100644
--- a/drivers/thermal/thermal_of.c
+++ b/drivers/thermal/thermal_of.c
@@ -396,9 +396,12 @@ static struct thermal_zone_device *thermal_of_zone_register(struct device_node *
of_ops.should_bind = thermal_of_should_bind;
ret = of_property_read_string(np, "critical-action", &action);
- if (!ret)
- if (!of_ops.critical && !strcasecmp(action, "reboot"))
+ if (!ret && !of_ops.critical) {
+ if (!strcasecmp(action, "reboot"))
of_ops.critical = thermal_zone_device_critical_reboot;
+ else if (!strcasecmp(action, "shutdown"))
+ of_ops.critical = thermal_zone_device_critical_shutdown;
+ }
tz = thermal_zone_device_register_with_trips(np->name, trips, ntrips,
data, &of_ops, &tzp,
--
2.39.5
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 11/11] reboot: retire hw_protection_reboot and hw_protection_shutdown helpers
2024-12-19 7:31 [PATCH 00/11] reboot: support runtime configuration of emergency hw_protection action Ahmad Fatoum
` (9 preceding siblings ...)
2024-12-19 7:31 ` [PATCH 10/11] thermal: core: allow user configuration of hardware protection action Ahmad Fatoum
@ 2024-12-19 7:31 ` Ahmad Fatoum
2024-12-22 9:38 ` [PATCH 00/11] reboot: support runtime configuration of emergency hw_protection action Matti Vaittinen
11 siblings, 0 replies; 18+ messages in thread
From: Ahmad Fatoum @ 2024-12-19 7:31 UTC (permalink / raw)
To: Daniel Lezcano, Fabio Estevam, Rafael J. Wysocki, Zhang Rui,
Lukasz Luba, Jonathan Corbet, Serge Hallyn, Liam Girdwood,
Mark Brown, Matti Vaittinen, Benson Leung, Tzung-Bi Shih,
Guenter Roeck, Rob Herring, Krzysztof Kozlowski, Conor Dooley
Cc: linux-kernel, linux-pm, linux-doc, linux-security-module,
chrome-platform, devicetree, kernel, Ahmad Fatoum
The hw_protection_reboot and hw_protection_shutdown functions mix
mechanism with policy: They let the driver requesting an emergency
action for hardware protection also decide how to deal with it.
This is inadequate in the general case as a driver reporting e.g. an
imminent power failure can't know whether a shutdown or a reboot would
be more appropriate for a given hardware platform.
With the addition of the hw_protection parameter, it's now possible to
configure at runtime the default emergency action and drivers are
expected to use hw_protection_trigger to have this parameter dictate
policy.
As no current users of either hw_protection_shutdown or
hw_protection_shutdown helpers remain, remove them, as not to tempt
driver authors to call them.
Existing users now either defer to hw_protection_trigger or call
__hw_protection_trigger with a suitable argument directly when
they have inside knowledge on whether a reboot or shutdown would
be more appropriate.
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
include/linux/reboot.h | 10 ----------
1 file changed, 10 deletions(-)
diff --git a/include/linux/reboot.h b/include/linux/reboot.h
index 281696f509932e444eadd453fb0233aa7a07fbce..5c709463a7f85189e169bbaeb8bb7b115b20c996 100644
--- a/include/linux/reboot.h
+++ b/include/linux/reboot.h
@@ -200,16 +200,6 @@ static inline void hw_protection_trigger(const char *reason, int ms_until_forced
__hw_protection_trigger(reason, ms_until_forced, HWPROT_ACT_DEFAULT);
}
-static inline void hw_protection_reboot(const char *reason, int ms_until_forced)
-{
- __hw_protection_trigger(reason, ms_until_forced, HWPROT_ACT_REBOOT);
-}
-
-static inline void hw_protection_shutdown(const char *reason, int ms_until_forced)
-{
- __hw_protection_trigger(reason, ms_until_forced, HWPROT_ACT_SHUTDOWN);
-}
-
/*
* Emergency restart, callable from an interrupt handler.
*/
--
2.39.5
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH 00/11] reboot: support runtime configuration of emergency hw_protection action
2024-12-19 7:31 [PATCH 00/11] reboot: support runtime configuration of emergency hw_protection action Ahmad Fatoum
` (10 preceding siblings ...)
2024-12-19 7:31 ` [PATCH 11/11] reboot: retire hw_protection_reboot and hw_protection_shutdown helpers Ahmad Fatoum
@ 2024-12-22 9:38 ` Matti Vaittinen
2024-12-22 9:58 ` Ahmad Fatoum
11 siblings, 1 reply; 18+ messages in thread
From: Matti Vaittinen @ 2024-12-22 9:38 UTC (permalink / raw)
To: Ahmad Fatoum, Daniel Lezcano, Fabio Estevam, Rafael J. Wysocki,
Zhang Rui, Lukasz Luba, Jonathan Corbet, Serge Hallyn,
Liam Girdwood, Mark Brown, Benson Leung, Tzung-Bi Shih,
Guenter Roeck, Rob Herring, Krzysztof Kozlowski, Conor Dooley
Cc: linux-kernel, linux-pm, linux-doc, linux-security-module,
chrome-platform, devicetree, kernel, Matteo Croce
On 19/12/2024 09:31, Ahmad Fatoum wrote:
> We currently leave the decision of whether to shutdown or reboot to
> protect hardware in an emergency situation to the individual drivers.
>
> This works out in some cases, where the driver detecting the critical
> failure has inside knowledge: It binds to the system management controller
> for example or is guided by hardware description that defines what to do.
>
> This is inadequate in the general case though as a driver reporting e.g.
> an imminent power failure can't know whether a shutdown or a reboot would
> be more appropriate for a given hardware platform.
Sometimes it can. There are platforms where the hardware is such we know
that poweroff or reboot are the way to go. In such case the driver
should get the information from the hardware description (like device-tree).
> To address this, this series adds a hw_protection kernel parameter and
> sysfs toggle that can be used to change the action from the shutdown
> default to reboot. A new hw_protection_trigger API then makes use of
> this default action.
>
> My particular use case is unattended embedded systems that don't
> have support for shutdown and that power on automatically when power is
> supplied:
>
> - A brief power cycle gets detected by the driver
> - The kernel powers down the system and SoC goes into shutdown mode
> - Power is restored
> - The system remains oblivious to the restored power
This sounds like a consequence of a hardware design as restoring the
power doesn't wake up the SoC(?)
> - System needs to be manually power cycled for a duration long enough
> to drain the capacitors
>
> With this series, such systems can configure the kernel with
> hw_protection=reboot to have the boot firmware worry about critical
> conditions.
I am not against the change though. Just wondering if this is still a
consequence of the hardware design, and if the device-tree would be
proper place to indicate that poweroff shouldn't be used.
I'm about to leave my computer behind for holidays, so I am probably not
able to do a proper review until the next year. Thus this quick comment
:) Also, no strong opinion so I'm not expecting anyone to hold back
waiting for me!
Good luck and happy holidays!
-- Matti
> ---
> Ahmad Fatoum (11):
> reboot: replace __hw_protection_shutdown bool action parameter with an enum
> reboot: reboot, not shutdown, on hw_protection_reboot timeout
> docs: thermal: sync hardware protection doc with code
> reboot: rename now misleading hw_protection symbols
> reboot: indicate whether it is a HARDWARE PROTECTION reboot or shutdown
> reboot: add support for configuring emergency hardware protection action
> regulator: allow user configuration of hardware protection action
> platform/chrome: cros_ec_lpc: prepare for hw_protection_shutdown removal
> dt-bindings: thermal: give OS some leeway in absence of critical-action
> thermal: core: allow user configuration of hardware protection action
> reboot: retire hw_protection_reboot and hw_protection_shutdown helpers
>
> Documentation/ABI/testing/sysfs-kernel-reboot | 8 ++
> Documentation/admin-guide/kernel-parameters.txt | 6 +
> .../devicetree/bindings/thermal/thermal-zones.yaml | 5 +-
> Documentation/driver-api/thermal/sysfs-api.rst | 25 +++--
> drivers/platform/chrome/cros_ec_lpc.c | 2 +-
> drivers/regulator/core.c | 4 +-
> drivers/regulator/irq_helpers.c | 16 +--
> drivers/thermal/thermal_core.c | 17 +--
> drivers/thermal/thermal_core.h | 1 +
> drivers/thermal/thermal_of.c | 7 +-
> include/linux/reboot.h | 25 +++--
> include/uapi/linux/capability.h | 1 +
> kernel/reboot.c | 122 ++++++++++++++++-----
> 13 files changed, 173 insertions(+), 66 deletions(-)
> ---
> base-commit: 78d4f34e2115b517bcbfe7ec0d018bbbb6f9b0b8
> change-id: 20241218-hw_protection-reboot-96953493726a
>
> Best regards,
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 00/11] reboot: support runtime configuration of emergency hw_protection action
2024-12-22 9:38 ` [PATCH 00/11] reboot: support runtime configuration of emergency hw_protection action Matti Vaittinen
@ 2024-12-22 9:58 ` Ahmad Fatoum
0 siblings, 0 replies; 18+ messages in thread
From: Ahmad Fatoum @ 2024-12-22 9:58 UTC (permalink / raw)
To: Matti Vaittinen, Daniel Lezcano, Fabio Estevam, Rafael J. Wysocki,
Zhang Rui, Lukasz Luba, Jonathan Corbet, Serge Hallyn,
Liam Girdwood, Mark Brown, Benson Leung, Tzung-Bi Shih,
Guenter Roeck, Rob Herring, Krzysztof Kozlowski, Conor Dooley
Cc: linux-kernel, linux-pm, linux-doc, linux-security-module,
chrome-platform, devicetree, kernel, Matteo Croce
Hello Matti,
On 22.12.24 10:38, Matti Vaittinen wrote:
> On 19/12/2024 09:31, Ahmad Fatoum wrote:
>> We currently leave the decision of whether to shutdown or reboot to
>> protect hardware in an emergency situation to the individual drivers.
>>
>> This works out in some cases, where the driver detecting the critical
>> failure has inside knowledge: It binds to the system management controller
>> for example or is guided by hardware description that defines what to do.
>>
>> This is inadequate in the general case though as a driver reporting e.g.
>> an imminent power failure can't know whether a shutdown or a reboot would
>> be more appropriate for a given hardware platform.
>
> Sometimes it can. There are platforms where the hardware is such we know that poweroff or reboot are the way to go. In such case the driver should get the information from the hardware description (like device-tree).
Sure, the thermal framework for example has a device tree property that
tells it what the critical action should be. This continues to work as
before, but this series adjust only the default behavior when that device
tree property is missing.
>> To address this, this series adds a hw_protection kernel parameter and
>> sysfs toggle that can be used to change the action from the shutdown
>> default to reboot. A new hw_protection_trigger API then makes use of
>> this default action.
>>
>> My particular use case is unattended embedded systems that don't
>> have support for shutdown and that power on automatically when power is
>> supplied:
>>
>> - A brief power cycle gets detected by the driver
>> - The kernel powers down the system and SoC goes into shutdown mode
>> - Power is restored
>> - The system remains oblivious to the restored power
>
> This sounds like a consequence of a hardware design as restoring the power doesn't wake up the SoC(?)
There are two thresholds involved: One when the regulator first reports imminent
voltage loss and the kernel does something about it and one when the capacitor
have been depleted enough that the CPU is powered off.
With short voltage glitches (or big enough capacitors), I run into the situation,
where the kernel gets a voltage loss interrupt, goes into shutdown, but voltage
is restored before the CPU is actually powered off. As the system isn't designed
for shutdown anyway, there is no mechanism to wake up from it and we need to
hard power cycle the device.
>> - System needs to be manually power cycled for a duration long enough
>> to drain the capacitors
>>
>> With this series, such systems can configure the kernel with
>> hw_protection=reboot to have the boot firmware worry about critical
>> conditions.
>
> I am not against the change though. Just wondering if this is still a consequence of the hardware design, and if the device-tree would be proper place to indicate that poweroff shouldn't be used.
I considered this initially: add a device tree property for regulators, like there's
already for thermal zones. But I concluded that that this is a system-wide decision
and should be decided on at a system-wide level. We already have a
reboot=[warm,cold,...etc.] parameter, so this fits right in and it allows configuring
this also for non-DT platforms.
> I'm about to leave my computer behind for holidays, so I am probably not able to do a proper review until the next year. Thus this quick comment :) Also, no strong opinion so I'm not expecting anyone to hold back waiting for me!
Thanks and wishing you happy holidays as well.
Cheers,
Ahmad
>
> Good luck and happy holidays!
> -- Matti
>
>> ---
>> Ahmad Fatoum (11):
>> reboot: replace __hw_protection_shutdown bool action parameter with an enum
>> reboot: reboot, not shutdown, on hw_protection_reboot timeout
>> docs: thermal: sync hardware protection doc with code
>> reboot: rename now misleading hw_protection symbols
>> reboot: indicate whether it is a HARDWARE PROTECTION reboot or shutdown
>> reboot: add support for configuring emergency hardware protection action
>> regulator: allow user configuration of hardware protection action
>> platform/chrome: cros_ec_lpc: prepare for hw_protection_shutdown removal
>> dt-bindings: thermal: give OS some leeway in absence of critical-action
>> thermal: core: allow user configuration of hardware protection action
>> reboot: retire hw_protection_reboot and hw_protection_shutdown helpers
>>
>> Documentation/ABI/testing/sysfs-kernel-reboot | 8 ++
>> Documentation/admin-guide/kernel-parameters.txt | 6 +
>> .../devicetree/bindings/thermal/thermal-zones.yaml | 5 +-
>> Documentation/driver-api/thermal/sysfs-api.rst | 25 +++--
>> drivers/platform/chrome/cros_ec_lpc.c | 2 +-
>> drivers/regulator/core.c | 4 +-
>> drivers/regulator/irq_helpers.c | 16 +--
>> drivers/thermal/thermal_core.c | 17 +--
>> drivers/thermal/thermal_core.h | 1 +
>> drivers/thermal/thermal_of.c | 7 +-
>> include/linux/reboot.h | 25 +++--
>> include/uapi/linux/capability.h | 1 +
>> kernel/reboot.c | 122 ++++++++++++++++-----
>> 13 files changed, 173 insertions(+), 66 deletions(-)
>> ---
>> base-commit: 78d4f34e2115b517bcbfe7ec0d018bbbb6f9b0b8
>> change-id: 20241218-hw_protection-reboot-96953493726a
>>
>> Best regards,
>
>
--
Pengutronix e.K. | |
Steuerwalder Str. 21 | http://www.pengutronix.de/ |
31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
^ permalink raw reply [flat|nested] 18+ messages in thread