lkml.org 
[lkml]   [2022]   [Nov]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v14 6/7] crash: memory and cpu hotplug sysfs attributes
    Date
    This introduces the crash_hotplug attribute for memory and CPUs
    for use by userspace. This change directly facilitates the udev
    rule for managing userspace re-loading of the crash kernel upon
    hot un/plug changes.

    For memory, this changeset introduces the crash_hotplug attribute
    to the /sys/devices/system/memory directory. For example:

    # udevadm info --attribute-walk /sys/devices/system/memory/memory81
    looking at device '/devices/system/memory/memory81':
    KERNEL=="memory81"
    SUBSYSTEM=="memory"
    DRIVER==""
    ATTR{online}=="1"
    ATTR{phys_device}=="0"
    ATTR{phys_index}=="00000051"
    ATTR{removable}=="1"
    ATTR{state}=="online"
    ATTR{valid_zones}=="Movable"

    looking at parent device '/devices/system/memory':
    KERNELS=="memory"
    SUBSYSTEMS==""
    DRIVERS==""
    ATTRS{auto_online_blocks}=="offline"
    ATTRS{block_size_bytes}=="8000000"
    ATTRS{crash_hotplug}=="1"

    For CPUs, this changeset introduces the crash_hotplug attribute
    to the /sys/devices/system/cpu directory. For example:

    # udevadm info --attribute-walk /sys/devices/system/cpu/cpu0
    looking at device '/devices/system/cpu/cpu0':
    KERNEL=="cpu0"
    SUBSYSTEM=="cpu"
    DRIVER=="processor"
    ATTR{crash_notes}=="277c38600"
    ATTR{crash_notes_size}=="368"
    ATTR{online}=="1"

    looking at parent device '/devices/system/cpu':
    KERNELS=="cpu"
    SUBSYSTEMS==""
    DRIVERS==""
    ATTRS{crash_hotplug}=="1"
    ATTRS{isolated}==""
    ATTRS{kernel_max}=="8191"
    ATTRS{nohz_full}==" (null)"
    ATTRS{offline}=="4-7"
    ATTRS{online}=="0-3"
    ATTRS{possible}=="0-7"
    ATTRS{present}=="0-3"

    With these sysfs attributes in place, it is possible to efficiently
    instruct the udev rule to skip crash kernel reloading.

    For example, the following is the proposed udev rule change for RHEL
    system 98-kexec.rules (as the first lines of the rule file):

    # The kernel handles updates to crash elfcorehdr for cpu and memory changes
    SUBSYSTEM=="cpu", ATTRS{crash_hotplug}=="1", GOTO="kdump_reload_end"
    SUBSYSTEM=="memory", ATTRS{crash_hotplug}=="1", GOTO="kdump_reload_end"

    When examined in the context of 98-kexec.rules, the above change
    tests if crash_hotplug is set, and if so, it skips the userspace
    initiated unload-then-reload of the crash kernel.

    Cpu and memory checks are separated in accordance with
    CONFIG_HOTPLUG_CPU and CONFIG_MEMORY_HOTPLUG kernel config options.
    If an architecture supports, for example, memory hotplug but not
    CPU hotplug, then the /sys/devices/system/memory/crash_hotplug
    attribute file is present, but the /sys/devices/system/cpu/crash_hotplug
    attribute file will NOT be present. Thus the udev rule will skip
    userspace processing of memory hot un/plug events, but the udev
    rule will fail for CPU events, thus allowing userspace to process
    cpu hot un/plug events (ie the unload-then-reload of the kdump
    capture kernel).

    Signed-off-by: Eric DeVolder <eric.devolder@oracle.com>
    Acked-by: Baoquan He <bhe@redhat.com>
    ---
    .../admin-guide/mm/memory-hotplug.rst | 8 ++++++++
    Documentation/core-api/cpu_hotplug.rst | 18 ++++++++++++++++++
    drivers/base/cpu.c | 14 ++++++++++++++
    drivers/base/memory.c | 13 +++++++++++++
    include/linux/kexec.h | 8 ++++++++
    5 files changed, 61 insertions(+)

    diff --git a/Documentation/admin-guide/mm/memory-hotplug.rst b/Documentation/admin-guide/mm/memory-hotplug.rst
    index a3c9e8ad8fa0..15fd1751a63c 100644
    --- a/Documentation/admin-guide/mm/memory-hotplug.rst
    +++ b/Documentation/admin-guide/mm/memory-hotplug.rst
    @@ -293,6 +293,14 @@ The following files are currently defined:
    Availability depends on the CONFIG_ARCH_MEMORY_PROBE
    kernel configuration option.
    ``uevent`` read-write: generic udev file for device subsystems.
    +``crash_hotplug`` read-only: when changes to the system memory map
    + occur due to hot un/plug of memory, this file contains
    + '1' if the kernel updates the kdump capture kernel memory
    + map itself (via elfcorehdr), or '0' if userspace must update
    + the kdump capture kernel memory map.
    +
    + Availability depends on the CONFIG_MEMORY_HOTPLUG kernel
    + configuration option.
    ====================== =========================================================

    .. note::
    diff --git a/Documentation/core-api/cpu_hotplug.rst b/Documentation/core-api/cpu_hotplug.rst
    index f75778d37488..0c8dc3fe5f94 100644
    --- a/Documentation/core-api/cpu_hotplug.rst
    +++ b/Documentation/core-api/cpu_hotplug.rst
    @@ -750,6 +750,24 @@ will receive all events. A script like::

    can process the event further.

    +When changes to the CPUs in the system occur, the sysfs file
    +/sys/devices/system/cpu/crash_hotplug contains '1' if the kernel
    +updates the kdump capture kernel list of CPUs itself (via elfcorehdr),
    +or '0' if userspace must update the kdump capture kernel list of CPUs.
    +
    +The availability depends on the CONFIG_HOTPLUG_CPU kernel configuration
    +option.
    +
    +To skip userspace processing of CPU hot un/plug events for kdump
    +(ie the unload-then-reload to obtain a current list of CPUs), this sysfs
    +file can be used in a udev rule as follows:
    +
    + SUBSYSTEM=="cpu", ATTRS{crash_hotplug}=="1", GOTO="kdump_reload_end"
    +
    +For a cpu hot un/plug event, if the architecture supports kernel updates
    +of the elfcorehdr (which contains the list of CPUs), then the rule skips
    +the unload-then-reload of the kdump capture kernel.
    +
    Kernel Inline Documentations Reference
    ======================================

    diff --git a/drivers/base/cpu.c b/drivers/base/cpu.c
    index 4c98849577d4..fedbf87f9d13 100644
    --- a/drivers/base/cpu.c
    +++ b/drivers/base/cpu.c
    @@ -293,6 +293,17 @@ static ssize_t print_cpus_nohz_full(struct device *dev,
    static DEVICE_ATTR(nohz_full, 0444, print_cpus_nohz_full, NULL);
    #endif

    +#ifdef CONFIG_HOTPLUG_CPU
    +#include <linux/kexec.h>
    +static ssize_t crash_hotplug_show(struct device *dev,
    + struct device_attribute *attr,
    + char *buf)
    +{
    + return sprintf(buf, "%d\n", crash_hotplug_cpu_support());
    +}
    +static DEVICE_ATTR_ADMIN_RO(crash_hotplug);
    +#endif
    +
    static void cpu_device_release(struct device *dev)
    {
    /*
    @@ -469,6 +480,9 @@ static struct attribute *cpu_root_attrs[] = {
    #ifdef CONFIG_NO_HZ_FULL
    &dev_attr_nohz_full.attr,
    #endif
    +#ifdef CONFIG_HOTPLUG_CPU
    + &dev_attr_crash_hotplug.attr,
    +#endif
    #ifdef CONFIG_GENERIC_CPU_AUTOPROBE
    &dev_attr_modalias.attr,
    #endif
    diff --git a/drivers/base/memory.c b/drivers/base/memory.c
    index 9aa0da991cfb..226be3134ffe 100644
    --- a/drivers/base/memory.c
    +++ b/drivers/base/memory.c
    @@ -483,6 +483,16 @@ static ssize_t auto_online_blocks_store(struct device *dev,

    static DEVICE_ATTR_RW(auto_online_blocks);

    +#ifdef CONFIG_MEMORY_HOTPLUG
    +#include <linux/kexec.h>
    +static ssize_t crash_hotplug_show(struct device *dev,
    + struct device_attribute *attr, char *buf)
    +{
    + return sprintf(buf, "%d\n", crash_hotplug_memory_support());
    +}
    +static DEVICE_ATTR_RO(crash_hotplug);
    +#endif
    +
    /*
    * Some architectures will have custom drivers to do this, and
    * will not need to do it from userspace. The fake hot-add code
    @@ -881,6 +891,9 @@ static struct attribute *memory_root_attrs[] = {

    &dev_attr_block_size_bytes.attr,
    &dev_attr_auto_online_blocks.attr,
    +#ifdef CONFIG_MEMORY_HOTPLUG
    + &dev_attr_crash_hotplug.attr,
    +#endif
    NULL
    };

    diff --git a/include/linux/kexec.h b/include/linux/kexec.h
    index b4dbc21f9081..9bcb09dba41f 100644
    --- a/include/linux/kexec.h
    +++ b/include/linux/kexec.h
    @@ -539,6 +539,14 @@ static inline void arch_unmap_crash_pages(void *ptr)
    static inline void arch_crash_handle_hotplug_event(struct kimage *image) { }
    #endif

    +#ifndef crash_hotplug_cpu_support
    +static inline int crash_hotplug_cpu_support(void) { return 0; }
    +#endif
    +
    +#ifndef crash_hotplug_memory_support
    +static inline int crash_hotplug_memory_support(void) { return 0; }
    +#endif
    +
    #else /* !CONFIG_KEXEC_CORE */
    struct pt_regs;
    struct task_struct;
    --
    2.31.1
    \
     
     \ /
      Last update: 2022-11-16 22:48    [W:3.773 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site