crash: forward memory_notify arg to arch crash hotplug handler
authorSourabh Jain <sourabhjain@linux.ibm.com>
Tue, 26 Mar 2024 05:54:08 +0000 (11:24 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Tue, 23 Apr 2024 04:59:01 +0000 (14:59 +1000)
In the event of memory hotplug or online/offline events, the crash
memory hotplug notifier `crash_memhp_notifier()` receives a
`memory_notify` object but doesn't forward that object to the
generic and architecture-specific crash hotplug handler.

The `memory_notify` object contains the starting PFN (Page Frame Number)
and the number of pages in the hot-removed memory. This information is
necessary for architectures like PowerPC to update/recreate the kdump
image, specifically `elfcorehdr`.

So update the function signature of `crash_handle_hotplug_event()` and
`arch_crash_handle_hotplug_event()` to accept the `memory_notify` object
as an argument from crash memory hotplug notifier.

Since no such object is available in the case of CPU hotplug event, the
crash CPU hotplug notifier `crash_cpuhp_online()` passes NULL to the
crash hotplug handler.

Signed-off-by: Sourabh Jain <sourabhjain@linux.ibm.com>
Acked-by: Baoquan He <bhe@redhat.com>
Acked-by: Hari Bathini <hbathini@linux.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://msgid.link/20240326055413.186534-2-sourabhjain@linux.ibm.com
arch/x86/include/asm/kexec.h
arch/x86/kernel/crash.c
include/linux/crash_core.h
kernel/crash_core.c

index 91ca9a9ee3a2b26a964254202c53ffb5ca544d3a..cb1320ebbc2353a2ae885b4519e8de3652c32226 100644 (file)
@@ -207,7 +207,7 @@ int arch_kimage_file_post_load_cleanup(struct kimage *image);
 extern void kdump_nmi_shootdown_cpus(void);
 
 #ifdef CONFIG_CRASH_HOTPLUG
-void arch_crash_handle_hotplug_event(struct kimage *image);
+void arch_crash_handle_hotplug_event(struct kimage *image, void *arg);
 #define arch_crash_handle_hotplug_event arch_crash_handle_hotplug_event
 
 #ifdef CONFIG_HOTPLUG_CPU
index e74d0c4286c14519728d6b62418ec627c8ef55db..2a682fe8635281b0e05b94049cdb50d783a7c6eb 100644 (file)
@@ -432,10 +432,12 @@ unsigned int arch_crash_get_elfcorehdr_size(void)
 /**
  * arch_crash_handle_hotplug_event() - Handle hotplug elfcorehdr changes
  * @image: a pointer to kexec_crash_image
+ * @arg: struct memory_notify handler for memory hotplug case and
+ *       NULL for CPU hotplug case.
  *
  * Prepare the new elfcorehdr and replace the existing elfcorehdr.
  */
-void arch_crash_handle_hotplug_event(struct kimage *image)
+void arch_crash_handle_hotplug_event(struct kimage *image, void *arg)
 {
        void *elfbuf = NULL, *old_elfcorehdr;
        unsigned long nr_mem_ranges;
index d33352c2e3865fdbd82c42ca9645d8898127c0cd..647e928efee8264c6856c2c0d3ea1517f943e1dc 100644 (file)
@@ -37,7 +37,7 @@ static inline void arch_kexec_unprotect_crashkres(void) { }
 
 
 #ifndef arch_crash_handle_hotplug_event
-static inline void arch_crash_handle_hotplug_event(struct kimage *image) { }
+static inline void arch_crash_handle_hotplug_event(struct kimage *image, void *arg) { }
 #endif
 
 int crash_check_update_elfcorehdr(void);
index 78b5dc7cee3ab761314a9328e1ac9ae7afc0fa95..70fa8111a9d6f664914332a53c04e5899aa85e1f 100644 (file)
@@ -534,7 +534,7 @@ int crash_check_update_elfcorehdr(void)
  * list of segments it checks (since the elfcorehdr changes and thus
  * would require an update to purgatory itself to update the digest).
  */
-static void crash_handle_hotplug_event(unsigned int hp_action, unsigned int cpu)
+static void crash_handle_hotplug_event(unsigned int hp_action, unsigned int cpu, void *arg)
 {
        struct kimage *image;
 
@@ -596,7 +596,7 @@ static void crash_handle_hotplug_event(unsigned int hp_action, unsigned int cpu)
        image->hp_action = hp_action;
 
        /* Now invoke arch-specific update handler */
-       arch_crash_handle_hotplug_event(image);
+       arch_crash_handle_hotplug_event(image, arg);
 
        /* No longer handling a hotplug event */
        image->hp_action = KEXEC_CRASH_HP_NONE;
@@ -612,17 +612,17 @@ out:
        crash_hotplug_unlock();
 }
 
-static int crash_memhp_notifier(struct notifier_block *nb, unsigned long val, void *v)
+static int crash_memhp_notifier(struct notifier_block *nb, unsigned long val, void *arg)
 {
        switch (val) {
        case MEM_ONLINE:
                crash_handle_hotplug_event(KEXEC_CRASH_HP_ADD_MEMORY,
-                       KEXEC_CRASH_HP_INVALID_CPU);
+                       KEXEC_CRASH_HP_INVALID_CPU, arg);
                break;
 
        case MEM_OFFLINE:
                crash_handle_hotplug_event(KEXEC_CRASH_HP_REMOVE_MEMORY,
-                       KEXEC_CRASH_HP_INVALID_CPU);
+                       KEXEC_CRASH_HP_INVALID_CPU, arg);
                break;
        }
        return NOTIFY_OK;
@@ -635,13 +635,13 @@ static struct notifier_block crash_memhp_nb = {
 
 static int crash_cpuhp_online(unsigned int cpu)
 {
-       crash_handle_hotplug_event(KEXEC_CRASH_HP_ADD_CPU, cpu);
+       crash_handle_hotplug_event(KEXEC_CRASH_HP_ADD_CPU, cpu, NULL);
        return 0;
 }
 
 static int crash_cpuhp_offline(unsigned int cpu)
 {
-       crash_handle_hotplug_event(KEXEC_CRASH_HP_REMOVE_CPU, cpu);
+       crash_handle_hotplug_event(KEXEC_CRASH_HP_REMOVE_CPU, cpu, NULL);
        return 0;
 }