From: "Nicholas Piggin" <npiggin@gmail.com>
To: "Sean Christopherson" <seanjc@google.com>
Cc: "Paolo Bonzini" <pbonzini@redhat.com>,
"Shuah Khan" <shuah@kernel.org>, <linuxppc-dev@lists.ozlabs.org>,
<kvm@vger.kernel.org>, <linux-kselftest@vger.kernel.org>
Subject: Re: [PATCH 1/2] KVM: PPC: Add kvm selftests support for powerpc
Date: Sun, 02 Apr 2023 10:48:45 +1000 [thread overview]
Message-ID: <CRLUUQQWIY0E.6XPIKFXECRBG@bobo> (raw)
In-Reply-To: <ZCSdWc9te0Noiwo3@google.com>
Hey thanks for the review. Points about formatting and style all
valid, I'll tidy those up. For the others,
On Thu Mar 30, 2023 at 6:19 AM AEST, Sean Christopherson wrote:
> On Thu, Mar 16, 2023, Nicholas Piggin wrote:
> > +#ifdef __powerpc__
> > + TEST_ASSERT(getpagesize() == 64*1024,
>
> This can use SZ_64K (we really need to convert a bunch of open coded stuff...)
>
> > + "KVM selftests requires 64K host page size\n");
>
> What is the actual requirement? E.g. is it that the host and guest page sizes
> must match, or is that the selftest setup itself only supports 64KiB pages? If
> it's the former, would it make sense to assert outside of the switch statement, e.g.
>
> diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
> index 298c4372fb1a..920813a71be0 100644
> --- a/tools/testing/selftests/kvm/lib/kvm_util.c
> +++ b/tools/testing/selftests/kvm/lib/kvm_util.c
> @@ -291,6 +291,10 @@ struct kvm_vm *____vm_create(enum vm_guest_mode mode)
> #ifdef __aarch64__
> if (vm->pa_bits != 40)
> vm->type = KVM_VM_TYPE_ARM_IPA_SIZE(vm->pa_bits);
> +#endif
> +#ifdef __powerpc__
> + TEST_ASSERT(getpagesize() == vm->page_size, "blah blah blah");
> +
> #endif
>
> vm_open(vm);
>
> If it's the latter (selftests limitation), can you add a comment explaining the
> limitation?
It's the selftests setup, requires both host and guest to be 64k page
size. I think it shouldn't be *too* hard to add any mix of 64k/4k, but
there are a few quirks like requiring pgd to have 64k size allocation.
64/64 is the most important for us, but it would be nice to get other
combos working soon if nothing else than because they don't get as much
testing in other ways.
I can add a comment.
> > +
> > + /* If needed, create page table */
> > + if (vm->pgd_created)
> > + return;
>
> Heh, every arch has this. Any objection to moving the check to virt_pgd_alloc()
> as a prep patch?
I have no objection, I can do that for the next spin.
> > + "PTE not valid at level: %u gva: 0x%lx pte:0x%lx\n",
> > + level, gva, pte);
> > +
> > + return (pte & PTE_PAGE_MASK) + (gva & (vm->page_size - 1));
> > +}
> > +
> > +static void virt_arch_dump_pt(FILE *stream, struct kvm_vm *vm, vm_paddr_t pt, vm_vaddr_t va, int level, uint8_t indent)
>
> And here. Actually, why bother with the helper? There's one caller, and that
> callers checks pgd_created, i.e. is already assuming its dumping only page tables.
> Ooh, nevermind, it's recursive.
>
> Can you drop "arch" from the name? Selftests uses "arch" to tag functions that
> are provided by arch code for use in generic code.
Yeah agree, I'll drop that.
> > + } else {
> > + virt_arch_dump_pt(stream, vm, pte & PDE_PT_MASK, va, level + 1, indent);
> > + }
> > + }
> > + va += pt_entry_coverage(vm, level);
>
> The shift is constant for vm+level, correct? In that case, can't this be written
> as
>
> for (idx = 0; idx < size; idx++, va += va_coverage) {
>
> or even without a snapshot
>
> for (idx = 0; idx < size; idx++, va += pt_entry_coverage(vm, level)) {
>
> That would allow
>
> if (!(pte & PTE_VALID)
> continue
>
> to reduce the indentation of the printing.
It is constant for a given (vm, level). Good thinking, that should work.
> > + stack_vaddr = __vm_vaddr_alloc(vm, stack_size,
> > + DEFAULT_GUEST_STACK_VADDR_MIN,
> > + MEM_REGION_DATA);
> > +
> > + vcpu = __vm_vcpu_add(vm, vcpu_id);
> > +
> > + vcpu_enable_cap(vcpu, KVM_CAP_PPC_PAPR, 1);
> > +
> > + /* Setup guest registers */
> > + vcpu_regs_get(vcpu, ®s);
> > + vcpu_get_reg(vcpu, KVM_REG_PPC_LPCR_64, &lpcr);
> > +
> > + regs.pc = (uintptr_t)guest_code;
> > + regs.gpr[12] = (uintptr_t)guest_code;
> > + regs.msr = 0x8000000002103032ull;
> > + regs.gpr[1] = stack_vaddr + stack_size - 256;
> > +
> > + if (BYTE_ORDER == LITTLE_ENDIAN) {
> > + regs.msr |= 0x1; // LE
> > + lpcr |= 0x0000000002000000; // ILE
>
> Would it be appropriate to add #defines to processor.h instead of open coding the
> magic numbers?
Yes it would. I should have not been lazy about it from the start, will
fix.
(Other comments snipped but agreed for all)
Thanks,
Nick
WARNING: multiple messages have this Message-ID (diff)
From: "Nicholas Piggin" <npiggin@gmail.com>
To: "Sean Christopherson" <seanjc@google.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>,
linux-kselftest@vger.kernel.org, Shuah Khan <shuah@kernel.org>,
linuxppc-dev@lists.ozlabs.org, kvm@vger.kernel.org
Subject: Re: [PATCH 1/2] KVM: PPC: Add kvm selftests support for powerpc
Date: Sun, 02 Apr 2023 10:48:45 +1000 [thread overview]
Message-ID: <CRLUUQQWIY0E.6XPIKFXECRBG@bobo> (raw)
In-Reply-To: <ZCSdWc9te0Noiwo3@google.com>
Hey thanks for the review. Points about formatting and style all
valid, I'll tidy those up. For the others,
On Thu Mar 30, 2023 at 6:19 AM AEST, Sean Christopherson wrote:
> On Thu, Mar 16, 2023, Nicholas Piggin wrote:
> > +#ifdef __powerpc__
> > + TEST_ASSERT(getpagesize() == 64*1024,
>
> This can use SZ_64K (we really need to convert a bunch of open coded stuff...)
>
> > + "KVM selftests requires 64K host page size\n");
>
> What is the actual requirement? E.g. is it that the host and guest page sizes
> must match, or is that the selftest setup itself only supports 64KiB pages? If
> it's the former, would it make sense to assert outside of the switch statement, e.g.
>
> diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
> index 298c4372fb1a..920813a71be0 100644
> --- a/tools/testing/selftests/kvm/lib/kvm_util.c
> +++ b/tools/testing/selftests/kvm/lib/kvm_util.c
> @@ -291,6 +291,10 @@ struct kvm_vm *____vm_create(enum vm_guest_mode mode)
> #ifdef __aarch64__
> if (vm->pa_bits != 40)
> vm->type = KVM_VM_TYPE_ARM_IPA_SIZE(vm->pa_bits);
> +#endif
> +#ifdef __powerpc__
> + TEST_ASSERT(getpagesize() == vm->page_size, "blah blah blah");
> +
> #endif
>
> vm_open(vm);
>
> If it's the latter (selftests limitation), can you add a comment explaining the
> limitation?
It's the selftests setup, requires both host and guest to be 64k page
size. I think it shouldn't be *too* hard to add any mix of 64k/4k, but
there are a few quirks like requiring pgd to have 64k size allocation.
64/64 is the most important for us, but it would be nice to get other
combos working soon if nothing else than because they don't get as much
testing in other ways.
I can add a comment.
> > +
> > + /* If needed, create page table */
> > + if (vm->pgd_created)
> > + return;
>
> Heh, every arch has this. Any objection to moving the check to virt_pgd_alloc()
> as a prep patch?
I have no objection, I can do that for the next spin.
> > + "PTE not valid at level: %u gva: 0x%lx pte:0x%lx\n",
> > + level, gva, pte);
> > +
> > + return (pte & PTE_PAGE_MASK) + (gva & (vm->page_size - 1));
> > +}
> > +
> > +static void virt_arch_dump_pt(FILE *stream, struct kvm_vm *vm, vm_paddr_t pt, vm_vaddr_t va, int level, uint8_t indent)
>
> And here. Actually, why bother with the helper? There's one caller, and that
> callers checks pgd_created, i.e. is already assuming its dumping only page tables.
> Ooh, nevermind, it's recursive.
>
> Can you drop "arch" from the name? Selftests uses "arch" to tag functions that
> are provided by arch code for use in generic code.
Yeah agree, I'll drop that.
> > + } else {
> > + virt_arch_dump_pt(stream, vm, pte & PDE_PT_MASK, va, level + 1, indent);
> > + }
> > + }
> > + va += pt_entry_coverage(vm, level);
>
> The shift is constant for vm+level, correct? In that case, can't this be written
> as
>
> for (idx = 0; idx < size; idx++, va += va_coverage) {
>
> or even without a snapshot
>
> for (idx = 0; idx < size; idx++, va += pt_entry_coverage(vm, level)) {
>
> That would allow
>
> if (!(pte & PTE_VALID)
> continue
>
> to reduce the indentation of the printing.
It is constant for a given (vm, level). Good thinking, that should work.
> > + stack_vaddr = __vm_vaddr_alloc(vm, stack_size,
> > + DEFAULT_GUEST_STACK_VADDR_MIN,
> > + MEM_REGION_DATA);
> > +
> > + vcpu = __vm_vcpu_add(vm, vcpu_id);
> > +
> > + vcpu_enable_cap(vcpu, KVM_CAP_PPC_PAPR, 1);
> > +
> > + /* Setup guest registers */
> > + vcpu_regs_get(vcpu, ®s);
> > + vcpu_get_reg(vcpu, KVM_REG_PPC_LPCR_64, &lpcr);
> > +
> > + regs.pc = (uintptr_t)guest_code;
> > + regs.gpr[12] = (uintptr_t)guest_code;
> > + regs.msr = 0x8000000002103032ull;
> > + regs.gpr[1] = stack_vaddr + stack_size - 256;
> > +
> > + if (BYTE_ORDER == LITTLE_ENDIAN) {
> > + regs.msr |= 0x1; // LE
> > + lpcr |= 0x0000000002000000; // ILE
>
> Would it be appropriate to add #defines to processor.h instead of open coding the
> magic numbers?
Yes it would. I should have not been lazy about it from the start, will
fix.
(Other comments snipped but agreed for all)
Thanks,
Nick
next prev parent reply other threads:[~2023-04-02 0:48 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-16 3:17 [PATCH 0/2] KVM: PPC: support kvm selftests Nicholas Piggin
2023-03-16 3:17 ` Nicholas Piggin
2023-03-16 3:17 ` [PATCH 1/2] KVM: PPC: Add kvm selftests support for powerpc Nicholas Piggin
2023-03-16 3:17 ` Nicholas Piggin
2023-03-29 20:19 ` Sean Christopherson
2023-03-29 20:19 ` Sean Christopherson
2023-04-02 0:48 ` Nicholas Piggin [this message]
2023-04-02 0:48 ` Nicholas Piggin
2023-03-16 3:17 ` [PATCH 2/2] KVM: PPC: Add basic framework tests for kvm selftests Nicholas Piggin
2023-03-16 3:17 ` Nicholas Piggin
2023-03-16 11:53 ` [PATCH 0/2] KVM: PPC: support " Michael Ellerman
2023-03-16 11:53 ` Michael Ellerman
2023-03-22 17:41 ` Sean Christopherson
2023-03-22 17:41 ` Sean Christopherson
2023-03-27 5:37 ` Nicholas Piggin
2023-03-27 5:37 ` Nicholas Piggin
2023-03-27 17:43 ` Sean Christopherson
2023-03-27 17:43 ` Sean Christopherson
2023-03-28 6:49 ` Nicholas Piggin
2023-03-28 6:49 ` Nicholas Piggin
2023-03-28 9:07 ` Michael Ellerman
2023-03-28 9:07 ` Michael Ellerman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CRLUUQQWIY0E.6XPIKFXECRBG@bobo \
--to=npiggin@gmail.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=pbonzini@redhat.com \
--cc=seanjc@google.com \
--cc=shuah@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.