kvmarm.lists.cs.columbia.edu archive mirror
 help / color / mirror / Atom feed
From: Andrew Jones <drjones@redhat.com>
To: Raghavendra Rao Ananta <rananta@google.com>
Cc: kvm@vger.kernel.org, Will Deacon <will@kernel.org>,
	Catalin Marinas <catalin.marinas@arm.com>,
	Peter Shier <pshier@google.com>,
	linux-kernel@vger.kernel.org, Marc Zyngier <maz@kernel.org>,
	Paolo Bonzini <pbonzini@redhat.com>,
	kvmarm@lists.cs.columbia.edu,
	linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH v4 09/18] KVM: arm64: selftests: Add guest support to get the vcpuid
Date: Thu, 9 Sep 2021 09:56:43 +0200	[thread overview]
Message-ID: <20210909075643.fhngqu6tqrpe33gl@gator> (raw)
In-Reply-To: <20210909013818.1191270-10-rananta@google.com>

On Thu, Sep 09, 2021 at 01:38:09AM +0000, Raghavendra Rao Ananta wrote:
> At times, such as when in the interrupt handler, the guest wants
> to get the vcpuid that it's running on. As a result, introduce
> get_vcpuid() that returns the vcpuid of the calling vcpu. At its
> backend, the VMM prepares a map of vcpuid and mpidr during VM
> initialization and exports the map to the guest for it to read.
> 
> Signed-off-by: Raghavendra Rao Ananta <rananta@google.com>
> ---
>  .../selftests/kvm/include/aarch64/processor.h |  3 ++
>  .../selftests/kvm/lib/aarch64/processor.c     | 46 +++++++++++++++++++
>  2 files changed, 49 insertions(+)
> 
> diff --git a/tools/testing/selftests/kvm/include/aarch64/processor.h b/tools/testing/selftests/kvm/include/aarch64/processor.h
> index b6088c3c67a3..150f63101f4c 100644
> --- a/tools/testing/selftests/kvm/include/aarch64/processor.h
> +++ b/tools/testing/selftests/kvm/include/aarch64/processor.h
> @@ -133,6 +133,7 @@ void vm_install_exception_handler(struct kvm_vm *vm,
>  		int vector, handler_fn handler);
>  void vm_install_sync_handler(struct kvm_vm *vm,
>  		int vector, int ec, handler_fn handler);
> +void vm_vcpuid_map_init(struct kvm_vm *vm);
>  
>  static inline void cpu_relax(void)
>  {
> @@ -194,4 +195,6 @@ static inline void local_irq_disable(void)
>  	asm volatile("msr daifset, #3" : : : "memory");
>  }
>  
> +int get_vcpuid(void);
> +
>  #endif /* SELFTEST_KVM_PROCESSOR_H */
> diff --git a/tools/testing/selftests/kvm/lib/aarch64/processor.c b/tools/testing/selftests/kvm/lib/aarch64/processor.c
> index 632b74d6b3ca..9844b62227b1 100644
> --- a/tools/testing/selftests/kvm/lib/aarch64/processor.c
> +++ b/tools/testing/selftests/kvm/lib/aarch64/processor.c
> @@ -13,9 +13,17 @@
>  #include "processor.h"
>  
>  #define DEFAULT_ARM64_GUEST_STACK_VADDR_MIN	0xac0000
> +#define VM_VCPUID_MAP_INVAL			-1
>  
>  static vm_vaddr_t exception_handlers;
>  
> +struct vm_vcpuid_map {
> +	uint64_t mpidr;
> +	int vcpuid;
> +};

I'd prefer we create an arch neutral map structure that has arch specific
vm_vcpuid_map_add() functions to populate them. So, instead of calling the
'mpidr' member mpidr, we should call it 'cpuid'. On x86, for example,
cpuid would be the APIC ID.

> +
> +static struct vm_vcpuid_map vcpuid_map[KVM_MAX_VCPUS];
> +
>  static uint64_t page_align(struct kvm_vm *vm, uint64_t v)
>  {
>  	return (v + vm->page_size) & ~(vm->page_size - 1);
> @@ -426,3 +434,41 @@ void vm_install_exception_handler(struct kvm_vm *vm, int vector,
>  	assert(vector < VECTOR_NUM);
>  	handlers->exception_handlers[vector][0] = handler;
>  }
> +
> +void vm_vcpuid_map_init(struct kvm_vm *vm)
> +{
> +	int i = 0;
> +	struct vcpu *vcpu;
> +	struct vm_vcpuid_map *map;
> +
> +	list_for_each_entry(vcpu, &vm->vcpus, list) {
> +		map = &vcpuid_map[i++];
> +		map->vcpuid = vcpu->id;
> +		get_reg(vm, vcpu->id,
> +			ARM64_SYS_KVM_REG(SYS_MPIDR_EL1), &map->mpidr);
> +		map->mpidr &= MPIDR_HWID_BITMASK;
> +	}

Here we should assert that i is no longer zero. If it is, then we should
complain that vcpus need to be added before this call is made.

But, rather than providing an init function that inits the whole map
after all vcpus are created, I think we should add each vcpu's map entry
as we add vcpus to the vm. So we need to call the arch-specific
vm_vcpuid_map_add() from vm_vcpu_add(). We can just create stubs
for x86 and s390 for now. Also, in vm_vcpu_rm() we should find the
corresponding entry in the vcpuid map and set it to VM_VCPUID_MAP_INVAL
in order to remove it.

> +
> +	if (i < KVM_MAX_VCPUS)
> +		vcpuid_map[i].vcpuid = VM_VCPUID_MAP_INVAL;
> +
> +	sync_global_to_guest(vm, vcpuid_map);

We can't do this synch part for the test code at vcpu add time since we
don't know if the guest page tables are ready. I think it's OK to require
the test code to do this when the guest code needs it though. We should
document that requirement above the vm_vcpuid_map struct declaration,
which will be in kvm_util.h.

> +}
> +
> +int get_vcpuid(void)
> +{
> +	int i, vcpuid;
> +	uint64_t mpidr = read_sysreg(mpidr_el1) & MPIDR_HWID_BITMASK;
> +
> +	for (i = 0; i < KVM_MAX_VCPUS; i++) {
> +		vcpuid = vcpuid_map[i].vcpuid;
> +		GUEST_ASSERT_1(vcpuid != VM_VCPUID_MAP_INVAL, mpidr);

We don't want this assert if it's possible to have sparse maps, which
it probably isn't ever going to be, but...

> +
> +		if (mpidr == vcpuid_map[i].mpidr)
> +			return vcpuid;
> +	}
> +
> +	/* We should not be reaching here */
> +	GUEST_ASSERT_1(0, mpidr);

...this assert should be good enough to sanity check the map by itself
anyway.

Also, the only arch-specific aspect of get_vcpuid() is the looking up
the cpuid. So we should make get_vcpuid arch-neutral and call an arch-
specific get_cpuid() from it.

> +	return -1;
> +}
> -- 
> 2.33.0.153.gba50c8fa24-goog
>

Thanks,
drew 

_______________________________________________
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

  parent reply	other threads:[~2021-09-09  7:56 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-09  1:38 [PATCH v4 00/18] KVM: arm64: selftests: Introduce arch_timer selftest Raghavendra Rao Ananta
2021-09-09  1:38 ` [PATCH v4 01/18] KVM: arm64: selftests: Add MMIO readl/writel support Raghavendra Rao Ananta
2021-09-09  1:38 ` [PATCH v4 02/18] KVM: arm64: selftests: Add sysreg.h Raghavendra Rao Ananta
2021-09-09  2:47   ` Oliver Upton
2021-09-09  6:53     ` Andrew Jones
2021-09-09 16:42       ` Raghavendra Rao Ananta
2021-09-09 17:17   ` Mark Brown
2021-09-09 20:06     ` Raghavendra Rao Ananta
2021-09-10  8:30       ` Mark Brown
2021-09-13 23:38         ` Raghavendra Rao Ananta
2021-09-14 10:39           ` Mark Brown
2021-09-09  1:38 ` [PATCH v4 03/18] KVM: arm64: selftests: Use read/write definitions from sysreg.h Raghavendra Rao Ananta
2021-09-09  2:55   ` Oliver Upton
2021-09-09  6:56   ` Andrew Jones
2021-09-09 16:43     ` Raghavendra Rao Ananta
2021-09-09  1:38 ` [PATCH v4 04/18] KVM: arm64: selftests: Introduce ARM64_SYS_KVM_REG Raghavendra Rao Ananta
2021-09-09  3:02   ` Oliver Upton
2021-09-09 16:48     ` Raghavendra Rao Ananta
2021-09-09  7:04   ` Andrew Jones
2021-09-09 16:49     ` Raghavendra Rao Ananta
2021-09-09  1:38 ` [PATCH v4 05/18] KVM: arm64: selftests: Add support for cpu_relax Raghavendra Rao Ananta
2021-09-09  1:38 ` [PATCH v4 06/18] KVM: arm64: selftests: Add basic support for arch_timers Raghavendra Rao Ananta
2021-09-09  7:07   ` Andrew Jones
2021-09-09  1:38 ` [PATCH v4 07/18] KVM: arm64: selftests: Add basic support to generate delays Raghavendra Rao Ananta
2021-09-09  1:38 ` [PATCH v4 08/18] KVM: arm64: selftests: Add support to disable and enable local IRQs Raghavendra Rao Ananta
2021-09-09  1:38 ` [PATCH v4 09/18] KVM: arm64: selftests: Add guest support to get the vcpuid Raghavendra Rao Ananta
2021-09-09  5:09   ` Oliver Upton
2021-09-09 16:59     ` Raghavendra Rao Ananta
2021-09-09 17:04       ` Oliver Upton
2021-09-09  7:56   ` Andrew Jones [this message]
2021-09-09 17:10     ` Raghavendra Rao Ananta
2021-09-10  8:10       ` Andrew Jones
2021-09-10 18:03         ` Raghavendra Rao Ananta
2021-09-13  7:25           ` Andrew Jones
2021-09-12  7:05   ` Reiji Watanabe
2021-09-13  7:35     ` Andrew Jones
2021-09-13 16:51       ` Raghavendra Rao Ananta
2021-09-09  1:38 ` [PATCH v4 10/18] KVM: arm64: selftests: Add light-weight spinlock support Raghavendra Rao Ananta
2021-09-09  1:38 ` [PATCH v4 11/18] KVM: arm64: selftests: Add basic GICv3 support Raghavendra Rao Ananta
2021-09-09  5:18   ` Oliver Upton
2021-09-09 16:38     ` Raghavendra Rao Ananta
2021-09-09  1:38 ` [PATCH v4 12/18] KVM: selftests: Keep track of the number of vCPUs for a VM Raghavendra Rao Ananta
2021-09-09  5:22   ` Oliver Upton
2021-09-09 13:20   ` Andrew Jones
2021-09-09  1:38 ` [PATCH v4 13/18] KVM: selftests: Add support to get the VM's mode Raghavendra Rao Ananta
2021-09-09  1:38 ` [PATCH v4 14/18] KVM: arm64: selftests: Add host support for vGIC Raghavendra Rao Ananta
2021-09-09  5:32   ` Oliver Upton
2021-09-09 13:34     ` Andrew Jones
2021-09-09 17:25       ` Raghavendra Rao Ananta
2021-09-09 17:20     ` Raghavendra Rao Ananta
2021-09-09  1:38 ` [PATCH v4 15/18] KVM: arm64: selftests: Add arch_timer test Raghavendra Rao Ananta
2021-09-09  5:51   ` Oliver Upton
2021-09-09 18:03     ` Raghavendra Rao Ananta
2021-09-09  1:38 ` [PATCH v4 16/18] KVM: arm64: selftests: arch_timer: Support vCPU migration Raghavendra Rao Ananta
2021-09-09 13:45   ` Andrew Jones
2021-09-09 17:33     ` Raghavendra Rao Ananta
2021-09-09  1:38 ` [PATCH v4 17/18] KVM: arm64: selftests: Replace ARM64_SYS_REG with ARM64_SYS_KVM_REG Raghavendra Rao Ananta
2021-09-09  5:34   ` Oliver Upton
2021-09-09 13:38   ` Andrew Jones
2021-09-09 17:29     ` Raghavendra Rao Ananta
2021-09-09  1:38 ` [PATCH v4 18/18] KVM: selftests: vgic_init: Pull REDIST_REGION_ATTR_ADDR from vgic.h Raghavendra Rao Ananta
2021-09-09  5:36   ` Oliver Upton
2021-09-09 16:41     ` Raghavendra Rao Ananta

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=20210909075643.fhngqu6tqrpe33gl@gator \
    --to=drjones@redhat.com \
    --cc=catalin.marinas@arm.com \
    --cc=kvm@vger.kernel.org \
    --cc=kvmarm@lists.cs.columbia.edu \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=maz@kernel.org \
    --cc=pbonzini@redhat.com \
    --cc=pshier@google.com \
    --cc=rananta@google.com \
    --cc=will@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).