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

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


  • To: <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Per Bilse <per.bilse@xxxxxxxxxx>
  • Date: Wed, 25 Jan 2023 18:27:06 +0000
  • Authentication-results: esa5.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none
  • Cc: Per Bilse <per.bilse@xxxxxxxxxx>, Jan Beulich <jbeulich@xxxxxxxx>, Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, Roger Pau Monné <roger.pau@xxxxxxxxxx>, Wei Liu <wl@xxxxxxx>
  • Delivery-date: Wed, 25 Jan 2023 18:27:55 +0000
  • Ironport-data: A9a23:wZ6azapJJBSffdgDS3PCTb5OmDleBmIQZRIvgKrLsJaIsI4StFCzt garIBmEaPnbambweIsgYIy1p0oOvcTUyIBmGVRvriFhRitGopuZCYyVIHmrMnLJJKUvbq7FA +Y2MYCccZ9uHhcwgj/3b9ANeFEljfngqoLUUbKCYWYpAFc+E0/NsDo788YhmIlknNOlNA2Ev NL2sqX3NUSsnjV5KQr40YrawP9UlKm06WxwUmAWP6gR5weHzSRNUPrzGInqR5fGatgMdgKFb 76rIIGRpgvx4xorA9W5pbf3GmVirmn6ZFXmZtJ+AsBOszAazsAA+v9T2Mk0MC+7vw6hjdFpo OihgLTrIesf0g8gr8xGO/VQO3kW0aSrY9YrK1Dn2SCY5xWun3cBX5yCpaz5VGEV0r8fPI1Ay RAXACgHRRTfiMe6+qCQardMr+smJsa1I7pK7xmMzRmBZRonaZXKQqGM7t5ExjYgwMtJGJ4yZ eJAN2ApNk6ZJUQSZBFOUslWcOSA3xETdxVgpUjTj6sz+GX7xw1tyrn9dtHSf7RmQO0ExR/E/ zOeoQwVBDk8FMyykjy/ykuun9CevAbUdItDG5uno6sCbFq7mTVIVUx+uUGAiem0jAuyVsxSL 2QQ+zEytu4i+UqzVN7/Uhak5nmesXY0WdBdDuk74wGl0bfP7kCSAW1sZiFFQMwrsokxXzNC6 7OSt4q3X3o16uTTEC/DsO7O9lteJBT5M0cabwQAEQQg7+Pxi6FtrjvgS9xsTrGM24id9S7L/ xiGqy03hrM2hMEN1rmm8V2vvw9AtqQlXSZuuFyJAzvNAhdRIdf8Otf2sQSzAeNodt7xc7WXg JQTdyFyBsgqBIrFqiGCSf5l8FqBt6fca220bbKC8vAcG9WRF5yLJ9g4DNJWfh0B3iM4ldjBP ifuVft5vsM7AZdTRfYfj3iNI8or17P8Mt/uS+rZaNFDCrAoKlDboXEzPxXJhz69+KTJrU3YE c7LGftA8F5AUfg3pNZIb7l1PUAXKtAWmjqIGMGTI+WP2ruCfn+FIYrpw3PXBt3VGJis+V2Pm /4Gbpvi9vmqeLGmCsUh2dJJfA9iwLlSLcyelvG7gcbafVs/QjFxUqONqV7jEqQ895loei7z1 inVcidlJJDX3BUr9S3ihqhfVY7S
  • Ironport-hdrordr: A9a23:w+9ThalqSkUUTHuaRfT3qmK7PqHpDfIT3DAbv31ZSRFFG/FwWf re5cjztCWE8Ar5PUtLpTnuAtjkfZqxz+8W3WBVB8bAYOCEggqVxeNZnO/fKlTbckWUygce78 ddmsNFebrN5DZB/KDHCcqDf+rIAuPrzEllv4jjJr5WIz1XVw==
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

Provide a user-friendly option to specify preferred reboot details at
compile time.  It uses the same internals as the command line 'reboot'
parameter, and will be overridden by a choice on the command line.

Signed-off-by: Per Bilse <per.bilse@xxxxxxxxxx>
---
v2: Incorporate feedback from initial patch.  Separating out warm
reboot as a separate boolean led to a proliferation of code changes,
so we now use the details from Kconfig to assemble a reboot string
identical to what would be specified on the command line.  This leads
to minimal changes and additions to the code.
---
 xen/arch/x86/Kconfig    | 84 +++++++++++++++++++++++++++++++++++++++++
 xen/arch/x86/shutdown.c | 30 ++++++++++++++-
 2 files changed, 112 insertions(+), 2 deletions(-)

diff --git a/xen/arch/x86/Kconfig b/xen/arch/x86/Kconfig
index 6a7825f4ba..b881a118f1 100644
--- a/xen/arch/x86/Kconfig
+++ b/xen/arch/x86/Kconfig
@@ -306,6 +306,90 @@ config MEM_SHARING
        bool "Xen memory sharing support (UNSUPPORTED)" if UNSUPPORTED
        depends on HVM
 
+config REBOOT_SYSTEM_DEFAULT
+       bool "Xen-defined reboot method"
+       default y
+       help
+         Xen will choose the most appropriate reboot method,
+         which will be a Xen SCHEDOP hypercall if running as
+         a Xen guest, otherwise EFI, ACPI, or by way of the
+         keyboard controller, depending on system features.
+         Disabling this will allow you to specify how the
+         system will be rebooted.
+
+choice
+       bool "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 both this
+         configuration and the warm boot option below.
+
+         none    Suppress automatic reboot after panics or crashes
+         triple  Force a triple fault (init)
+         kbd     Use the keyboard controller
+         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_NONE
+       bool "none"
+
+       config REBOOT_METHOD_TRIPLE
+       bool "triple"
+
+       config REBOOT_METHOD_KBD
+       bool "kbd"
+
+       config REBOOT_METHOD_ACPI
+       bool "acpi"
+
+       config REBOOT_METHOD_PCI
+       bool "pci"
+
+       config REBOOT_METHOD_POWER
+       bool "power"
+
+       config REBOOT_METHOD_EFI
+       bool "efi"
+
+       config REBOOT_METHOD_XEN
+       bool "xen"
+       depends on !XEN_GUEST
+
+endchoice
+
+config REBOOT_METHOD
+       string
+       default "none"   if REBOOT_METHOD_NONE
+       default "triple" if REBOOT_METHOD_TRIPLE
+       default "kbd"    if REBOOT_METHOD_KBD
+       default "acpi"   if REBOOT_METHOD_ACPI
+       default "pci"    if REBOOT_METHOD_PCI
+       default "Power"  if REBOOT_METHOD_POWER
+       default "efi"    if REBOOT_METHOD_EFI
+       default "xen"    if REBOOT_METHOD_XEN
+
+config REBOOT_WARM
+       bool "Warm reboot"
+       default n
+       help
+         By default the system will perform a cold reboot.
+         Enable this to carry out a warm reboot.  This
+         configuration will have no effect if a "reboot="
+         string is supplied on the Xen command line; in this
+         case the reboot string must include "warm" if a warm
+         reboot is desired.
+
+config REBOOT_TEMPERATURE
+       string
+       default "warm" if REBOOT_WARM
+       default "cold" if !REBOOT_WARM && !REBOOT_SYSTEM_DEFAULT
+
 endmenu
 
 source "common/Kconfig"
diff --git a/xen/arch/x86/shutdown.c b/xen/arch/x86/shutdown.c
index 7619544d14..4969af1316 100644
--- a/xen/arch/x86/shutdown.c
+++ b/xen/arch/x86/shutdown.c
@@ -28,6 +28,19 @@
 #include <asm/apic.h>
 #include <asm/guest.h>
 
+/*
+ * We don't define a compiled-in reboot string if both method and
+ * temperature are defaults, in which case we can compile better code.
+ */
+#ifdef CONFIG_REBOOT_METHOD
+#define REBOOT_STR CONFIG_REBOOT_METHOD "," CONFIG_REBOOT_TEMPERATURE
+#else
+#ifdef CONFIG_REBOOT_TEMPERATURE
+#define REBOOT_STR CONFIG_REBOOT_TEMPERATURE
+#endif
+#endif
+
+/* Do not modify without updating arch/x86/Kconfig, see below. */
 enum reboot_type {
         BOOT_INVALID,
         BOOT_TRIPLE = 't',
@@ -42,10 +55,13 @@ enum reboot_type {
 static int reboot_mode;
 
 /*
- * reboot=t[riple] | k[bd] | a[cpi] | p[ci] | n[o] | [e]fi [, [w]arm | [c]old]
+ * These constants are duplicated in full in arch/x86/Kconfig, keep in synch.
+ *
+ * reboot=t[riple] | k[bd] | a[cpi] | p[ci] | P[ower] | n[one] | [e]fi
+ *                                                     [, [w]arm | [c]old]
  * warm   Don't set the cold reboot flag
  * cold   Set the cold reboot flag
- * no     Suppress automatic reboot after panics or crashes
+ * none   Suppress automatic reboot after panics or crashes
  * triple Force a triple fault (init)
  * kbd    Use the keyboard controller. cold reset (default)
  * acpi   Use the RESET_REG in the FADT
@@ -56,7 +72,12 @@ static int reboot_mode;
  */
 static enum reboot_type reboot_type = BOOT_INVALID;
 
+/* If we don't have a compiled-in boot string, we won't call after start-up. */
+#ifndef REBOOT_STR
 static int __init cf_check set_reboot_type(const char *str)
+#else
+static int cf_check set_reboot_type(const char *str)
+#endif
 {
     int rc = 0;
 
@@ -145,6 +166,11 @@ void machine_halt(void)
 
 static void default_reboot_type(void)
 {
+#ifdef REBOOT_STR
+    if ( reboot_type == BOOT_INVALID )
+        set_reboot_type(REBOOT_STR);
+#endif
+
     if ( reboot_type != BOOT_INVALID )
         return;
 
-- 
2.31.1




 


Rackspace

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