All the mail mirrored from lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v1 0/2] KVM: selftests: Fixes for broken tests
@ 2023-02-28 17:07 Ryan Roberts
  2023-02-28 17:07 ` [PATCH v1 1/2] KVM: selftests: Fixup config fragment for access_tracking_perf_test Ryan Roberts
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Ryan Roberts @ 2023-02-28 17:07 UTC (permalink / raw
  To: Marc Zyngier, Oliver Upton
  Cc: Ryan Roberts, Paolo Bonzini, Shuah Khan, linux-kselftest, kvmarm

During the course of implementing FEAT_LPA2 within the arm64 KVM port, I found a
couple of issues within the KVM selftest code, which I thought were worth
posting independently. The LPA2 patches, for which I will post v2 in the next
few days, depend on these fixes for its testing.

Ryan Roberts (2):
  KVM: selftests: Fixup config fragment for access_tracking_perf_test
  KVM: selftests: arm64: Fix pte encode/decode for PA bits > 48

 tools/testing/selftests/kvm/config            |  1 +
 .../selftests/kvm/lib/aarch64/processor.c     | 32 ++++++++++++++-----
 2 files changed, 25 insertions(+), 8 deletions(-)

--
2.25.1


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v1 1/2] KVM: selftests: Fixup config fragment for access_tracking_perf_test
  2023-02-28 17:07 [PATCH v1 0/2] KVM: selftests: Fixes for broken tests Ryan Roberts
@ 2023-02-28 17:07 ` Ryan Roberts
  2023-02-28 17:07 ` [PATCH v1 2/2] KVM: selftests: arm64: Fix pte encode/decode for PA bits > 48 Ryan Roberts
  2023-03-02 15:27 ` [PATCH v1 0/2] KVM: selftests: Fixes for broken tests Ryan Roberts
  2 siblings, 0 replies; 6+ messages in thread
From: Ryan Roberts @ 2023-02-28 17:07 UTC (permalink / raw
  To: Marc Zyngier, Oliver Upton
  Cc: Ryan Roberts, Paolo Bonzini, Shuah Khan, linux-kselftest, kvmarm

access_tracking_perf_test requires CONFIG_IDLE_PAGE_TRACKING. However
this is missing from the config fragment, so add it in so that this test
is no longer skipped.

Signed-off-by: Ryan Roberts <ryan.roberts@arm.com>
---
 tools/testing/selftests/kvm/config | 1 +
 1 file changed, 1 insertion(+)

diff --git a/tools/testing/selftests/kvm/config b/tools/testing/selftests/kvm/config
index d011b38e259e..8835fed09e9f 100644
--- a/tools/testing/selftests/kvm/config
+++ b/tools/testing/selftests/kvm/config
@@ -2,3 +2,4 @@ CONFIG_KVM=y
 CONFIG_KVM_INTEL=y
 CONFIG_KVM_AMD=y
 CONFIG_USERFAULTFD=y
+CONFIG_IDLE_PAGE_TRACKING=y
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH v1 2/2] KVM: selftests: arm64: Fix pte encode/decode for PA bits > 48
  2023-02-28 17:07 [PATCH v1 0/2] KVM: selftests: Fixes for broken tests Ryan Roberts
  2023-02-28 17:07 ` [PATCH v1 1/2] KVM: selftests: Fixup config fragment for access_tracking_perf_test Ryan Roberts
@ 2023-02-28 17:07 ` Ryan Roberts
  2023-03-07 17:44   ` Oliver Upton
  2023-03-02 15:27 ` [PATCH v1 0/2] KVM: selftests: Fixes for broken tests Ryan Roberts
  2 siblings, 1 reply; 6+ messages in thread
From: Ryan Roberts @ 2023-02-28 17:07 UTC (permalink / raw
  To: Marc Zyngier, Oliver Upton
  Cc: Ryan Roberts, Paolo Bonzini, Shuah Khan, linux-kselftest, kvmarm

The high bits [51:48] of a physical address should appear at [15:12] in
a 64K pte, not at [51:48] as was previously being programmed. Fix this
with new helper functions that do the conversion correctly. This also
sets us up nicely for adding LPA2 encodings in future.

Fixes: 7a6629ef746d ("kvm: selftests: add virt mem support for aarch64")

Signed-off-by: Ryan Roberts <ryan.roberts@arm.com>
---
 .../selftests/kvm/lib/aarch64/processor.c     | 32 ++++++++++++++-----
 1 file changed, 24 insertions(+), 8 deletions(-)

diff --git a/tools/testing/selftests/kvm/lib/aarch64/processor.c b/tools/testing/selftests/kvm/lib/aarch64/processor.c
index 5972a23b2765..13f28d96521c 100644
--- a/tools/testing/selftests/kvm/lib/aarch64/processor.c
+++ b/tools/testing/selftests/kvm/lib/aarch64/processor.c
@@ -58,10 +58,27 @@ static uint64_t pte_index(struct kvm_vm *vm, vm_vaddr_t gva)
 	return (gva >> vm->page_shift) & mask;
 }
 
-static uint64_t pte_addr(struct kvm_vm *vm, uint64_t entry)
+static uint64_t addr_pte(struct kvm_vm *vm, uint64_t pa, uint64_t attrs)
 {
-	uint64_t mask = ((1UL << (vm->va_bits - vm->page_shift)) - 1) << vm->page_shift;
-	return entry & mask;
+	uint64_t pte;
+
+	pte = pa & GENMASK(47, vm->page_shift);
+	if (vm->page_shift == 16)
+		pte |= (pa & GENMASK(51, 48)) >> (48 - 12);
+	pte |= attrs;
+
+	return pte;
+}
+
+static uint64_t pte_addr(struct kvm_vm *vm, uint64_t pte)
+{
+	uint64_t pa;
+
+	pa = pte & GENMASK(47, vm->page_shift);
+	if (vm->page_shift == 16)
+		pa |= (pte & GENMASK(15, 12)) << (48 - 12);
+
+	return pa;
 }
 
 static uint64_t ptrs_per_pgd(struct kvm_vm *vm)
@@ -110,18 +127,18 @@ static void _virt_pg_map(struct kvm_vm *vm, uint64_t vaddr, uint64_t paddr,
 
 	ptep = addr_gpa2hva(vm, vm->pgd) + pgd_index(vm, vaddr) * 8;
 	if (!*ptep)
-		*ptep = vm_alloc_page_table(vm) | 3;
+		*ptep = addr_pte(vm, vm_alloc_page_table(vm), 3);
 
 	switch (vm->pgtable_levels) {
 	case 4:
 		ptep = addr_gpa2hva(vm, pte_addr(vm, *ptep)) + pud_index(vm, vaddr) * 8;
 		if (!*ptep)
-			*ptep = vm_alloc_page_table(vm) | 3;
+			*ptep = addr_pte(vm, vm_alloc_page_table(vm), 3);
 		/* fall through */
 	case 3:
 		ptep = addr_gpa2hva(vm, pte_addr(vm, *ptep)) + pmd_index(vm, vaddr) * 8;
 		if (!*ptep)
-			*ptep = vm_alloc_page_table(vm) | 3;
+			*ptep = addr_pte(vm, vm_alloc_page_table(vm), 3);
 		/* fall through */
 	case 2:
 		ptep = addr_gpa2hva(vm, pte_addr(vm, *ptep)) + pte_index(vm, vaddr) * 8;
@@ -130,8 +147,7 @@ static void _virt_pg_map(struct kvm_vm *vm, uint64_t vaddr, uint64_t paddr,
 		TEST_FAIL("Page table levels must be 2, 3, or 4");
 	}
 
-	*ptep = paddr | 3;
-	*ptep |= (attr_idx << 2) | (1 << 10) /* Access Flag */;
+	*ptep = addr_pte(vm, paddr, (attr_idx << 2) | (1 << 10) | 3);  /* AF */
 }
 
 void virt_arch_pg_map(struct kvm_vm *vm, uint64_t vaddr, uint64_t paddr)
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH v1 0/2] KVM: selftests: Fixes for broken tests
  2023-02-28 17:07 [PATCH v1 0/2] KVM: selftests: Fixes for broken tests Ryan Roberts
  2023-02-28 17:07 ` [PATCH v1 1/2] KVM: selftests: Fixup config fragment for access_tracking_perf_test Ryan Roberts
  2023-02-28 17:07 ` [PATCH v1 2/2] KVM: selftests: arm64: Fix pte encode/decode for PA bits > 48 Ryan Roberts
@ 2023-03-02 15:27 ` Ryan Roberts
  2 siblings, 0 replies; 6+ messages in thread
From: Ryan Roberts @ 2023-03-02 15:27 UTC (permalink / raw
  To: Marc Zyngier, Oliver Upton
  Cc: Paolo Bonzini, Shuah Khan, linux-kselftest, kvmarm

On 28/02/2023 17:07, Ryan Roberts wrote:
> During the course of implementing FEAT_LPA2 within the arm64 KVM port, I found a
> couple of issues within the KVM selftest code, which I thought were worth
> posting independently. The LPA2 patches, for which I will post v2 in the next
> few days, depend on these fixes for its testing.

It turned out that there was another issue, for which I have posted a fix at
https://lore.kernel.org/kvmarm/20230302152033.242073-1-ryan.roberts@arm.com/

With these 3 fixes, I see a clean run of the kvm selftests with the 64K kernel +
FEAT_LPA on FVP.

Thanks,
Ryan


> 
> Ryan Roberts (2):
>   KVM: selftests: Fixup config fragment for access_tracking_perf_test
>   KVM: selftests: arm64: Fix pte encode/decode for PA bits > 48
> 
>  tools/testing/selftests/kvm/config            |  1 +
>  .../selftests/kvm/lib/aarch64/processor.c     | 32 ++++++++++++++-----
>  2 files changed, 25 insertions(+), 8 deletions(-)
> 
> --
> 2.25.1
> 


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v1 2/2] KVM: selftests: arm64: Fix pte encode/decode for PA bits > 48
  2023-02-28 17:07 ` [PATCH v1 2/2] KVM: selftests: arm64: Fix pte encode/decode for PA bits > 48 Ryan Roberts
@ 2023-03-07 17:44   ` Oliver Upton
  2023-03-08 11:18     ` Ryan Roberts
  0 siblings, 1 reply; 6+ messages in thread
From: Oliver Upton @ 2023-03-07 17:44 UTC (permalink / raw
  To: Ryan Roberts
  Cc: Marc Zyngier, Paolo Bonzini, Shuah Khan, linux-kselftest, kvmarm

Hi Ryan,

Thanks for fixing this. Couple of nits:

On Tue, Feb 28, 2023 at 05:07:56PM +0000, Ryan Roberts wrote:
> The high bits [51:48] of a physical address should appear at [15:12] in
> a 64K pte, not at [51:48] as was previously being programmed. Fix this
> with new helper functions that do the conversion correctly. This also
> sets us up nicely for adding LPA2 encodings in future.
> 
> Fixes: 7a6629ef746d ("kvm: selftests: add virt mem support for aarch64")
> 
> Signed-off-by: Ryan Roberts <ryan.roberts@arm.com>

nit: no whitespace between footers.

> ---
>  .../selftests/kvm/lib/aarch64/processor.c     | 32 ++++++++++++++-----
>  1 file changed, 24 insertions(+), 8 deletions(-)
> 
> diff --git a/tools/testing/selftests/kvm/lib/aarch64/processor.c b/tools/testing/selftests/kvm/lib/aarch64/processor.c
> index 5972a23b2765..13f28d96521c 100644
> --- a/tools/testing/selftests/kvm/lib/aarch64/processor.c
> +++ b/tools/testing/selftests/kvm/lib/aarch64/processor.c
> @@ -58,10 +58,27 @@ static uint64_t pte_index(struct kvm_vm *vm, vm_vaddr_t gva)
>  	return (gva >> vm->page_shift) & mask;
>  }
>  
> -static uint64_t pte_addr(struct kvm_vm *vm, uint64_t entry)
> +static uint64_t addr_pte(struct kvm_vm *vm, uint64_t pa, uint64_t attrs)
>  {
> -	uint64_t mask = ((1UL << (vm->va_bits - vm->page_shift)) - 1) << vm->page_shift;
> -	return entry & mask;
> +	uint64_t pte;
> +
> +	pte = pa & GENMASK(47, vm->page_shift);
> +	if (vm->page_shift == 16)
> +		pte |= (pa & GENMASK(51, 48)) >> (48 - 12);

nit: this is a bit of an odd transformation, of course courtesy of the
architecture. FIELD_GET() might make it a bit more readable:

		pte |= FIELD_GET(GENMASK(51, 48), pa) << 12;

-- 
Thanks,
Oliver

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v1 2/2] KVM: selftests: arm64: Fix pte encode/decode for PA bits > 48
  2023-03-07 17:44   ` Oliver Upton
@ 2023-03-08 11:18     ` Ryan Roberts
  0 siblings, 0 replies; 6+ messages in thread
From: Ryan Roberts @ 2023-03-08 11:18 UTC (permalink / raw
  To: Oliver Upton
  Cc: Marc Zyngier, Paolo Bonzini, Shuah Khan, linux-kselftest, kvmarm

On 07/03/2023 17:44, Oliver Upton wrote:
> Hi Ryan,
> 
> Thanks for fixing this. Couple of nits:
> 
> On Tue, Feb 28, 2023 at 05:07:56PM +0000, Ryan Roberts wrote:
>> The high bits [51:48] of a physical address should appear at [15:12] in
>> a 64K pte, not at [51:48] as was previously being programmed. Fix this
>> with new helper functions that do the conversion correctly. This also
>> sets us up nicely for adding LPA2 encodings in future.
>>
>> Fixes: 7a6629ef746d ("kvm: selftests: add virt mem support for aarch64")
>>
>> Signed-off-by: Ryan Roberts <ryan.roberts@arm.com>
> 
> nit: no whitespace between footers.

Sorry my bad; I'm slowly learning the conventions - I'll get there eventually!

> 
>> ---
>>  .../selftests/kvm/lib/aarch64/processor.c     | 32 ++++++++++++++-----
>>  1 file changed, 24 insertions(+), 8 deletions(-)
>>
>> diff --git a/tools/testing/selftests/kvm/lib/aarch64/processor.c b/tools/testing/selftests/kvm/lib/aarch64/processor.c
>> index 5972a23b2765..13f28d96521c 100644
>> --- a/tools/testing/selftests/kvm/lib/aarch64/processor.c
>> +++ b/tools/testing/selftests/kvm/lib/aarch64/processor.c
>> @@ -58,10 +58,27 @@ static uint64_t pte_index(struct kvm_vm *vm, vm_vaddr_t gva)
>>  	return (gva >> vm->page_shift) & mask;
>>  }
>>  
>> -static uint64_t pte_addr(struct kvm_vm *vm, uint64_t entry)
>> +static uint64_t addr_pte(struct kvm_vm *vm, uint64_t pa, uint64_t attrs)
>>  {
>> -	uint64_t mask = ((1UL << (vm->va_bits - vm->page_shift)) - 1) << vm->page_shift;
>> -	return entry & mask;
>> +	uint64_t pte;
>> +
>> +	pte = pa & GENMASK(47, vm->page_shift);
>> +	if (vm->page_shift == 16)
>> +		pte |= (pa & GENMASK(51, 48)) >> (48 - 12);
> 
> nit: this is a bit of an odd transformation, of course courtesy of the
> architecture. FIELD_GET() might make it a bit more readable:
> 
> 		pte |= FIELD_GET(GENMASK(51, 48), pa) << 12;
> 

Ahh yes, that does look better. I did consider this originally, but thought I
would also need FIELD_PREP() which selftests is not currently using anywhere. So
thought I would steer clear entirely. Anyway, on review, I don't need
FIELD_PREP(), so I've just sent you a respun series using FIELD_GET() in all the
sensible places. I hope I'm not jumping the gun by respinning so quickly - I
didn't think the series was particularly controversial so unlikely to get any
more comments.


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2023-03-08 11:18 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-02-28 17:07 [PATCH v1 0/2] KVM: selftests: Fixes for broken tests Ryan Roberts
2023-02-28 17:07 ` [PATCH v1 1/2] KVM: selftests: Fixup config fragment for access_tracking_perf_test Ryan Roberts
2023-02-28 17:07 ` [PATCH v1 2/2] KVM: selftests: arm64: Fix pte encode/decode for PA bits > 48 Ryan Roberts
2023-03-07 17:44   ` Oliver Upton
2023-03-08 11:18     ` Ryan Roberts
2023-03-02 15:27 ` [PATCH v1 0/2] KVM: selftests: Fixes for broken tests Ryan Roberts

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.