[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [XEN PATCH] Create a Kconfig option to set preferred reboot method


  • To: Per Bilse <per.bilse@xxxxxxxxxx>
  • From: Jan Beulich <jbeulich@xxxxxxxx>
  • Date: Tue, 17 Jan 2023 16:55:41 +0100
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=suse.com; dmarc=pass action=none header.from=suse.com; dkim=pass header.d=suse.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=qvZL0QLp5gwi4TE3RYXxeAqSEYBl+mDU5xcEH6xpkro=; b=Gm5ZZ9ZEXnyKUc6uqYDmDVVp6VyQNsg9+8Y17B6FbhHd0pVamtRqV3Kyqi85/o1pQO0KR048/i/EPZUuGI9zbOvUfV0PYdRu9SX/OjhVN2cj6VdKP59Ek1sgKKqsmEZ1VWAjh49OEqWvlkmXnrdcXKZVc+qO6yDSdcbkgMHyNywV7N4H9BWjObpAz841SWralfulkJPH3SIDEBZt+0cKeZNWmGzvhPMIM9eRsKLreFF/TSB/PQtS5kKg1H4LcH0AOWjGkuY4XvWwakwsj9uYoW1AftdlnxqSjsSh59Eclw1PETqf20Cv6RvF99DZ/N+LEPbQ0EjbcqpdXL6bJsvX/Q==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=WUYYWHyd+Usj0ljJ544wfkss5dPqlzewAwdnEwHk/DAnfMyYDj7NM39/J6qnG4Dh6+SJ6SWhEq2+UItlxsiH911zPjVaq8DJWIDVfu9gOh9ooeGVJFLLW+b6IySqowwAbrmEHYQQ8o7G+U23KBt2RAaMDC4R+IJxaezZEIEpugSmDfJsQOgNVMuTe947G8S5HVGA+U1NLmFR3QVv0wEJepkamWnyHq7HUvdsExNl4rjrPpXnmIF1eQAUw1Hf/rqG2K2Si8RePqtIzshhaodRMyJdNNNG9vazuEVmUYKardAQ1OBOsEs+Jk3Ic83CyuKG4q4F832KnxTEGEU85fYWiA==
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=suse.com;
  • Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, Roger Pau Monné <roger.pau@xxxxxxxxxx>, Wei Liu <wl@xxxxxxx>, xen-devel@xxxxxxxxxxxxxxxxxxxx
  • Delivery-date: Tue, 17 Jan 2023 15:55:52 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

On 16.01.2023 18:21, Per Bilse wrote:
> --- a/xen/arch/x86/Kconfig
> +++ b/xen/arch/x86/Kconfig
> @@ -306,6 +306,101 @@ config MEM_SHARING
>       bool "Xen memory sharing support (UNSUPPORTED)" if UNSUPPORTED
>       depends on HVM
>  
> +config REBOOT_SYSTEM_DEFAULT
> +     default y
> +     bool "Xen-defined reboot method"

May I ask that you swap the two lines? (Personally I consider kconfig
too forgiving here - it doesn't make a lot of sense to set a default
when the type isn't known yet.)

> +     help
> +             Xen will choose the most appropriate reboot method,
> +             which will be EFI, ACPI, or by way of the keyboard
> +             controller, depending on system features.  Disabling
> +             this will allow you to choose exactly how the system
> +             will be rebooted.

Indentation: Help text is to be indented by a tab and two spaces. See
pre-existing examples.

> +choice
> +     bool "Choose reboot method"
> +     depends on !REBOOT_SYSTEM_DEFAULT
> +     default REBOOT_METHOD_ACPI
> +     help
> +             This is a compiled-in alternative to specifying the
> +             reboot method on the Xen command line.  Specifying a
> +             method on the command line will override this choice.
> +
> +             warm    Don't set the cold reboot flag
> +             cold    Set the cold reboot flag

These two are modifiers, not reboot methods on their own. They set a
field in the BDA to tell the BIOS how much initialization / checking
to do (in the legacy case). Therefore they shouldn't be selectable
right here. If you feel like it you could add another boolean to
control that default.

> +             none    Suppress automatic reboot after panics or crashes
> +             triple  Force a triple fault (init)
> +             kbd     Use the keyboard controller, cold reset
> +             acpi    Use the RESET_REG in the FADT
> +             pci     Use the so-called "PCI reset register", CF9
> +             power   Like 'pci' but for a full power-cyle reset
> +             efi     Use the EFI reboot (if running under EFI)
> +             xen     Use Xen SCHEDOP hypercall (if running under Xen as a 
> guest)
> +
> +     config REBOOT_METHOD_WARM
> +             bool "warm"
> +             help
> +                     Don't set the cold reboot flag.

I don't think help text is very useful in sub-items of a choice. Plus
you also explain each item above.

> +     config REBOOT_METHOD_COLD
> +             bool "cold"
> +             help
> +                     Set the cold reboot flag.
> +
> +     config REBOOT_METHOD_NONE
> +             bool "none"
> +             help
> +                     Suppress automatic reboot after panics or crashes.
> +
> +     config REBOOT_METHOD_TRIPLE
> +             bool "triple"
> +             help
> +                     Force a triple fault (init).
> +
> +     config REBOOT_METHOD_KBD
> +             bool "kbd"
> +             help
> +                     Use the keyboard controller, cold reset.
> +
> +     config REBOOT_METHOD_ACPI
> +             bool "acpi"
> +             help
> +                     Use the RESET_REG in the FADT.
> +
> +     config REBOOT_METHOD_PCI
> +             bool "pci"
> +             help
> +                     Use the so-called "PCI reset register", CF9.
> +
> +     config REBOOT_METHOD_POWER
> +             bool "power"
> +             help
> +                     Like 'pci' but for a full power-cyle reset.
> +
> +     config REBOOT_METHOD_EFI
> +             bool "efi"
> +             help
> +                     Use the EFI reboot (if running under EFI).
> +
> +     config REBOOT_METHOD_XEN
> +             bool "xen"
> +             help
> +                     Use Xen SCHEDOP hypercall (if running under Xen as a 
> guest).

This wants to depend on XEN_GUEST, doesn't it?

> +endchoice
> +
> +config REBOOT_METHOD
> +     string
> +     default "w" if REBOOT_METHOD_WARM
> +     default "c" if REBOOT_METHOD_COLD
> +     default "n" if REBOOT_METHOD_NONE
> +     default "t" if REBOOT_METHOD_TRIPLE
> +     default "k" if REBOOT_METHOD_KBD
> +     default "a" if REBOOT_METHOD_ACPI
> +     default "p" if REBOOT_METHOD_PCI
> +     default "P" if REBOOT_METHOD_POWER
> +     default "e" if REBOOT_METHOD_EFI
> +     default "x" if REBOOT_METHOD_XEN

I think it would be neater (and more forward compatible) if the strings
were actually spelled out here. We may, at any time, make set_reboot_type()
look at more than just the first character.

> @@ -143,6 +144,8 @@ void machine_halt(void)
>      __machine_halt(NULL);
>  }
>  
> +#ifdef CONFIG_REBOOT_SYSTEM_DEFAULT
> +
>  static void default_reboot_type(void)
>  {
>      if ( reboot_type != BOOT_INVALID )
> @@ -533,6 +536,8 @@ static const struct dmi_system_id __initconstrel 
> reboot_dmi_table[] = {
>      { }
>  };
>  
> +#endif /* CONFIG_REBOOT_SYSTEM_DEFAULT */
> +
>  static int __init cf_check reboot_init(void)
>  {
>      /*
> @@ -542,8 +547,12 @@ static int __init cf_check reboot_init(void)
>      if ( reboot_type != BOOT_INVALID )
>          return 0;
>  
> +#ifdef CONFIG_REBOOT_SYSTEM_DEFAULT
>      default_reboot_type();
>      dmi_check_system(reboot_dmi_table);
> +#else
> +    set_reboot_type(CONFIG_REBOOT_METHOD);
> +#endif

I don't think you should eliminate the use of DMI - that's machine
specific information which should imo still overrule a build-time default.
See also the comment just out of context - it's a difference whether the
override came from the command line or was set at build time.

> @@ -595,8 +604,10 @@ void machine_restart(unsigned int delay_millisecs)
>          tboot_shutdown(TB_SHUTDOWN_REBOOT);
>      }
>  
> +#ifdef CONFIG_REBOOT_SYSTEM_DEFAULT
>      /* Just in case reboot_init() didn't run yet. */
>      default_reboot_type();
> +#endif
>      orig_reboot_type = reboot_type;

As the comment says, this is done here to cover the case of a very early
crash. You want to apply the build-time default then as well. Hence I
think you want to invoke set_reboot_type(CONFIG_REBOOT_METHOD) from
inside default_reboot_type(), rather than in place of it (perhaps while
#ifdef-ing out its alternative code). That'll then also make sure the
command line setting overrides the built-in default - it doesn't look
as if that would work with the current arrangements.

Furthermore a reboot type of "e" will result in reboot_type getting set
to BOOT_INVALID when not running on top of EFI. I think you want to fall
back to default_reboot_type() in that case.

So, taking everything together, maybe

static void default_reboot_type(void)
{
#ifndef CONFIG_REBOOT_SYSTEM_DEFAULT
    if ( reboot_type == BOOT_INVALID )
        set_reboot_type(CONFIG_REBOOT_METHOD);
#endif

    if ( reboot_type != BOOT_INVALID )
        return;

    if ( xen_guest )
    ...

? Which of course would require (conditionally?) dropping __init from
set_reboot_type(). (And I wonder whether the #ifndef wouldn't better be
"#ifdef CONFIG_REBOOT_METHOD".)

Jan



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.