All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 1/2] kernel/reboot: Add SYS_OFF_MODE_RESTART_PREPARE mode
@ 2022-09-13  6:20 Kai-Heng Feng
  2022-09-13  6:20 ` [PATCH v3 2/2] PM: ACPI: reboot: Reinstate S5 for reboot Kai-Heng Feng
  2022-09-13 15:13 ` [PATCH v3 1/2] kernel/reboot: Add SYS_OFF_MODE_RESTART_PREPARE mode Dmitry Osipenko
  0 siblings, 2 replies; 6+ messages in thread
From: Kai-Heng Feng @ 2022-09-13  6:20 UTC (permalink / raw)
  To: rafael.j.wysocki, lenb
  Cc: Kai-Heng Feng, Dmitry Osipenko, tangmeng, Luis Chamberlain,
	Petr Mladek, YueHaibing, linux-kernel

Add SYS_OFF_MODE_RESTART_PREPARE callbacks can be invoked before system
restart.

This is a preparation for next patch.

Suggested-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
---
v3:
 - New patch.

 include/linux/reboot.h |  8 ++++++++
 kernel/reboot.c        | 17 +++++++++++++++++
 2 files changed, 25 insertions(+)

diff --git a/include/linux/reboot.h b/include/linux/reboot.h
index e5d9ef886179c..ba87cdef2335a 100644
--- a/include/linux/reboot.h
+++ b/include/linux/reboot.h
@@ -105,6 +105,14 @@ enum sys_off_mode {
 	 */
 	SYS_OFF_MODE_POWER_OFF,
 
+	/**
+	 * @SYS_OFF_MODE_RESTART_PREPARE:
+	 *
+	 * Handlers prepare system to be powered off. Handlers are
+	 * allowed to sleep.
+	 */
+	SYS_OFF_MODE_RESTART_PREPARE,
+
 	/**
 	 * @SYS_OFF_MODE_RESTART:
 	 *
diff --git a/kernel/reboot.c b/kernel/reboot.c
index 3c35445bf5ad3..3bba88c7ffc6b 100644
--- a/kernel/reboot.c
+++ b/kernel/reboot.c
@@ -243,6 +243,17 @@ void migrate_to_reboot_cpu(void)
 	set_cpus_allowed_ptr(current, cpumask_of(cpu));
 }
 
+/*
+ *	Notifier list for kernel code which wants to be called
+ *	to prepare system for restart.
+ */
+static BLOCKING_NOTIFIER_HEAD(restart_prep_handler_list);
+
+static void do_kernel_restart_prepare(void)
+{
+	blocking_notifier_call_chain(&restart_prep_handler_list, 0, NULL);
+}
+
 /**
  *	kernel_restart - reboot the system
  *	@cmd: pointer to buffer containing command to execute for restart
@@ -254,6 +265,7 @@ void migrate_to_reboot_cpu(void)
 void kernel_restart(char *cmd)
 {
 	kernel_restart_prepare(cmd);
+	do_kernel_restart_prepare();
 	migrate_to_reboot_cpu();
 	syscore_shutdown();
 	if (!cmd)
@@ -396,6 +408,11 @@ register_sys_off_handler(enum sys_off_mode mode,
 		handler->list = &power_off_handler_list;
 		break;
 
+	case SYS_OFF_MODE_RESTART_PREPARE:
+		handler->list = &restart_prep_handler_list;
+		handler->blocking = true;
+		break;
+
 	case SYS_OFF_MODE_RESTART:
 		handler->list = &restart_handler_list;
 		break;
-- 
2.36.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH v3 2/2] PM: ACPI: reboot: Reinstate S5 for reboot
  2022-09-13  6:20 [PATCH v3 1/2] kernel/reboot: Add SYS_OFF_MODE_RESTART_PREPARE mode Kai-Heng Feng
@ 2022-09-13  6:20 ` Kai-Heng Feng
  2022-09-13 15:17   ` Dmitry Osipenko
  2022-09-13 15:13 ` [PATCH v3 1/2] kernel/reboot: Add SYS_OFF_MODE_RESTART_PREPARE mode Dmitry Osipenko
  1 sibling, 1 reply; 6+ messages in thread
From: Kai-Heng Feng @ 2022-09-13  6:20 UTC (permalink / raw)
  To: rafael.j.wysocki, lenb
  Cc: Kai-Heng Feng, Josef Bacik, Dmitry Osipenko, Rafael J. Wysocki,
	linux-acpi, linux-kernel

Commit d60cd06331a3 ("PM: ACPI: reboot: Use S5 for reboot") caused Dell
PowerEdge r440 hangs at reboot.

The issue is fixed by commit 2ca1c94ce0b6 ("tg3: Disable tg3 device on
system reboot to avoid triggering AER"), so use the new sysoff API to
reinstate S5 for reboot on ACPI-based systems.

Cc: Josef Bacik <josef@toxicpanda.com>
Suggested-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
---
v3:
 - Use new API to invoke ACPI S5.

v2:
 - Use do_kernel_power_off_prepare() instead.

 drivers/acpi/sleep.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c
index ad4b2987b3d6e..dce5460902eed 100644
--- a/drivers/acpi/sleep.c
+++ b/drivers/acpi/sleep.c
@@ -1088,6 +1088,10 @@ int __init acpi_sleep_init(void)
 		register_sys_off_handler(SYS_OFF_MODE_POWER_OFF,
 					 SYS_OFF_PRIO_FIRMWARE,
 					 acpi_power_off, NULL);
+
+		register_sys_off_handler(SYS_OFF_MODE_RESTART_PREPARE,
+					 SYS_OFF_PRIO_FIRMWARE,
+					 acpi_power_off_prepare, NULL);
 	} else {
 		acpi_no_s5 = true;
 	}
-- 
2.36.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH v3 1/2] kernel/reboot: Add SYS_OFF_MODE_RESTART_PREPARE mode
  2022-09-13  6:20 [PATCH v3 1/2] kernel/reboot: Add SYS_OFF_MODE_RESTART_PREPARE mode Kai-Heng Feng
  2022-09-13  6:20 ` [PATCH v3 2/2] PM: ACPI: reboot: Reinstate S5 for reboot Kai-Heng Feng
@ 2022-09-13 15:13 ` Dmitry Osipenko
  2022-09-16  0:03   ` Kai-Heng Feng
  1 sibling, 1 reply; 6+ messages in thread
From: Dmitry Osipenko @ 2022-09-13 15:13 UTC (permalink / raw)
  To: Kai-Heng Feng, rafael.j.wysocki, lenb
  Cc: tangmeng, Luis Chamberlain, Petr Mladek, YueHaibing, linux-kernel

On 9/13/22 09:20, Kai-Heng Feng wrote:
> Add SYS_OFF_MODE_RESTART_PREPARE callbacks can be invoked before system
> restart.
> 
> This is a preparation for next patch.
> 
> Suggested-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
> Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
> ---
> v3:
>  - New patch.
> 
>  include/linux/reboot.h |  8 ++++++++
>  kernel/reboot.c        | 17 +++++++++++++++++
>  2 files changed, 25 insertions(+)
> 
> diff --git a/include/linux/reboot.h b/include/linux/reboot.h
> index e5d9ef886179c..ba87cdef2335a 100644
> --- a/include/linux/reboot.h
> +++ b/include/linux/reboot.h
> @@ -105,6 +105,14 @@ enum sys_off_mode {
>  	 */
>  	SYS_OFF_MODE_POWER_OFF,
>  
> +	/**
> +	 * @SYS_OFF_MODE_RESTART_PREPARE:
> +	 *
> +	 * Handlers prepare system to be powered off. Handlers are

s/powered off/restarted/

> +	 * allowed to sleep.
> +	 */
> +	SYS_OFF_MODE_RESTART_PREPARE,
> +
>  	/**
>  	 * @SYS_OFF_MODE_RESTART:
>  	 *
> diff --git a/kernel/reboot.c b/kernel/reboot.c
> index 3c35445bf5ad3..3bba88c7ffc6b 100644
> --- a/kernel/reboot.c
> +++ b/kernel/reboot.c
> @@ -243,6 +243,17 @@ void migrate_to_reboot_cpu(void)
>  	set_cpus_allowed_ptr(current, cpumask_of(cpu));
>  }
>  
> +/*
> + *	Notifier list for kernel code which wants to be called
> + *	to prepare system for restart.
> + */
> +static BLOCKING_NOTIFIER_HEAD(restart_prep_handler_list);
> +
> +static void do_kernel_restart_prepare(void)
> +{
> +	blocking_notifier_call_chain(&restart_prep_handler_list, 0, NULL);
> +}
> +
>  /**
>   *	kernel_restart - reboot the system
>   *	@cmd: pointer to buffer containing command to execute for restart
> @@ -254,6 +265,7 @@ void migrate_to_reboot_cpu(void)
>  void kernel_restart(char *cmd)
>  {
>  	kernel_restart_prepare(cmd);
> +	do_kernel_restart_prepare();
>  	migrate_to_reboot_cpu();
>  	syscore_shutdown();
>  	if (!cmd)
> @@ -396,6 +408,11 @@ register_sys_off_handler(enum sys_off_mode mode,
>  		handler->list = &power_off_handler_list;
>  		break;
>  
> +	case SYS_OFF_MODE_RESTART_PREPARE:
> +		handler->list = &restart_prep_handler_list;
> +		handler->blocking = true;
> +		break;
> +
>  	case SYS_OFF_MODE_RESTART:
>  		handler->list = &restart_handler_list;
>  		break;

With the above comment addressed:

Reviewed-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>

-- 
Best regards,
Dmitry


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v3 2/2] PM: ACPI: reboot: Reinstate S5 for reboot
  2022-09-13  6:20 ` [PATCH v3 2/2] PM: ACPI: reboot: Reinstate S5 for reboot Kai-Heng Feng
@ 2022-09-13 15:17   ` Dmitry Osipenko
  2022-09-16  0:03     ` Kai-Heng Feng
  0 siblings, 1 reply; 6+ messages in thread
From: Dmitry Osipenko @ 2022-09-13 15:17 UTC (permalink / raw)
  To: Kai-Heng Feng, rafael.j.wysocki, lenb
  Cc: Josef Bacik, Rafael J. Wysocki, linux-acpi, linux-kernel

On 9/13/22 09:20, Kai-Heng Feng wrote:
> Commit d60cd06331a3 ("PM: ACPI: reboot: Use S5 for reboot") caused Dell
> PowerEdge r440 hangs at reboot.
> 
> The issue is fixed by commit 2ca1c94ce0b6 ("tg3: Disable tg3 device on
> system reboot to avoid triggering AER"), so use the new sysoff API to
> reinstate S5 for reboot on ACPI-based systems.
> 
> Cc: Josef Bacik <josef@toxicpanda.com>
> Suggested-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
> Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
> ---
> v3:
>  - Use new API to invoke ACPI S5.
> 
> v2:
>  - Use do_kernel_power_off_prepare() instead.
> 
>  drivers/acpi/sleep.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c
> index ad4b2987b3d6e..dce5460902eed 100644
> --- a/drivers/acpi/sleep.c
> +++ b/drivers/acpi/sleep.c
> @@ -1088,6 +1088,10 @@ int __init acpi_sleep_init(void)
>  		register_sys_off_handler(SYS_OFF_MODE_POWER_OFF,
>  					 SYS_OFF_PRIO_FIRMWARE,
>  					 acpi_power_off, NULL);
> +
> +		register_sys_off_handler(SYS_OFF_MODE_RESTART_PREPARE,
> +					 SYS_OFF_PRIO_FIRMWARE,
> +					 acpi_power_off_prepare, NULL);

Maybe you could add a small comment to the code explaining why
acpi_power_off_prepare is used for restarting?

Is it safe to use S5 on restart for all devices in general?

-- 
Best regards,
Dmitry


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v3 2/2] PM: ACPI: reboot: Reinstate S5 for reboot
  2022-09-13 15:17   ` Dmitry Osipenko
@ 2022-09-16  0:03     ` Kai-Heng Feng
  0 siblings, 0 replies; 6+ messages in thread
From: Kai-Heng Feng @ 2022-09-16  0:03 UTC (permalink / raw)
  To: Dmitry Osipenko
  Cc: rafael.j.wysocki, lenb, Josef Bacik, Rafael J. Wysocki,
	linux-acpi, linux-kernel

On Tue, Sep 13, 2022 at 11:17 PM Dmitry Osipenko
<dmitry.osipenko@collabora.com> wrote:
>
> On 9/13/22 09:20, Kai-Heng Feng wrote:
> > Commit d60cd06331a3 ("PM: ACPI: reboot: Use S5 for reboot") caused Dell
> > PowerEdge r440 hangs at reboot.
> >
> > The issue is fixed by commit 2ca1c94ce0b6 ("tg3: Disable tg3 device on
> > system reboot to avoid triggering AER"), so use the new sysoff API to
> > reinstate S5 for reboot on ACPI-based systems.
> >
> > Cc: Josef Bacik <josef@toxicpanda.com>
> > Suggested-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
> > Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
> > ---
> > v3:
> >  - Use new API to invoke ACPI S5.
> >
> > v2:
> >  - Use do_kernel_power_off_prepare() instead.
> >
> >  drivers/acpi/sleep.c | 4 ++++
> >  1 file changed, 4 insertions(+)
> >
> > diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c
> > index ad4b2987b3d6e..dce5460902eed 100644
> > --- a/drivers/acpi/sleep.c
> > +++ b/drivers/acpi/sleep.c
> > @@ -1088,6 +1088,10 @@ int __init acpi_sleep_init(void)
> >               register_sys_off_handler(SYS_OFF_MODE_POWER_OFF,
> >                                        SYS_OFF_PRIO_FIRMWARE,
> >                                        acpi_power_off, NULL);
> > +
> > +             register_sys_off_handler(SYS_OFF_MODE_RESTART_PREPARE,
> > +                                      SYS_OFF_PRIO_FIRMWARE,
> > +                                      acpi_power_off_prepare, NULL);
>
> Maybe you could add a small comment to the code explaining why
> acpi_power_off_prepare is used for restarting?

Will do.

>
> Is it safe to use S5 on restart for all devices in general?

S5 should be used, but it may expose some driver bugs like the one
mentioned in the commit message.

Kai-Heng

>
> --
> Best regards,
> Dmitry
>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v3 1/2] kernel/reboot: Add SYS_OFF_MODE_RESTART_PREPARE mode
  2022-09-13 15:13 ` [PATCH v3 1/2] kernel/reboot: Add SYS_OFF_MODE_RESTART_PREPARE mode Dmitry Osipenko
@ 2022-09-16  0:03   ` Kai-Heng Feng
  0 siblings, 0 replies; 6+ messages in thread
From: Kai-Heng Feng @ 2022-09-16  0:03 UTC (permalink / raw)
  To: Dmitry Osipenko
  Cc: rafael.j.wysocki, lenb, tangmeng, Luis Chamberlain, Petr Mladek,
	YueHaibing, linux-kernel

On Tue, Sep 13, 2022 at 11:14 PM Dmitry Osipenko
<dmitry.osipenko@collabora.com> wrote:
>
> On 9/13/22 09:20, Kai-Heng Feng wrote:
> > Add SYS_OFF_MODE_RESTART_PREPARE callbacks can be invoked before system
> > restart.
> >
> > This is a preparation for next patch.
> >
> > Suggested-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
> > Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
> > ---
> > v3:
> >  - New patch.
> >
> >  include/linux/reboot.h |  8 ++++++++
> >  kernel/reboot.c        | 17 +++++++++++++++++
> >  2 files changed, 25 insertions(+)
> >
> > diff --git a/include/linux/reboot.h b/include/linux/reboot.h
> > index e5d9ef886179c..ba87cdef2335a 100644
> > --- a/include/linux/reboot.h
> > +++ b/include/linux/reboot.h
> > @@ -105,6 +105,14 @@ enum sys_off_mode {
> >        */
> >       SYS_OFF_MODE_POWER_OFF,
> >
> > +     /**
> > +      * @SYS_OFF_MODE_RESTART_PREPARE:
> > +      *
> > +      * Handlers prepare system to be powered off. Handlers are
>
> s/powered off/restarted/

Will address this in next revision.

Kai-Heng

>
> > +      * allowed to sleep.
> > +      */
> > +     SYS_OFF_MODE_RESTART_PREPARE,
> > +
> >       /**
> >        * @SYS_OFF_MODE_RESTART:
> >        *
> > diff --git a/kernel/reboot.c b/kernel/reboot.c
> > index 3c35445bf5ad3..3bba88c7ffc6b 100644
> > --- a/kernel/reboot.c
> > +++ b/kernel/reboot.c
> > @@ -243,6 +243,17 @@ void migrate_to_reboot_cpu(void)
> >       set_cpus_allowed_ptr(current, cpumask_of(cpu));
> >  }
> >
> > +/*
> > + *   Notifier list for kernel code which wants to be called
> > + *   to prepare system for restart.
> > + */
> > +static BLOCKING_NOTIFIER_HEAD(restart_prep_handler_list);
> > +
> > +static void do_kernel_restart_prepare(void)
> > +{
> > +     blocking_notifier_call_chain(&restart_prep_handler_list, 0, NULL);
> > +}
> > +
> >  /**
> >   *   kernel_restart - reboot the system
> >   *   @cmd: pointer to buffer containing command to execute for restart
> > @@ -254,6 +265,7 @@ void migrate_to_reboot_cpu(void)
> >  void kernel_restart(char *cmd)
> >  {
> >       kernel_restart_prepare(cmd);
> > +     do_kernel_restart_prepare();
> >       migrate_to_reboot_cpu();
> >       syscore_shutdown();
> >       if (!cmd)
> > @@ -396,6 +408,11 @@ register_sys_off_handler(enum sys_off_mode mode,
> >               handler->list = &power_off_handler_list;
> >               break;
> >
> > +     case SYS_OFF_MODE_RESTART_PREPARE:
> > +             handler->list = &restart_prep_handler_list;
> > +             handler->blocking = true;
> > +             break;
> > +
> >       case SYS_OFF_MODE_RESTART:
> >               handler->list = &restart_handler_list;
> >               break;
>
> With the above comment addressed:
>
> Reviewed-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
>
> --
> Best regards,
> Dmitry
>

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2022-09-16  0:04 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-13  6:20 [PATCH v3 1/2] kernel/reboot: Add SYS_OFF_MODE_RESTART_PREPARE mode Kai-Heng Feng
2022-09-13  6:20 ` [PATCH v3 2/2] PM: ACPI: reboot: Reinstate S5 for reboot Kai-Heng Feng
2022-09-13 15:17   ` Dmitry Osipenko
2022-09-16  0:03     ` Kai-Heng Feng
2022-09-13 15:13 ` [PATCH v3 1/2] kernel/reboot: Add SYS_OFF_MODE_RESTART_PREPARE mode Dmitry Osipenko
2022-09-16  0:03   ` Kai-Heng Feng

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.