[Crash-utility] [PATCH][v2] x86_64: vtop supports 1G huge pages

HAGIO KAZUHITO(萩尾 一仁) k-hagio-ab at nec.com
Mon Jun 15 14:18:43 UTC 2020


-----Original Message-----
> 在 2020年06月12日 00:00, crash-utility-request at redhat.com 写道:
> > Looks good to me, thank you Li RongQing.  Please wait for another ack.
> 
> The v2 looks good to me.
> 
> Acked-by: Lianbo Jiang <lijiang at redhat.com>
> 
> >
> > Acked-by: Kazuhito Hagio <k-hagio-ab at nec.com>
> >
> > If someone can comment or create a patch for Xen, please let us know.
> > I cannot test it, but I think we can integrate it with this patch if any.
> 
> Anyway, this is a draft patch, but not sure if the patch happens to work
> on the Xen. I don't have the Xen environment to confirm it.
> 
> If Xen engineers would like to verify the draft patch, that would be nice.

Thank you for your draft patch!
If there is no response to the Xen patch until tomorrow morning, I think
to apply only Li's patch separately for now.

And one more thing, as we discussed internally, we'd like to introduce a
title line to crash's commit log for --oneline readability and add helpful
information more if available.  On the other hand, I also would like to
maintain the crash changelog [0] and its format for searchability.

[0] https://crash-utility.github.io/crash.changelog.html

So, for Li's patch, I'll merge it with something like:

[commit log]
x86_64: Add support for 1GB huge pages to "vtop" command

Add support for 1GB huge page to "vtop" command on x86_64.  Without
this patch, the command with a user virtual address corresponding to
a 1GB huge page fails with the error message "vtop: seek error:
physical address: <address>  type: "page table"".

  crash> vtop 7f6e40000000
  VIRTUAL     PHYSICAL
  vtop: seek error: physical address: 3f53f000f000  type: "page table"

[crash.changelog]
         - Add support for 1GB huge page to "vtop" command on x86_64.  Without
           this patch, the command with a user virtual address corresponding to
           a 1GB huge page fails with the error message "vtop: seek error:
           physical address: <address>  type: "page table"".
           (lirongqing at baidu.com, chukaiping at foxmail.com)

If you have any problems, please let me know.

Thanks,
Kazu

> 
> Thanks.
> Lianbo
> 
> diff --git a/x86_64.c b/x86_64.c
> index fc05e8af5695..90361a7c39c8 100644
> --- a/x86_64.c
> +++ b/x86_64.c
> @@ -2087,6 +2087,7 @@ x86_64_uvtop_level4_xen_wpt(struct task_context *tc, ulong uvaddr, physaddr_t *p
>  {
>  	ulong pgd_pte;
>  	ulong pud_pte;
> +	ulong pseudo_pud_pte;
>  	ulong pmd_pte;
>  	ulong pseudo_pmd_pte;
>  	ulong pte;
> @@ -2110,6 +2111,38 @@ x86_64_uvtop_level4_xen_wpt(struct task_context *tc, ulong uvaddr, physaddr_t *p
>  	if (!(pud_pte & _PAGE_PRESENT))
>  		goto no_upage;
> 
> +	if (pud_pte & _PAGE_PSE) {
> +		if (verbose)
> +			fprintf(fp, "  PAGE: %lx  (1GB) [machine]\n",
> +				PAGEBASE(pud_pte) & PHYSICAL_PAGE_MASK);
> +
> +		pseudo_pud_pte = xen_m2p(PAGEBASE(pud_pte));
> +
> +		if (pseudo_pud_pte == XEN_MACHADDR_NOT_FOUND) {
> +			if (verbose)
> +				fprintf(fp, " PAGE: page not available\n");
> +			*paddr = PADDR_NOT_AVAILABLE;
> +			return FALSE;
> +		}
> +
> +		pseudo_pud_pte |= PAGEOFFSET(pud_pte);
> +
> +		if (verbose) {
> +			fprintf(fp, " PAGE: %s  (1GB)\n\n",
> +				mkstring(buf, VADDR_PRLEN, RJUST|LONG_HEX,
> +				MKSTR(PAGEBASE(pseudo_pud_pte) &
> +				PHYSICAL_PAGE_MASK)));
> +
> +			x86_64_translate_pte(pseudo_pud_pte, 0, 0);
> +		}
> +
> +		physpage = (PAGEBASE(pseudo_pud_pte) & PHYSICAL_PAGE_MASK) +
> +			(uvaddr & ~_1GB_PAGE_MASK);
> +
> +		*paddr = physpage;
> +		return TRUE;
> +	}
> +
>  	/*
>           *  pmd = pmd_offset(pud, address);
>  	 */
> @@ -2504,8 +2537,9 @@ no_kpage:
>  static int
>  x86_64_kvtop_xen_wpt(struct task_context *tc, ulong kvaddr, physaddr_t *paddr, int verbose)
>  {
> -        ulong *pgd;
> +	ulong *pgd;
>  	ulong pud_pte;
> +	ulong pseudo_pud_pte;
>  	ulong pmd_pte;
>  	ulong pseudo_pmd_pte;
>  	ulong pte;
> @@ -2524,6 +2558,36 @@ x86_64_kvtop_xen_wpt(struct task_context *tc, ulong kvaddr, physaddr_t *paddr, i
>  	if (!(pud_pte & _PAGE_PRESENT))
>  		goto no_kpage;
> 
> +	if (pud_pte & _PAGE_PSE) {
> +		if (verbose)
> +			fprintf(fp, "  PAGE: %lx  (1GB) [machine]\n",
> +				PAGEBASE(pud_pte) & PHYSICAL_PAGE_MASK);
> +
> +		pseudo_pud_pte = xen_m2p(PAGEBASE(pud_pte));
> +
> +		if (pseudo_pud_pte == XEN_MACHADDR_NOT_FOUND) {
> +			if (verbose)
> +				fprintf(fp, " PAGE: page not available\n");
> +			*paddr = PADDR_NOT_AVAILABLE;
> +			return FALSE;
> +		}
> +
> +		pseudo_pud_pte |= PAGEOFFSET(pud_pte);
> +		if (verbose) {
> +			fprintf(fp, " PAGE: %s  (1GB)\n\n",
> +				mkstring(buf, VADDR_PRLEN, RJUST|LONG_HEX,
> +				MKSTR(PAGEBASE(pseudo_pud_pte) &
> +				PHYSICAL_PAGE_MASK)));
> +
> +			x86_64_translate_pte(pseudo_pud_pte, 0, 0);
> +		}
> +		physpage = (PAGEBASE(pseudo_pud_pte) & PHYSICAL_PAGE_MASK) +
> +			(kvaddr & ~_1GB_PAGE_MASK);
> +
> +		*paddr = physpage;
> +		return TRUE;
> +	}
> +
>  	/*
>  	 *  pmd = pmd_offset(pgd, addr);
>  	 */





More information about the Crash-utility mailing list