Message ID | 156630266000.8896.13603358349585118846.stgit@hbathini.in.ibm.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Add FADump support on PowerNV platform | expand |
Context | Check | Description |
---|---|---|
snowpatch_ozlabs/apply_patch | success | Successfully applied on branch next (c9633332103e55bc73d80d07ead28b95a22a85a3) |
snowpatch_ozlabs/checkpatch | warning | total: 0 errors, 0 warnings, 1 checks, 349 lines checked |
Hari Bathini <hbathini@linux.ibm.com> writes: > Make way for refactoring platform specific FADump code by moving code > that could be referenced from multiple places to fadump-common.c file. > > Signed-off-by: Hari Bathini <hbathini@linux.ibm.com> > --- > arch/powerpc/kernel/Makefile | 2 > arch/powerpc/kernel/fadump-common.c | 140 ++++++++++++++++++++++++++++++++++ > arch/powerpc/kernel/fadump-common.h | 8 ++ > arch/powerpc/kernel/fadump.c | 146 ++--------------------------------- > 4 files changed, 158 insertions(+), 138 deletions(-) > create mode 100644 arch/powerpc/kernel/fadump-common.c I don't understand why we need fadump.c and fadump-common.c? They're both common/shared across pseries & powernv aren't they? By the end of the series we end up with 149 lines in fadump-common.c which seems like a waste of time. Just put it all in fadump.c. > diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile > index 56dfa7a..439d548 100644 > --- a/arch/powerpc/kernel/Makefile > +++ b/arch/powerpc/kernel/Makefile > @@ -78,7 +78,7 @@ obj-$(CONFIG_EEH) += eeh.o eeh_pe.o eeh_dev.o eeh_cache.o \ > eeh_driver.o eeh_event.o eeh_sysfs.o > obj-$(CONFIG_GENERIC_TBSYNC) += smp-tbsync.o > obj-$(CONFIG_CRASH_DUMP) += crash_dump.o > -obj-$(CONFIG_FA_DUMP) += fadump.o > +obj-$(CONFIG_FA_DUMP) += fadump.o fadump-common.o > ifdef CONFIG_PPC32 > obj-$(CONFIG_E500) += idle_e500.o > endif > diff --git a/arch/powerpc/kernel/fadump-common.c b/arch/powerpc/kernel/fadump-common.c > new file mode 100644 > index 0000000..7f39e4f > --- /dev/null > +++ b/arch/powerpc/kernel/fadump-common.c > @@ -0,0 +1,140 @@ > +// SPDX-License-Identifier: GPL-2.0-or-later > +/* > + * Firmware-Assisted Dump internal code. > + * > + * Copyright 2011, IBM Corporation > + * Author: Mahesh Salgaonkar <mahesh@linux.ibm.com> Can we not put emails in C files anymore please, they just bitrot, just the names is fine. > + * Copyright 2019, IBM Corp. > + * Author: Hari Bathini <hbathini@linux.ibm.com> These can just be: * Copyright 2011, Mahesh Salgaonkar, IBM Corporation. * Copyright 2019, Hari Bathini, IBM Corporation. > + */ > + > +#undef DEBUG Don't undef DEBUG please. > +#define pr_fmt(fmt) "fadump: " fmt > + > +#include <linux/memblock.h> > +#include <linux/elf.h> > +#include <linux/mm.h> > +#include <linux/crash_core.h> > + > +#include "fadump-common.h" > + > +void *fadump_cpu_notes_buf_alloc(unsigned long size) > +{ > + void *vaddr; > + struct page *page; > + unsigned long order, count, i; > + > + order = get_order(size); > + vaddr = (void *)__get_free_pages(GFP_KERNEL|__GFP_ZERO, order); > + if (!vaddr) > + return NULL; > + > + count = 1 << order; > + page = virt_to_page(vaddr); > + for (i = 0; i < count; i++) > + SetPageReserved(page + i); > + return vaddr; > +} I realise you're just moving this code, but why do we need all this hand rolled allocation stuff? cheers
On 03/09/19 4:39 PM, Michael Ellerman wrote: > Hari Bathini <hbathini@linux.ibm.com> writes: >> Make way for refactoring platform specific FADump code by moving code >> that could be referenced from multiple places to fadump-common.c file. >> >> Signed-off-by: Hari Bathini <hbathini@linux.ibm.com> >> --- >> arch/powerpc/kernel/Makefile | 2 >> arch/powerpc/kernel/fadump-common.c | 140 ++++++++++++++++++++++++++++++++++ >> arch/powerpc/kernel/fadump-common.h | 8 ++ >> arch/powerpc/kernel/fadump.c | 146 ++--------------------------------- >> 4 files changed, 158 insertions(+), 138 deletions(-) >> create mode 100644 arch/powerpc/kernel/fadump-common.c > > I don't understand why we need fadump.c and fadump-common.c? They're > both common/shared across pseries & powernv aren't they? The convention I tried to follow to have fadump-common.c shared between fadump.c, pseries & powernv code while pseries & powernv code take callback requests from fadump.c and use fadump-common.c (shared by both platforms), if necessary to fullfil those requests... > By the end of the series we end up with 149 lines in fadump-common.c > which seems like a waste of time. Just put it all in fadump.c. Yeah. Probably not worth a new C file. Will just have two separate headers. One for internal code and one for interfacing with other modules... [...] >> + * Copyright 2019, IBM Corp. >> + * Author: Hari Bathini <hbathini@linux.ibm.com> > > These can just be: > > * Copyright 2011, Mahesh Salgaonkar, IBM Corporation. > * Copyright 2019, Hari Bathini, IBM Corporation. > Sure. >> + */ >> + >> +#undef DEBUG > > Don't undef DEBUG please. > Sorry! Seeing such thing in most files, I thought this was the convention. Will drop this change in all the new files I added. >> +#define pr_fmt(fmt) "fadump: " fmt >> + >> +#include <linux/memblock.h> >> +#include <linux/elf.h> >> +#include <linux/mm.h> >> +#include <linux/crash_core.h> >> + >> +#include "fadump-common.h" >> + >> +void *fadump_cpu_notes_buf_alloc(unsigned long size) >> +{ >> + void *vaddr; >> + struct page *page; >> + unsigned long order, count, i; >> + >> + order = get_order(size); >> + vaddr = (void *)__get_free_pages(GFP_KERNEL|__GFP_ZERO, order); >> + if (!vaddr) >> + return NULL; >> + >> + count = 1 << order; >> + page = virt_to_page(vaddr); >> + for (i = 0; i < count; i++) >> + SetPageReserved(page + i); >> + return vaddr; >> +} > > I realise you're just moving this code, but why do we need all this hand > rolled allocation stuff? Yeah, I think alloc_pages_exact() may be better here. Mahesh, am I missing something? - Hari
On 9/3/19 9:35 PM, Hari Bathini wrote: > > > On 03/09/19 4:39 PM, Michael Ellerman wrote: >> Hari Bathini <hbathini@linux.ibm.com> writes: >>> Make way for refactoring platform specific FADump code by moving code >>> that could be referenced from multiple places to fadump-common.c file. >>> >>> Signed-off-by: Hari Bathini <hbathini@linux.ibm.com> >>> --- >>> arch/powerpc/kernel/Makefile | 2 >>> arch/powerpc/kernel/fadump-common.c | 140 ++++++++++++++++++++++++++++++++++ >>> arch/powerpc/kernel/fadump-common.h | 8 ++ >>> arch/powerpc/kernel/fadump.c | 146 ++--------------------------------- >>> 4 files changed, 158 insertions(+), 138 deletions(-) >>> create mode 100644 arch/powerpc/kernel/fadump-common.c >> >> I don't understand why we need fadump.c and fadump-common.c? They're >> both common/shared across pseries & powernv aren't they? > > The convention I tried to follow to have fadump-common.c shared between fadump.c, > pseries & powernv code while pseries & powernv code take callback requests from > fadump.c and use fadump-common.c (shared by both platforms), if necessary to fullfil > those requests... > >> By the end of the series we end up with 149 lines in fadump-common.c >> which seems like a waste of time. Just put it all in fadump.c. > > Yeah. Probably not worth a new C file. Will just have two separate headers. One for > internal code and one for interfacing with other modules... > > [...] > >>> + * Copyright 2019, IBM Corp. >>> + * Author: Hari Bathini <hbathini@linux.ibm.com> >> >> These can just be: >> >> * Copyright 2011, Mahesh Salgaonkar, IBM Corporation. >> * Copyright 2019, Hari Bathini, IBM Corporation. >> > > Sure. > >>> + */ >>> + >>> +#undef DEBUG >> >> Don't undef DEBUG please. >> > > Sorry! Seeing such thing in most files, I thought this was the convention. Will drop > this change in all the new files I added. > >>> +#define pr_fmt(fmt) "fadump: " fmt >>> + >>> +#include <linux/memblock.h> >>> +#include <linux/elf.h> >>> +#include <linux/mm.h> >>> +#include <linux/crash_core.h> >>> + >>> +#include "fadump-common.h" >>> + >>> +void *fadump_cpu_notes_buf_alloc(unsigned long size) >>> +{ >>> + void *vaddr; >>> + struct page *page; >>> + unsigned long order, count, i; >>> + >>> + order = get_order(size); >>> + vaddr = (void *)__get_free_pages(GFP_KERNEL|__GFP_ZERO, order); >>> + if (!vaddr) >>> + return NULL; >>> + >>> + count = 1 << order; >>> + page = virt_to_page(vaddr); >>> + for (i = 0; i < count; i++) >>> + SetPageReserved(page + i); >>> + return vaddr; >>> +} >> >> I realise you're just moving this code, but why do we need all this hand >> rolled allocation stuff? > > Yeah, I think alloc_pages_exact() may be better here. Mahesh, am I missing something? We hook up the physical address of this buffer to ELF core header as PT_NOTE section. Hence we don't want these pages to be moved around or reclaimed. Thanks, -Mahesh.
On 04/09/19 2:32 PM, Mahesh Jagannath Salgaonkar wrote: > On 9/3/19 9:35 PM, Hari Bathini wrote: >> >> >> On 03/09/19 4:39 PM, Michael Ellerman wrote: >>> Hari Bathini <hbathini@linux.ibm.com> writes: >>>> Make way for refactoring platform specific FADump code by moving code >>>> that could be referenced from multiple places to fadump-common.c file. >>>> >>>> Signed-off-by: Hari Bathini <hbathini@linux.ibm.com> >>>> --- >>>> arch/powerpc/kernel/Makefile | 2 >>>> arch/powerpc/kernel/fadump-common.c | 140 ++++++++++++++++++++++++++++++++++ >>>> arch/powerpc/kernel/fadump-common.h | 8 ++ >>>> arch/powerpc/kernel/fadump.c | 146 ++--------------------------------- >>>> 4 files changed, 158 insertions(+), 138 deletions(-) >>>> create mode 100644 arch/powerpc/kernel/fadump-common.c >>> >>> I don't understand why we need fadump.c and fadump-common.c? They're >>> both common/shared across pseries & powernv aren't they? >> >> The convention I tried to follow to have fadump-common.c shared between fadump.c, >> pseries & powernv code while pseries & powernv code take callback requests from >> fadump.c and use fadump-common.c (shared by both platforms), if necessary to fullfil >> those requests... >> >>> By the end of the series we end up with 149 lines in fadump-common.c >>> which seems like a waste of time. Just put it all in fadump.c. >> >> Yeah. Probably not worth a new C file. Will just have two separate headers. One for >> internal code and one for interfacing with other modules... >> >> [...] >> >>>> + * Copyright 2019, IBM Corp. >>>> + * Author: Hari Bathini <hbathini@linux.ibm.com> >>> >>> These can just be: >>> >>> * Copyright 2011, Mahesh Salgaonkar, IBM Corporation. >>> * Copyright 2019, Hari Bathini, IBM Corporation. >>> >> >> Sure. >> >>>> + */ >>>> + >>>> +#undef DEBUG >>> >>> Don't undef DEBUG please. >>> >> >> Sorry! Seeing such thing in most files, I thought this was the convention. Will drop >> this change in all the new files I added. >> >>>> +#define pr_fmt(fmt) "fadump: " fmt >>>> + >>>> +#include <linux/memblock.h> >>>> +#include <linux/elf.h> >>>> +#include <linux/mm.h> >>>> +#include <linux/crash_core.h> >>>> + >>>> +#include "fadump-common.h" >>>> + >>>> +void *fadump_cpu_notes_buf_alloc(unsigned long size) >>>> +{ >>>> + void *vaddr; >>>> + struct page *page; >>>> + unsigned long order, count, i; >>>> + >>>> + order = get_order(size); >>>> + vaddr = (void *)__get_free_pages(GFP_KERNEL|__GFP_ZERO, order); >>>> + if (!vaddr) >>>> + return NULL; >>>> + >>>> + count = 1 << order; >>>> + page = virt_to_page(vaddr); >>>> + for (i = 0; i < count; i++) >>>> + SetPageReserved(page + i); >>>> + return vaddr; >>>> +} >>> >>> I realise you're just moving this code, but why do we need all this hand >>> rolled allocation stuff? >> >> Yeah, I think alloc_pages_exact() may be better here. Mahesh, am I missing something? > > We hook up the physical address of this buffer to ELF core header as > PT_NOTE section. Hence we don't want these pages to be moved around or > reclaimed. alloc_pages_exact() + mark_page_reserved() should take care of that, I guess.. - Hari
diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile index 56dfa7a..439d548 100644 --- a/arch/powerpc/kernel/Makefile +++ b/arch/powerpc/kernel/Makefile @@ -78,7 +78,7 @@ obj-$(CONFIG_EEH) += eeh.o eeh_pe.o eeh_dev.o eeh_cache.o \ eeh_driver.o eeh_event.o eeh_sysfs.o obj-$(CONFIG_GENERIC_TBSYNC) += smp-tbsync.o obj-$(CONFIG_CRASH_DUMP) += crash_dump.o -obj-$(CONFIG_FA_DUMP) += fadump.o +obj-$(CONFIG_FA_DUMP) += fadump.o fadump-common.o ifdef CONFIG_PPC32 obj-$(CONFIG_E500) += idle_e500.o endif diff --git a/arch/powerpc/kernel/fadump-common.c b/arch/powerpc/kernel/fadump-common.c new file mode 100644 index 0000000..7f39e4f --- /dev/null +++ b/arch/powerpc/kernel/fadump-common.c @@ -0,0 +1,140 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Firmware-Assisted Dump internal code. + * + * Copyright 2011, IBM Corporation + * Author: Mahesh Salgaonkar <mahesh@linux.ibm.com> + * + * Copyright 2019, IBM Corp. + * Author: Hari Bathini <hbathini@linux.ibm.com> + */ + +#undef DEBUG +#define pr_fmt(fmt) "fadump: " fmt + +#include <linux/memblock.h> +#include <linux/elf.h> +#include <linux/mm.h> +#include <linux/crash_core.h> + +#include "fadump-common.h" + +void *fadump_cpu_notes_buf_alloc(unsigned long size) +{ + void *vaddr; + struct page *page; + unsigned long order, count, i; + + order = get_order(size); + vaddr = (void *)__get_free_pages(GFP_KERNEL|__GFP_ZERO, order); + if (!vaddr) + return NULL; + + count = 1 << order; + page = virt_to_page(vaddr); + for (i = 0; i < count; i++) + SetPageReserved(page + i); + return vaddr; +} + +void fadump_cpu_notes_buf_free(unsigned long vaddr, unsigned long size) +{ + struct page *page; + unsigned long order, count, i; + + order = get_order(size); + count = 1 << order; + page = virt_to_page(vaddr); + for (i = 0; i < count; i++) + ClearPageReserved(page + i); + __free_pages(page, order); +} + +u32 *fadump_regs_to_elf_notes(u32 *buf, struct pt_regs *regs) +{ + struct elf_prstatus prstatus; + + memset(&prstatus, 0, sizeof(prstatus)); + /* + * FIXME: How do i get PID? Do I really need it? + * prstatus.pr_pid = ???? + */ + elf_core_copy_kernel_regs(&prstatus.pr_reg, regs); + buf = append_elf_note(buf, CRASH_CORE_NOTE_NAME, NT_PRSTATUS, + &prstatus, sizeof(prstatus)); + return buf; +} + +void fadump_update_elfcore_header(struct fw_dump *fadump_conf, char *bufp) +{ + struct elfhdr *elf; + struct elf_phdr *phdr; + + elf = (struct elfhdr *)bufp; + bufp += sizeof(struct elfhdr); + + /* First note is a place holder for cpu notes info. */ + phdr = (struct elf_phdr *)bufp; + + if (phdr->p_type == PT_NOTE) { + phdr->p_paddr = fadump_conf->cpu_notes_buf; + phdr->p_offset = phdr->p_paddr; + phdr->p_memsz = fadump_conf->cpu_notes_buf_size; + phdr->p_filesz = phdr->p_memsz; + } +} + +/* + * Returns 1, if there are no holes in memory area between d_start to d_end, + * 0 otherwise. + */ +static int is_fadump_memory_area_contiguous(unsigned long d_start, + unsigned long d_end) +{ + struct memblock_region *reg; + unsigned long start, end; + int ret = 0; + + for_each_memblock(memory, reg) { + start = max_t(unsigned long, d_start, reg->base); + end = min_t(unsigned long, d_end, (reg->base + reg->size)); + if (d_start < end) { + /* Memory hole from d_start to start */ + if (start > d_start) + break; + + if (end == d_end) { + ret = 1; + break; + } + + d_start = end + 1; + } + } + + return ret; +} + +/* + * Returns 1, if there are no holes in boot memory area, + * 0 otherwise. + */ +int is_fadump_boot_mem_contiguous(struct fw_dump *fadump_conf) +{ + unsigned long d_start = RMA_START; + unsigned long d_end = RMA_START + fadump_conf->boot_memory_size; + + return is_fadump_memory_area_contiguous(d_start, d_end); +} + +/* + * Returns 1, if there are no holes in reserved memory area, + * 0 otherwise. + */ +int is_fadump_reserved_mem_contiguous(struct fw_dump *fadump_conf) +{ + unsigned long d_start = fadump_conf->reserve_dump_area_start; + unsigned long d_end = d_start + fadump_conf->reserve_dump_area_size; + + return is_fadump_memory_area_contiguous(d_start, d_end); +} diff --git a/arch/powerpc/kernel/fadump-common.h b/arch/powerpc/kernel/fadump-common.h index e0673b2..54328ef 100644 --- a/arch/powerpc/kernel/fadump-common.h +++ b/arch/powerpc/kernel/fadump-common.h @@ -86,4 +86,12 @@ struct fw_dump { unsigned long nocma:1; }; +/* Helper functions */ +void *fadump_cpu_notes_buf_alloc(unsigned long size); +void fadump_cpu_notes_buf_free(unsigned long vaddr, unsigned long size); +u32 *fadump_regs_to_elf_notes(u32 *buf, struct pt_regs *regs); +void fadump_update_elfcore_header(struct fw_dump *fadump_config, char *bufp); +int is_fadump_boot_mem_contiguous(struct fw_dump *fadump_conf); +int is_fadump_reserved_mem_contiguous(struct fw_dump *fadump_conf); + #endif /* __PPC64_FA_DUMP_INTERNAL_H__ */ diff --git a/arch/powerpc/kernel/fadump.c b/arch/powerpc/kernel/fadump.c index e8630bb..40e5e96 100644 --- a/arch/powerpc/kernel/fadump.c +++ b/arch/powerpc/kernel/fadump.c @@ -37,9 +37,6 @@ static struct fw_dump fw_dump; static struct fadump_mem_struct fdm; static const struct fadump_mem_struct *fdm_active; -#ifdef CONFIG_CMA -static struct cma *fadump_cma; -#endif static DEFINE_MUTEX(fadump_mutex); struct fad_crash_memory_ranges *crash_memory_ranges; @@ -48,6 +45,8 @@ int crash_mem_ranges; int max_crash_mem_ranges; #ifdef CONFIG_CMA +static struct cma *fadump_cma; + /* * fadump_cma_init() - Initialize CMA area from a fadump reserved memory * @@ -109,8 +108,8 @@ static int __init fadump_cma_init(void) { return 1; } #endif /* CONFIG_CMA */ /* Scan the Firmware Assisted dump configuration details. */ -int __init early_init_dt_scan_fw_dump(unsigned long node, - const char *uname, int depth, void *data) +int __init early_init_dt_scan_fw_dump(unsigned long node, const char *uname, + int depth, void *data) { const __be32 *sections; int i, num_sections; @@ -201,67 +200,6 @@ int is_fadump_active(void) return fw_dump.dump_active; } -/* - * Returns 1, if there are no holes in boot memory area, - * 0 otherwise. - */ -static int is_boot_memory_area_contiguous(void) -{ - struct memblock_region *reg; - unsigned long tstart, tend; - unsigned long start_pfn = PHYS_PFN(RMA_START); - unsigned long end_pfn = PHYS_PFN(RMA_START + fw_dump.boot_memory_size); - unsigned int ret = 0; - - for_each_memblock(memory, reg) { - tstart = max(start_pfn, memblock_region_memory_base_pfn(reg)); - tend = min(end_pfn, memblock_region_memory_end_pfn(reg)); - if (tstart < tend) { - /* Memory hole from start_pfn to tstart */ - if (tstart > start_pfn) - break; - - if (tend == end_pfn) { - ret = 1; - break; - } - - start_pfn = tend + 1; - } - } - - return ret; -} - -/* - * Returns true, if there are no holes in reserved memory area, - * false otherwise. - */ -static bool is_reserved_memory_area_contiguous(void) -{ - struct memblock_region *reg; - unsigned long start, end; - unsigned long d_start = fw_dump.reserve_dump_area_start; - unsigned long d_end = d_start + fw_dump.reserve_dump_area_size; - - for_each_memblock(memory, reg) { - start = max(d_start, (unsigned long)reg->base); - end = min(d_end, (unsigned long)(reg->base + reg->size)); - if (d_start < end) { - /* Memory hole from d_start to start */ - if (start > d_start) - break; - - if (end == d_end) - return true; - - d_start = end + 1; - } - } - - return false; -} - /* Print firmware assisted dump configurations for debugging purpose. */ static void fadump_show_config(void) { @@ -627,9 +565,9 @@ static int register_fw_dump(struct fadump_mem_struct *fdm) " dump. Hardware Error(%d).\n", rc); break; case -3: - if (!is_boot_memory_area_contiguous()) + if (!is_fadump_boot_mem_contiguous(&fw_dump)) pr_err("Can't have holes in boot memory area while registering fadump\n"); - else if (!is_reserved_memory_area_contiguous()) + else if (!is_fadump_reserved_mem_contiguous(&fw_dump)) pr_err("Can't have holes in reserved memory area while" " registering fadump\n"); @@ -759,72 +697,6 @@ fadump_read_registers(struct fadump_reg_entry *reg_entry, struct pt_regs *regs) return reg_entry; } -static u32 *fadump_regs_to_elf_notes(u32 *buf, struct pt_regs *regs) -{ - struct elf_prstatus prstatus; - - memset(&prstatus, 0, sizeof(prstatus)); - /* - * FIXME: How do i get PID? Do I really need it? - * prstatus.pr_pid = ???? - */ - elf_core_copy_kernel_regs(&prstatus.pr_reg, regs); - buf = append_elf_note(buf, CRASH_CORE_NOTE_NAME, NT_PRSTATUS, - &prstatus, sizeof(prstatus)); - return buf; -} - -static void fadump_update_elfcore_header(char *bufp) -{ - struct elfhdr *elf; - struct elf_phdr *phdr; - - elf = (struct elfhdr *)bufp; - bufp += sizeof(struct elfhdr); - - /* First note is a place holder for cpu notes info. */ - phdr = (struct elf_phdr *)bufp; - - if (phdr->p_type == PT_NOTE) { - phdr->p_paddr = fw_dump.cpu_notes_buf; - phdr->p_offset = phdr->p_paddr; - phdr->p_filesz = fw_dump.cpu_notes_buf_size; - phdr->p_memsz = fw_dump.cpu_notes_buf_size; - } - return; -} - -static void *fadump_cpu_notes_buf_alloc(unsigned long size) -{ - void *vaddr; - struct page *page; - unsigned long order, count, i; - - order = get_order(size); - vaddr = (void *)__get_free_pages(GFP_KERNEL|__GFP_ZERO, order); - if (!vaddr) - return NULL; - - count = 1 << order; - page = virt_to_page(vaddr); - for (i = 0; i < count; i++) - SetPageReserved(page + i); - return vaddr; -} - -static void fadump_cpu_notes_buf_free(unsigned long vaddr, unsigned long size) -{ - struct page *page; - unsigned long order, count, i; - - order = get_order(size); - count = 1 << order; - page = virt_to_page(vaddr); - for (i = 0; i < count; i++) - ClearPageReserved(page + i); - __free_pages(page, order); -} - /* * Read CPU state dump data and convert it into ELF notes. * The CPU dump starts with magic number "REGSAVE". NumCpusOffset should be @@ -914,9 +786,9 @@ static int __init fadump_build_cpu_notes(const struct fadump_mem_struct *fdm) final_note(note_buf); if (fdh) { - pr_debug("Updating elfcore header (%llx) with cpu notes\n", - fdh->elfcorehdr_addr); - fadump_update_elfcore_header((char *)__va(fdh->elfcorehdr_addr)); + addr = fdh->elfcorehdr_addr; + pr_debug("Updating elfcore header(%lx) with cpu notes\n", addr); + fadump_update_elfcore_header(&fw_dump, (char *)__va(addr)); } return 0;
Make way for refactoring platform specific FADump code by moving code that could be referenced from multiple places to fadump-common.c file. Signed-off-by: Hari Bathini <hbathini@linux.ibm.com> --- arch/powerpc/kernel/Makefile | 2 arch/powerpc/kernel/fadump-common.c | 140 ++++++++++++++++++++++++++++++++++ arch/powerpc/kernel/fadump-common.h | 8 ++ arch/powerpc/kernel/fadump.c | 146 ++--------------------------------- 4 files changed, 158 insertions(+), 138 deletions(-) create mode 100644 arch/powerpc/kernel/fadump-common.c