Add "--mem-usage" support for s390x

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 09/26/14 at 10:10am, Michael Holzheu wrote:
> On Thu, 25 Sep 2014 17:44:12 +0800
> Baoquan He <bhe at redhat.com> wrote:
> 
> > On 09/24/14 at 05:19pm, Michael Holzheu wrote:
> > > On Tue, 23 Sep 2014 10:40:58 +0800
> > > Baoquan He <bhe at redhat.com> wrote:
> 
> [snip]
> 

> > > For s390x this is not so easy because vmalloc_start is dependent
> > > on the memory size of the system (see setup_memory_end()
> > > in arch/s390/kernel/setup.c). Unfortunately "info->max_mapnr"
> > > is not set at that time.
> > 
> > I am not aware of s390 arch and memory layout. But I can explain what
> > those versiondep_info are used for, hope they can help. In fact in
> > x86_64, page_offset is got for set_kcore_vmcoreinfo(), there the
> > vmcoreinfo_addr need be converted to kvaddr. Since vmcoreinfo_addr is a
> > physical addr, we can't use it directly. And
> > VMALLOC_START/VMEMMAP_START/MODULES_VADDR are all used to filter this
> > virtual addr space region since our vmcore only care about the physical
> > ram addr region.
> > 
> > If you need get these before they are used for s390 arch. If necessary
> > you can build a different code flow if you can achive the goal. All
> > these are all used to get dumpable load segments from kcore.
> 
> Isn't this a chicken-and-egg problem? In order to determine vmalloc start
> I have to be able to read memory. But in order to read memory I have
> to call get_kcore_dump_loads() first.
> 
> What about using /proc/iomem to find out if an address is a real address?

Well, that's good it works for s390. Anyway in get_kcore_dump_loads() it
just gets the physical ram region, and filter out the unwanted region,
so your method is good. In x86_64, the is_vmalloc_addr_x86_64 is not
only filtering the vmalloc, but vmmemmap and modules_vaadr region. For
simplicity it's only named as is_vmalloc_addr. So I think you can wrap
this implementation into arch/s390x.c and name it as is_vmalloc_addr_s390x
just for being consistent with the x86_64 implementation.

Besides I doubt only below changes will work for you. I didn't find where
you adapt the set_kcore_vmcoreinfo() to set the vmcoreinfo. Without
vmcoreinfo, makedumpfile doesn't work.


> 
> The following patch seems to work for me:
> ---
>  elf_info.c     |    4 ++--
>  makedumpfile.c |   26 ++++++++++++++++++++++++++
>  makedumpfile.h |    1 +
>  3 files changed, 29 insertions(+), 2 deletions(-)
> 
> --- 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_real_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_real_addr(p->virt_start))
>  			continue;
>  		if (j >= loads)
>  			return FALSE;
> --- a/makedumpfile.c
> +++ b/makedumpfile.c
> @@ -9227,6 +9227,32 @@ int is_crashkernel_mem_reserved(void)
>  	return !!crash_reserved_mem_nr;
>  }
>  
> +struct addr_check {
> +	unsigned long addr;
> +	int found;
> +};
> +
> +static int real_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_real_addr(unsigned long addr)
> +{
> +	struct addr_check addr_check = {addr, 0};
> +
> +	iomem_for_each_line("System RAM\n", real_addr_callback, &addr_check);
> +	return addr_check.found;
> +}
> +
>  static int get_page_offset(void)
>  {
>  	struct utsname utsname;
> --- a/makedumpfile.h
> +++ b/makedumpfile.h
> @@ -1567,6 +1567,7 @@ 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 is_real_addr(unsigned long addr);
>  
>  
>  /*
> 



[Index of Archives]     [LM Sensors]     [Linux Sound]     [ALSA Users]     [ALSA Devel]     [Linux Audio Users]     [Linux Media]     [Kernel]     [Gimp]     [Yosemite News]     [Linux Media]

  Powered by Linux