[PATCH] makedumpfile: Enable --mem-usage for s390x

Atsushi Kumagai kumagai-atsushi at mxc.nes.nec.co.jp
Thu Oct 30 22:25:21 PDT 2014


>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);
>
>
> /*



More information about the kexec mailing list