Re: [PATCH] KVM: arm64: Clarify explanation of STAGE2_PGTABLE_LEVELS

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

 



On Mon, Nov 05, 2018 at 03:00:34PM +0000, Suzuki K Poulose wrote:
> 
> 
> On 02/11/18 14:25, Christoffer Dall wrote:
> >On Fri, Nov 02, 2018 at 11:02:38AM +0000, Suzuki K Poulose wrote:
> >>Hi
> >>
> >>On 02/11/18 07:53, Christoffer Dall wrote:
> >>>In attempting to re-construct the logic for our stage 2 page table
> >>>layout I found the reaoning in the comment explaining how we calculate
> >>>the number of levels used for stage 2 page tables a bit backwards.
> >>>
> >>>This commit attempts to clarify the comment, to make it slightly easier
> >>>to read without having the Arm ARM open on the right page.
> >>>
> >>>While we're at it, fixup a typo in a comment that was recently changed.
> >>>
> >>>Signed-off-by: Christoffer Dall <christoffer.dall@xxxxxxx>
> >>>---
> >>>  arch/arm64/include/asm/stage2_pgtable.h | 17 ++++++++++-------
> >>>  virt/kvm/arm/mmu.c                      |  2 +-
> >>>  2 files changed, 11 insertions(+), 8 deletions(-)
> >>>
> >>>diff --git a/arch/arm64/include/asm/stage2_pgtable.h b/arch/arm64/include/asm/stage2_pgtable.h
> >>>index d352f6df8d2c..9c387320b28c 100644
> >>>--- a/arch/arm64/include/asm/stage2_pgtable.h
> >>>+++ b/arch/arm64/include/asm/stage2_pgtable.h
> >>>@@ -31,15 +31,18 @@
> >>>  /*
> >>>   * The hardware supports concatenation of up to 16 tables at stage2 entry level
> >>>- * and we use the feature whenever possible.
> >>>+ * and we use the feature whenever possible, which means we resolve 4 bits of
> >>
> >>s/we resolve 4 bits/we resolve 4 additional bits/ ?
> >>
> >
> >yes
> >
> >>>+ * address at the entry level.
> >>>   *
> >>>- * Now, the minimum number of bits resolved at any level is (PAGE_SHIFT - 3).
> >>>+ * This implies, the total number of page table levels required for
> >>>+ * IPA_SHIFT at stage2 expected by the hardware can be calculated using
> >>>+ * the same logic used for the (non-collapsable) stage1 page tables but for
> >>>+ * (IPA_SHIFT - 4).
> >>>+ *
> >>>+ * Note, the minimum number of bits resolved at any level is (PAGE_SHIFT - 3).
> >>
> >>May be we could improve it further by :
> >>
> >>s/resolved at any level/resolved at any *non-entry* level/
> >>
> >>as, we could resolve as small as 1 bit at the entry level.
> >>
> >>
> >
> >yes
> >
> >>>   * On arm64, the smallest PAGE_SIZE supported is 4k, which means
> >>>- *             (PAGE_SHIFT - 3) > 4 holds for all page sizes.
> >>>- * This implies, the total number of page table levels at stage2 expected
> >>>- * by the hardware is actually the number of levels required for (IPA_SHIFT - 4)
> >>>- * in normal translations(e.g, stage1), since we cannot have another level in
> >>>- * the range (IPA_SHIFT, IPA_SHIFT - 4).
> >>>+ *             (PAGE_SHIFT - 3) > 4 holds for all page sizes
> >>>+ * and therefore we will need a minimum of two levels for stage2 in all cases.
> >>
> >>I think the above statement is misleading. The minimum number of
> >>levels has nothing to do with the concatenation.
> >
> >Architecturally surely it does?  (The point of concatenation is to
> >reduce the minimal number of levels required.)
> >
> >Maybe you mean the minimum number of levels imposed by KVM here?
> >
> >>For e.g, we could
> >>still create a stage2 with 1 level (32bit IPA on 64K, 29bit + 3bit
> >>concatenated), going by the same rules above. The only reason why
> >>we limit the number of levels to 2, is to prevent splitting stage1 PMD
> >>huge mappings (which are quite common) at stage2.
> >>
> >
> >So I wasn't entirely clear what the comment was trying to say with the
> >"(PAGE_SHIFT - 3) > 4 holds for all page size" statement, so I though
> >that was there to show that we'll need a minimum of two levels, but
> >maybe that was written under the assumption of the limitations of
> >IPA_SHIFT (was KVM_PHYS_SIZE).
> 
> See below.
> 
> >
> >Since you wrote the original comment, and I couldn't correctly parse
> >that, and I apparently still didn't fully understand, can you suggest an
> >alternative wording?
> 
> I think trying to over explain the concept has created more confusion.
> The whole paragraph is trying to prove that we only need :
> 
> 	ARM64_HW_PGTABLE_LEVELS(IPA_SHIFT - 4)
> to map IPA_SHIFT bits at stage2 with maximum utilization of the
> concatenation at entry level.

Yes, I think that comes across more clearly in my rewording up to the
"Note, ...".

> 
> Right now the comment tries to establish it via the hard route, by
> proving that there cannot be an intermediate level in the range
> [IPA_SHIFT, IPA_SHIFT - 4]. Or in other words :
> 
> (ARM64_HW_PGTABLE_LEVELS(IPA_SHIFT - 4) + 1) >= 	
> 			ARM64_HW_PGTABLE_LEVELS(IPA_SHIFT)
> 
> I don't know if it is worth the explanation and then causing further
> confusion.

I think you're then actually trying to explain two things.

First, we can get the number of levels by using the stage 1 calculation
and adjust for concatenation by subtracting 4 from the number of bits we
need to translate.

Second, some further reasoning about *why* that is true.

It remains unclear to me exactly what your point about
    '(PAGE_SHIFT - 3) > 4'
is and how that supports the second point.  Also I'm not entirely sure
why we need that.

I was trying to preserve all the information you had in the original
comment (assuming it was important), but I honestly think that we only
need to explain the first part (because the confusing part of the code
is the reuse of a stage 1 macro and subtracting 4).

> 
> May be I could replace the confusing text with something like :
> 
> "A normal page table with ARM64_HW_PGTABLE_LEVELS(IPA_SHIFT - 4) levels
> is guaranteed to resolve minimum of (IPA_SHIFT - 4)bits (when the entry
> level is fully used, and more bits otherwise.). For an input address of
> size IPA_SHIFT bits, we could cover the remaining 4 bits using the same
> number of levels or using the concatenation if needed."
> 

I prefer my version above to explain this particular aspect :)

But this seems to exclude the stuff you originally had about
(PAGE_SHIFT - 3) > 4' ?


Thanks,

    Christoffer



[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux