>Hello Atsushi, > >On Thu, 30 Oct 2014 01:29:18 +0000 >Atsushi Kumagai <kumagai-atsushi at mxc.nes.nec.co.jp> wrote: > >[snip] > >> Now I don't plan to use is_iomem_phys_addr() for non s390x architectures, >> I prefer putting is_iomem_phys_addr() into arch/s390x.c as Baoquan >> commented before. >> >> Could you modify the patch ? or any questions ? > >I modified the patch and moved the is_iomem_phys_addr() function to >s390x.c. I did not add __pa() because currently I don't see the >need for it (?). OK, but I'll add a memorandum in case we export this code to other architectures like: int is_iomem_phys_addr_s390x(unsigned long addr) { + /* Implicit VtoP conversion will be performed for addr here. */ struct addr_check addr_check = {addr, 0}; >The updated patch below applies on top of our "Compile warnings on >archs without get_versiondep_info()" patch. Thanks for your work, I'll merge it into v1.5.8. Thanks, Atsushi Kumagai >Michael >--- >[PATCH] makedumpfile: Enable --mem-usage for s390x > >Replace is_vmalloc_addr() by is_phys_addr() and implement is_phys_addr() >on s390x using /proc/iommem parsing to enable the new makedumpfile >option "--mem-usage". > >Signed-off-by: Michael Holzheu <holzheu at linux.vnet.ibm.com> >--- > arch/s390x.c | 26 ++++++++++++++++++++++++++ > elf_info.c | 4 ++-- > makedumpfile.h | 20 +++++++++++++------- > 3 files changed, 41 insertions(+), 9 deletions(-) > >--- a/arch/s390x.c >+++ b/arch/s390x.c >@@ -308,4 +308,30 @@ vaddr_to_paddr_s390x(unsigned long vaddr > return paddr; > } > >+struct addr_check { >+ unsigned long addr; >+ int found; >+}; >+ >+static int phys_addr_callback(void *data, int nr, char *str, >+ unsigned long base, unsigned long length) >+{ >+ struct addr_check *addr_check = data; >+ unsigned long addr = addr_check->addr; >+ >+ if (addr >= base && addr < base + length) { >+ addr_check->found = 1; >+ return -1; >+ } >+ return 0; >+} >+ >+int is_iomem_phys_addr_s390x(unsigned long addr) >+{ >+ struct addr_check addr_check = {addr, 0}; >+ >+ iomem_for_each_line("System RAM\n", phys_addr_callback, &addr_check); >+ return addr_check.found; >+} >+ > #endif /* __s390x__ */ >--- a/elf_info.c >+++ b/elf_info.c >@@ -854,7 +854,7 @@ int get_kcore_dump_loads(void) > > for (i = 0; i < num_pt_loads; ++i) { > struct pt_load_segment *p = &pt_loads[i]; >- if (is_vmalloc_addr(p->virt_start)) >+ if (!is_phys_addr(p->virt_start)) > continue; > loads++; > } >@@ -874,7 +874,7 @@ int get_kcore_dump_loads(void) > > for (i = 0, j = 0; i < num_pt_loads; ++i) { > struct pt_load_segment *p = &pt_loads[i]; >- if (is_vmalloc_addr(p->virt_start)) >+ if (!is_phys_addr(p->virt_start)) > continue; > if (j >= loads) > return FALSE; >--- a/makedumpfile.h >+++ b/makedumpfile.h >@@ -767,7 +767,7 @@ unsigned long long vaddr_to_paddr_arm(un > #define get_machdep_info() get_machdep_info_arm() > #define get_versiondep_info() stub_true() > #define vaddr_to_paddr(X) vaddr_to_paddr_arm(X) >-#define is_vmalloc_addr(X) stub_true_ul(X) >+#define is_phys_addr(X) stub_true_ul(X) > #endif /* arm */ > > #ifdef __x86__ >@@ -778,7 +778,7 @@ unsigned long long vaddr_to_paddr_x86(un > #define get_machdep_info() get_machdep_info_x86() > #define get_versiondep_info() get_versiondep_info_x86() > #define vaddr_to_paddr(X) vaddr_to_paddr_x86(X) >-#define is_vmalloc_addr(X) stub_true_ul(X) >+#define is_phys_addr(X) stub_true_ul(X) > #endif /* x86 */ > > #ifdef __x86_64__ >@@ -791,7 +791,7 @@ unsigned long long vaddr_to_paddr_x86_64 > #define get_machdep_info() get_machdep_info_x86_64() > #define get_versiondep_info() get_versiondep_info_x86_64() > #define vaddr_to_paddr(X) vaddr_to_paddr_x86_64(X) >-#define is_vmalloc_addr(X) is_vmalloc_addr_x86_64(X) >+#define is_phys_addr(X) (!is_vmalloc_addr_x86_64(X)) > #endif /* x86_64 */ > > #ifdef __powerpc64__ /* powerpc64 */ >@@ -802,7 +802,7 @@ unsigned long long vaddr_to_paddr_ppc64( > #define get_machdep_info() get_machdep_info_ppc64() > #define get_versiondep_info() get_versiondep_info_ppc64() > #define vaddr_to_paddr(X) vaddr_to_paddr_ppc64(X) >-#define is_vmalloc_addr(X) stub_true_ul(X) >+#define is_phys_addr(X) stub_true_ul(X) > #endif /* powerpc64 */ > > #ifdef __powerpc32__ /* powerpc32 */ >@@ -812,17 +812,18 @@ unsigned long long vaddr_to_paddr_ppc(un > #define get_machdep_info() get_machdep_info_ppc() > #define get_versiondep_info() stub_true() > #define vaddr_to_paddr(X) vaddr_to_paddr_ppc(X) >-#define is_vmalloc_addr(X) stub_true_ul(X) >+#define is_phys_addr(X) stub_true_ul(X) > #endif /* powerpc32 */ > > #ifdef __s390x__ /* s390x */ > int get_machdep_info_s390x(void); > unsigned long long vaddr_to_paddr_s390x(unsigned long vaddr); >+int is_iomem_phys_addr_s390x(unsigned long addr); > #define get_phys_base() stub_true() > #define get_machdep_info() get_machdep_info_s390x() > #define get_versiondep_info() stub_true() > #define vaddr_to_paddr(X) vaddr_to_paddr_s390x(X) >-#define is_vmalloc_addr(X) stub_true_ul(X) >+#define is_phys_addr(X) is_iomem_phys_addr_s390x(X) > #endif /* s390x */ > > #ifdef __ia64__ /* ia64 */ >@@ -834,7 +835,7 @@ unsigned long long vaddr_to_paddr_ia64(u > #define get_versiondep_info() stub_true() > #define vaddr_to_paddr(X) vaddr_to_paddr_ia64(X) > #define VADDR_REGION(X) (((unsigned long)(X)) >> REGION_SHIFT) >-#define is_vmalloc_addr(X) stub_true_ul(X) >+#define is_phys_addr(X) stub_true_ul(X) > #endif /* ia64 */ > > typedef unsigned long long mdf_pfn_t; >@@ -1569,6 +1570,11 @@ int read_disk_dump_header(struct disk_du > int read_kdump_sub_header(struct kdump_sub_header *kh, char *filename); > void close_vmcoreinfo(void); > int close_files_for_creating_dumpfile(void); >+int iomem_for_each_line(char *match, int (*callback)(void *data, int nr, >+ char *str, >+ unsigned long base, >+ unsigned long length), >+ void *data); > > > /*