[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v8 07/27] kernel/reboot: Add kernel_can_power_off()
 
- To: Thierry Reding <thierry.reding@xxxxxxxxx>,	Jonathan Hunter <jonathanh@xxxxxxxxxx>,	Russell King <linux@xxxxxxxxxxxxxxx>,	Catalin Marinas <catalin.marinas@xxxxxxx>,	Will Deacon <will@xxxxxxxxxx>,	Guo Ren <guoren@xxxxxxxxxx>,	Geert Uytterhoeven <geert@xxxxxxxxxxxxxx>,	Greg Ungerer <gerg@xxxxxxxxxxxxxx>,	Joshua Thompson <funaho@xxxxxxxxx>,	Thomas Bogendoerfer <tsbogend@xxxxxxxxxxxxxxxx>,	Sebastian Reichel <sre@xxxxxxxxxx>,	Linus Walleij <linus.walleij@xxxxxxxxxx>,	Philipp Zabel <p.zabel@xxxxxxxxxxxxxx>,	Greentime Hu <green.hu@xxxxxxxxx>,	Vincent Chen <deanbo422@xxxxxxxxx>,	"James E.J. Bottomley" <James.Bottomley@xxxxxxxxxxxxxxxxxxxxx>,	Helge Deller <deller@xxxxxx>,	Michael Ellerman <mpe@xxxxxxxxxxxxxx>,	Benjamin Herrenschmidt <benh@xxxxxxxxxxxxxxxxxxx>,	Paul Mackerras <paulus@xxxxxxxxx>,	Paul Walmsley <paul.walmsley@xxxxxxxxxx>,	Palmer Dabbelt <palmer@xxxxxxxxxxx>,	Albert Ou <aou@xxxxxxxxxxxxxxxxx>,	Yoshinori Sato <ysato@xxxxxxxxxxxxxxxxxxxx>,	Rich Felker <dalias@xxxxxxxx>,	Thomas Gleixner <tglx@xxxxxxxxxxxxx>,	Ingo Molnar <mingo@xxxxxxxxxx>,	Borislav Petkov <bp@xxxxxxxxx>,	Dave Hansen <dave.hansen@xxxxxxxxxxxxxxx>,	x86@xxxxxxxxxx,	"H. Peter Anvin" <hpa@xxxxxxxxx>,	Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx>,	Juergen Gross <jgross@xxxxxxxx>,	Stefano Stabellini <sstabellini@xxxxxxxxxx>,	"Rafael J. Wysocki" <rafael@xxxxxxxxxx>,	Len Brown <lenb@xxxxxxxxxx>,	Santosh Shilimkar <ssantosh@xxxxxxxxxx>,	Krzysztof Kozlowski <krzk@xxxxxxxxxx>,	Liam Girdwood <lgirdwood@xxxxxxxxx>,	Mark Brown <broonie@xxxxxxxxxx>,	Pavel Machek <pavel@xxxxxx>,	Lee Jones <lee.jones@xxxxxxxxxx>,	Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>,	Guenter Roeck <linux@xxxxxxxxxxxx>,	Daniel Lezcano <daniel.lezcano@xxxxxxxxxx>,	Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx>,	Ulf Hansson <ulf.hansson@xxxxxxxxxx>,	Michał Mirosław <mirq-linux@xxxxxxxxxxxx>
 
- From: Dmitry Osipenko <dmitry.osipenko@xxxxxxxxxxxxx>
 
- Date: Tue, 10 May 2022 02:32:15 +0300
 
- Cc: linux-kernel@xxxxxxxxxxxxxxx,	linux-csky@xxxxxxxxxxxxxxx,	linux-ia64@xxxxxxxxxxxxxxx,	linux-m68k@xxxxxxxxxxxxxxxxxxxx,	linux-mips@xxxxxxxxxxxxxxx,	linux-parisc@xxxxxxxxxxxxxxx,	linux-riscv@xxxxxxxxxxxxxxxxxxx,	linux-sh@xxxxxxxxxxxxxxx,	xen-devel@xxxxxxxxxxxxxxxxxxxx,	linux-acpi@xxxxxxxxxxxxxxx,	linux-pm@xxxxxxxxxxxxxxx,	linux-tegra@xxxxxxxxxxxxxxx
 
- Delivery-date: Mon, 09 May 2022 23:33:32 +0000
 
- List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
 
 
 
Add kernel_can_power_off() helper that replaces open-coded checks of
the global pm_power_off variable. This is a necessary step towards
supporting chained power-off handlers.
Signed-off-by: Dmitry Osipenko <dmitry.osipenko@xxxxxxxxxxxxx>
---
 include/linux/reboot.h |  1 +
 kernel/reboot.c        | 14 +++++++++++++-
 2 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/include/linux/reboot.h b/include/linux/reboot.h
index 6b951d68c0c7..c52f77ee4ddd 100644
--- a/include/linux/reboot.h
+++ b/include/linux/reboot.h
@@ -149,6 +149,7 @@ extern void kernel_restart_prepare(char *cmd);
 extern void kernel_restart(char *cmd);
 extern void kernel_halt(void);
 extern void kernel_power_off(void);
+extern bool kernel_can_power_off(void);
 
 void ctrl_alt_del(void);
 
diff --git a/kernel/reboot.c b/kernel/reboot.c
index eaede35f45e2..982e58c11ce8 100644
--- a/kernel/reboot.c
+++ b/kernel/reboot.c
@@ -523,6 +523,18 @@ void do_kernel_power_off(void)
        atomic_notifier_call_chain(&power_off_handler_list, 0, NULL);
 }
 
+/**
+ *     kernel_can_power_off - check whether system can be powered off
+ *
+ *     Returns true if power-off handler is registered and system can be
+ *     powered off, false otherwise.
+ */
+bool kernel_can_power_off(void)
+{
+       return !atomic_notifier_call_chain_is_empty(&power_off_handler_list);
+}
+EXPORT_SYMBOL_GPL(kernel_can_power_off);
+
 /**
  *     kernel_power_off - power_off the system
  *
@@ -581,7 +593,7 @@ SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned 
int, cmd,
        /* Instead of trying to make the power_off code look like
         * halt when pm_power_off is not set do it the easy way.
         */
-       if ((cmd == LINUX_REBOOT_CMD_POWER_OFF) && !pm_power_off)
+       if ((cmd == LINUX_REBOOT_CMD_POWER_OFF) && !kernel_can_power_off())
                cmd = LINUX_REBOOT_CMD_HALT;
 
        mutex_lock(&system_transition_mutex);
-- 
2.35.1
 
    
     |