Skip to content

Commit fcb55e2

Browse files
author
CKI KWF Bot
committed
Merge: Updates on kdump service on DLPAR operations
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-9/-/merge_requests/7531 Description: Updates on kdump service on DLPAR operations JIRA: https://issues.redhat.com/browse/RHEL-101851 Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=69078444 Tested: Verified Brew build test kernel RPMs Signed-off-by: Mamatha Inamdar <minamdar@redhat.com> Approved-by: Steve Best <sbest@redhat.com> Approved-by: Tony Camuso <tcamuso@redhat.com> Approved-by: CKI KWF Bot <cki-ci-bot+kwf-gitlab-com@redhat.com> Merged-by: CKI GitLab Kmaint Pipeline Bot <26919896-cki-kmaint-pipeline-bot@users.noreply.gitlab.com>
2 parents 2a95fe8 + 6213442 commit fcb55e2

File tree

9 files changed

+653
-305
lines changed

9 files changed

+653
-305
lines changed

arch/powerpc/Kconfig

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -600,6 +600,10 @@ config ARCH_SELECTS_CRASH_DUMP
600600
depends on CRASH_DUMP
601601
select RELOCATABLE if PPC64 || 44x || FSL_BOOKE
602602

603+
config ARCH_SUPPORTS_CRASH_HOTPLUG
604+
def_bool y
605+
depends on PPC64
606+
603607
config FA_DUMP
604608
bool "Firmware-assisted dump"
605609
depends on CRASH_DUMP && PPC64 && (PPC_RTAS || PPC_POWERNV)

arch/powerpc/include/asm/kexec.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,17 @@ static inline void crash_setup_regs(struct pt_regs *newregs,
135135
ppc_save_regs(newregs);
136136
}
137137

138+
#ifdef CONFIG_CRASH_HOTPLUG
139+
void arch_crash_handle_hotplug_event(struct kimage *image, void *arg);
140+
#define arch_crash_handle_hotplug_event arch_crash_handle_hotplug_event
141+
142+
int arch_crash_hotplug_support(struct kimage *image, unsigned long kexec_flags);
143+
#define arch_crash_hotplug_support arch_crash_hotplug_support
144+
145+
unsigned int arch_crash_get_elfcorehdr_size(void);
146+
#define crash_get_elfcorehdr_size arch_crash_get_elfcorehdr_size
147+
#endif /* CONFIG_CRASH_HOTPLUG */
148+
138149
extern int crashing_cpu;
139150
extern void crash_send_ipi(void (*crash_ipi_callback)(struct pt_regs *));
140151
extern void crash_ipi_callback(struct pt_regs *regs);
@@ -184,6 +195,10 @@ static inline void crash_send_ipi(void (*crash_ipi_callback)(struct pt_regs *))
184195

185196
#endif /* CONFIG_CRASH_DUMP */
186197

198+
#if defined(CONFIG_KEXEC_FILE) || defined(CONFIG_CRASH_DUMP)
199+
int update_cpus_node(void *fdt);
200+
#endif
201+
187202
#ifdef CONFIG_PPC_BOOK3S_64
188203
#include <asm/book3s/64/kexec.h>
189204
#endif

arch/powerpc/include/asm/kexec_ranges.h

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,9 @@
77
void sort_memory_ranges(struct crash_mem *mrngs, bool merge);
88
struct crash_mem *realloc_mem_ranges(struct crash_mem **mem_ranges);
99
int add_mem_range(struct crash_mem **mem_ranges, u64 base, u64 size);
10-
int add_tce_mem_ranges(struct crash_mem **mem_ranges);
11-
int add_initrd_mem_range(struct crash_mem **mem_ranges);
12-
#ifdef CONFIG_PPC_64S_HASH_MMU
13-
int add_htab_mem_range(struct crash_mem **mem_ranges);
14-
#else
15-
static inline int add_htab_mem_range(struct crash_mem **mem_ranges)
16-
{
17-
return 0;
18-
}
19-
#endif
20-
int add_kernel_mem_range(struct crash_mem **mem_ranges);
21-
int add_rtas_mem_range(struct crash_mem **mem_ranges);
22-
int add_opal_mem_range(struct crash_mem **mem_ranges);
23-
int add_reserved_mem_ranges(struct crash_mem **mem_ranges);
24-
10+
int remove_mem_range(struct crash_mem **mem_ranges, u64 base, u64 size);
11+
int get_exclude_memory_ranges(struct crash_mem **mem_ranges);
12+
int get_reserved_memory_ranges(struct crash_mem **mem_ranges);
13+
int get_crash_memory_ranges(struct crash_mem **mem_ranges);
14+
int get_usable_memory_ranges(struct crash_mem **mem_ranges);
2515
#endif /* _ASM_POWERPC_KEXEC_RANGES_H */

arch/powerpc/kexec/Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
# Makefile for the linux kernel.
44
#
55

6-
obj-y += core.o core_$(BITS).o
6+
obj-y += core.o core_$(BITS).o ranges.o
77

88
obj-$(CONFIG_PPC32) += relocate_32.o
99

10-
obj-$(CONFIG_KEXEC_FILE) += file_load.o ranges.o file_load_$(BITS).o elf_$(BITS).o
10+
obj-$(CONFIG_KEXEC_FILE) += file_load.o file_load_$(BITS).o elf_$(BITS).o
1111
obj-$(CONFIG_VMCORE_INFO) += vmcore_info.o
1212
obj-$(CONFIG_CRASH_DUMP) += crash.o
1313

arch/powerpc/kexec/core_64.c

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include <linux/cpu.h>
1818
#include <linux/hardirq.h>
1919
#include <linux/of.h>
20+
#include <linux/libfdt.h>
2021

2122
#include <asm/page.h>
2223
#include <asm/current.h>
@@ -32,6 +33,7 @@
3233
#include <asm/asm-prototypes.h>
3334
#include <asm/svm.h>
3435
#include <asm/ultravisor.h>
36+
#include <asm/crashdump-ppc64.h>
3537

3638
int machine_kexec_prepare(struct kimage *image)
3739
{
@@ -430,3 +432,92 @@ static int __init export_htab_values(void)
430432
}
431433
late_initcall(export_htab_values);
432434
#endif /* CONFIG_PPC_64S_HASH_MMU */
435+
436+
#if defined(CONFIG_KEXEC_FILE) || defined(CONFIG_CRASH_DUMP)
437+
/**
438+
* add_node_props - Reads node properties from device node structure and add
439+
* them to fdt.
440+
* @fdt: Flattened device tree of the kernel
441+
* @node_offset: offset of the node to add a property at
442+
* @dn: device node pointer
443+
*
444+
* Returns 0 on success, negative errno on error.
445+
*/
446+
static int add_node_props(void *fdt, int node_offset, const struct device_node *dn)
447+
{
448+
int ret = 0;
449+
struct property *pp;
450+
451+
if (!dn)
452+
return -EINVAL;
453+
454+
for_each_property_of_node(dn, pp) {
455+
ret = fdt_setprop(fdt, node_offset, pp->name, pp->value, pp->length);
456+
if (ret < 0) {
457+
pr_err("Unable to add %s property: %s\n", pp->name, fdt_strerror(ret));
458+
return ret;
459+
}
460+
}
461+
return ret;
462+
}
463+
464+
/**
465+
* update_cpus_node - Update cpus node of flattened device tree using of_root
466+
* device node.
467+
* @fdt: Flattened device tree of the kernel.
468+
*
469+
* Returns 0 on success, negative errno on error.
470+
*/
471+
int update_cpus_node(void *fdt)
472+
{
473+
struct device_node *cpus_node, *dn;
474+
int cpus_offset, cpus_subnode_offset, ret = 0;
475+
476+
cpus_offset = fdt_path_offset(fdt, "/cpus");
477+
if (cpus_offset < 0 && cpus_offset != -FDT_ERR_NOTFOUND) {
478+
pr_err("Malformed device tree: error reading /cpus node: %s\n",
479+
fdt_strerror(cpus_offset));
480+
return cpus_offset;
481+
}
482+
483+
if (cpus_offset > 0) {
484+
ret = fdt_del_node(fdt, cpus_offset);
485+
if (ret < 0) {
486+
pr_err("Error deleting /cpus node: %s\n", fdt_strerror(ret));
487+
return -EINVAL;
488+
}
489+
}
490+
491+
/* Add cpus node to fdt */
492+
cpus_offset = fdt_add_subnode(fdt, fdt_path_offset(fdt, "/"), "cpus");
493+
if (cpus_offset < 0) {
494+
pr_err("Error creating /cpus node: %s\n", fdt_strerror(cpus_offset));
495+
return -EINVAL;
496+
}
497+
498+
/* Add cpus node properties */
499+
cpus_node = of_find_node_by_path("/cpus");
500+
ret = add_node_props(fdt, cpus_offset, cpus_node);
501+
of_node_put(cpus_node);
502+
if (ret < 0)
503+
return ret;
504+
505+
/* Loop through all subnodes of cpus and add them to fdt */
506+
for_each_node_by_type(dn, "cpu") {
507+
cpus_subnode_offset = fdt_add_subnode(fdt, cpus_offset, dn->full_name);
508+
if (cpus_subnode_offset < 0) {
509+
pr_err("Unable to add %s subnode: %s\n", dn->full_name,
510+
fdt_strerror(cpus_subnode_offset));
511+
ret = cpus_subnode_offset;
512+
goto out;
513+
}
514+
515+
ret = add_node_props(fdt, cpus_subnode_offset, dn);
516+
if (ret < 0)
517+
goto out;
518+
}
519+
out:
520+
of_node_put(dn);
521+
return ret;
522+
}
523+
#endif /* CONFIG_KEXEC_FILE || CONFIG_CRASH_DUMP */

0 commit comments

Comments
 (0)