Re: [PATCH v2] x86_64: Make the conversion between 4level and 5level paging automatically

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

 



At 07/12/2018 09:08 PM, Dave Anderson wrote:


----- Original Message -----


At 07/12/2018 02:23 AM, Dave Anderson wrote:


----- Original Message -----


----- Original Message -----
Hi Dave,

At 07/11/2018 03:33 AM, Dave Anderson wrote:

The final phase of support would be making this work:

     static int
     x86_64_task_uses_5level(struct task_context *tc)
     {
             return FALSE;
     }

Have you had a chance to look at how that can be done?


I have no idea to check if 5level paging is used in User-space.

You gave me some methods, and I have try:

     -The MAP_FIXED flag
     -check if the contents of the page directory or p4d is 'flods'

It would be most helpful if you can compare two tasks, one with 5-level
and one without, and see if there's anything obviously different.
(I don't know what "flods" means)

Ah, sorry, you mean if the top-level page directory folds back into itself.

So yes, I wonder if it would be obvious enough by checking whether the
top-level pgd folds back into itself, and if so, 4-levels of page tables
are in use?  But if that were the case, it seems that the 5-level translation
code would work on both types of user-space tasks.  I just don't understand
how it's supposed to work.


OK, let me try to clarify if the the 5-level translation code would work
on both types of user-space tasks at first. ;-)


Hi Dave,

As we all know, the kernel with CONFIG_X86_5LEVEL=y can run both in the
4-level page table and 5-level page table. It's configured by:

  - no5lvl in cmdline
  - the machine supports 5-level paging
    - CPUID leaf 7 is supported
    - the leaf has the feature bit set

then, Kernel using the __pgtable_l5_enabled to record the last result.

In the Documentation/x86/x86_64/5level-paging.txt:

  ...
  To mitigate this, we are not going to allocate virtual address space
  above 47-bit by default.

  But userspace can ask for allocation from full address space by
  specifying hint address (with or without MAP_FIXED) above 47-bits.
  ...

IMO, the document only tell us that some user tasks can't using the
address above 47-bits, this doesn't effect the paging level.

So, I think we don't need to add check for user tasks, in other word,
All user tasks must using 5-level paging if __pgtable_l5_enabled = 1.
Correct?

BTW, I will try to ask Kirill about it and will cc you. OK? ;-)

Thank you so much for you kind explanation!

	dou.

Hi Dou,

That leads me to this question:  can you confirm that this crash patch
works with a kernel that is configured with CONFIG_X86_5LEVEL, but either:

   (1) the kernel was booted with "no5lvl", or
   (2) the host hardware does not have the X86_CR4_LA57 bit set


I tested the two cases with the following patch, 'vm -p' and 'kmem -v'
shows OK.

---------------------------8<------------------------------------------

Author: Dou Liyang <douly.fnst@xxxxxxxxxxxxxx>
Date:   Fri Jul 13 10:43:26 2018 +0800

    x86_64: Remove the unused x86_64_task_uses_5level()

diff --git a/x86_64.c b/x86_64.c
index b07d6f2..96f685b 100644
--- a/x86_64.c
+++ b/x86_64.c
@@ -24,7 +24,6 @@ static int x86_64_uvtop(struct task_context *, ulong, physaddr_t *, int); static int x86_64_uvtop_level4(struct task_context *, ulong, physaddr_t *, int); static int x86_64_uvtop_level4_xen_wpt(struct task_context *, ulong, physaddr_t *, int); static int x86_64_uvtop_level4_rhel4_xen_wpt(struct task_context *, ulong, physaddr_t *, int);
-static int x86_64_task_uses_5level(struct task_context *);
 static ulong x86_64_vmalloc_start(void);
 static int x86_64_is_task_addr(ulong);
 static int x86_64_verify_symbol(const char *, ulong, char);
@@ -341,6 +340,7 @@ x86_64_init(int when)
                        if (l5_enabled)
                                machdep->flags |= VM_5LEVEL;
                }
+
                if (machdep->flags & VM_5LEVEL) {
machdep->machspec->userspace_top = USERSPACE_TOP_5LEVEL; machdep->machspec->page_offset = PAGE_OFFSET_5LEVEL;
@@ -361,7 +361,6 @@ x86_64_init(int when)
machdep->uvtop = x86_64_uvtop_level4; /* 5-level is optional per-task */
                        machdep->kvbase = (ulong)PAGE_OFFSET;
                        machdep->identity_map_base = (ulong)PAGE_OFFSET;
-
                }

                /*
@@ -1915,7 +1914,7 @@ x86_64_uvtop_level4(struct task_context *tc, ulong uvaddr, physaddr_t *paddr, in
                goto no_upage;

        /* If the VM is in 5-level page table */
-       if (machdep->flags & VM_5LEVEL && x86_64_task_uses_5level(tc)) {
+       if (machdep->flags & VM_5LEVEL) {
                ulong p4d_pte;
                /*
                 *  p4d = p4d_offset(pgd, address);
@@ -1986,12 +1985,6 @@ no_upage:
        return FALSE;
 }

-static int
-x86_64_task_uses_5level(struct task_context *tc)
-{
-       return FALSE;
-}
-
 static int
x86_64_uvtop_level4_xen_wpt(struct task_context *tc, ulong uvaddr, physaddr_t *paddr, int verbose)
 {


Thanks,
   Dave







--
Crash-utility mailing list
Crash-utility@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/crash-utility



[Index of Archives]     [Fedora Development]     [Fedora Desktop]     [Fedora SELinux]     [Yosemite News]     [KDE Users]     [Fedora Tools]

 

Powered by Linux