All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christian Borntraeger <borntraeger@de.ibm.com>
To: Sean Christopherson <sean.j.christopherson@intel.com>,
	James Hogan <jhogan@kernel.org>,
	Paul Mackerras <paulus@ozlabs.org>,
	Janosch Frank <frankja@linux.ibm.com>,
	Paolo Bonzini <pbonzini@redhat.com>,
	Marc Zyngier <maz@kernel.org>
Cc: "David Hildenbrand" <david@redhat.com>,
	"Cornelia Huck" <cohuck@redhat.com>,
	"Vitaly Kuznetsov" <vkuznets@redhat.com>,
	"Wanpeng Li" <wanpengli@tencent.com>,
	"Jim Mattson" <jmattson@google.com>,
	"Joerg Roedel" <joro@8bytes.org>,
	"James Morse" <james.morse@arm.com>,
	"Julien Thierry" <julien.thierry.kdev@gmail.com>,
	"Suzuki K Poulose" <suzuki.poulose@arm.com>,
	linux-mips@vger.kernel.org, kvm-ppc@vger.kernel.org,
	kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
	kvmarm@lists.cs.columbia.edu, linux-kernel@vger.kernel.org,
	"Christoffer Dall" <christoffer.dall@arm.com>,
	"Philippe Mathieu-Daudé" <f4bug@amsat.org>
Subject: Re: [PATCH v4 19/19] KVM: selftests: Add test for KVM_SET_USER_MEMORY_REGION
Date: Wed, 18 Dec 2019 12:39:43 +0100	[thread overview]
Message-ID: <f962fafb-3956-746f-d077-3dbcefaae7c8@de.ibm.com> (raw)
In-Reply-To: <20191217204041.10815-20-sean.j.christopherson@intel.com>



On 17.12.19 21:40, Sean Christopherson wrote:
> Add a KVM selftest to test moving the base gfn of a userspace memory
> region.  The test is primarily targeted at x86 to verify its memslot
> metadata is correctly updated, but also provides basic functionality
> coverage on other architectures.
> 
> Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
> ---
>  tools/testing/selftests/kvm/.gitignore        |   1 +
>  tools/testing/selftests/kvm/Makefile          |   3 +
>  .../testing/selftests/kvm/include/kvm_util.h  |   1 +
>  tools/testing/selftests/kvm/lib/kvm_util.c    |  30 ++++
>  .../selftests/kvm/set_memory_region_test.c    | 142 ++++++++++++++++++
>  5 files changed, 177 insertions(+)
>  create mode 100644 tools/testing/selftests/kvm/set_memory_region_test.c
> 
> diff --git a/tools/testing/selftests/kvm/.gitignore b/tools/testing/selftests/kvm/.gitignore
> index 30072c3f52fb..6f60ceb81440 100644
> --- a/tools/testing/selftests/kvm/.gitignore
> +++ b/tools/testing/selftests/kvm/.gitignore
> @@ -17,3 +17,4 @@
>  /clear_dirty_log_test
>  /dirty_log_test
>  /kvm_create_max_vcpus
> +/set_memory_region_test
> diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile
> index 3138a916574a..01c79e02c5b7 100644
> --- a/tools/testing/selftests/kvm/Makefile
> +++ b/tools/testing/selftests/kvm/Makefile
> @@ -29,15 +29,18 @@ TEST_GEN_PROGS_x86_64 += x86_64/xss_msr_test
>  TEST_GEN_PROGS_x86_64 += clear_dirty_log_test
>  TEST_GEN_PROGS_x86_64 += dirty_log_test
>  TEST_GEN_PROGS_x86_64 += kvm_create_max_vcpus
> +TEST_GEN_PROGS_x86_64 += set_memory_region_test
> 
>  TEST_GEN_PROGS_aarch64 += clear_dirty_log_test
>  TEST_GEN_PROGS_aarch64 += dirty_log_test
>  TEST_GEN_PROGS_aarch64 += kvm_create_max_vcpus
> +TEST_GEN_PROGS_aarch64 += set_memory_region_test
> 
>  TEST_GEN_PROGS_s390x = s390x/memop
>  TEST_GEN_PROGS_s390x += s390x/sync_regs_test
>  TEST_GEN_PROGS_s390x += dirty_log_test
>  TEST_GEN_PROGS_s390x += kvm_create_max_vcpus
> +TEST_GEN_PROGS_s390x += set_memory_region_test
> 
>  TEST_GEN_PROGS += $(TEST_GEN_PROGS_$(UNAME_M))
>  LIBKVM += $(LIBKVM_$(UNAME_M))
> diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing/selftests/kvm/include/kvm_util.h
> index 29cccaf96baf..15d3b8690ffb 100644
> --- a/tools/testing/selftests/kvm/include/kvm_util.h
> +++ b/tools/testing/selftests/kvm/include/kvm_util.h
> @@ -100,6 +100,7 @@ int _vcpu_ioctl(struct kvm_vm *vm, uint32_t vcpuid, unsigned long ioctl,
>  		void *arg);
>  void vm_ioctl(struct kvm_vm *vm, unsigned long ioctl, void *arg);
>  void vm_mem_region_set_flags(struct kvm_vm *vm, uint32_t slot, uint32_t flags);
> +void vm_mem_region_move(struct kvm_vm *vm, uint32_t slot, uint64_t new_gpa);
>  void vm_vcpu_add(struct kvm_vm *vm, uint32_t vcpuid);
>  vm_vaddr_t vm_vaddr_alloc(struct kvm_vm *vm, size_t sz, vm_vaddr_t vaddr_min,
>  			  uint32_t data_memslot, uint32_t pgd_memslot);
> diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
> index 41cf45416060..464a75ce9843 100644
> --- a/tools/testing/selftests/kvm/lib/kvm_util.c
> +++ b/tools/testing/selftests/kvm/lib/kvm_util.c
> @@ -756,6 +756,36 @@ void vm_mem_region_set_flags(struct kvm_vm *vm, uint32_t slot, uint32_t flags)
>  		ret, errno, slot, flags);
>  }
> 
> +/*
> + * VM Memory Region Move
> + *
> + * Input Args:
> + *   vm - Virtual Machine
> + *   slot - Slot of the memory region to move
> + *   flags - Starting guest physical address
> + *
> + * Output Args: None
> + *
> + * Return: None
> + *
> + * Change the gpa of a memory region.
> + */
> +void vm_mem_region_move(struct kvm_vm *vm, uint32_t slot, uint64_t new_gpa)
> +{
> +	struct userspace_mem_region *region;
> +	int ret;
> +
> +	region = memslot2region(vm, slot);
> +
> +	region->region.guest_phys_addr = new_gpa;
> +
> +	ret = ioctl(vm->fd, KVM_SET_USER_MEMORY_REGION, &region->region);
> +
> +	TEST_ASSERT(!ret, "KVM_SET_USER_MEMORY_REGION failed\n"
> +		    "ret: %i errno: %i slot: %u flags: 0x%x",
> +		    ret, errno, slot, new_gpa);
> +}
> +
>  /*
>   * VCPU mmap Size
>   *
> diff --git a/tools/testing/selftests/kvm/set_memory_region_test.c b/tools/testing/selftests/kvm/set_memory_region_test.c
> new file mode 100644
> index 000000000000..c9603b95ccf7
> --- /dev/null
> +++ b/tools/testing/selftests/kvm/set_memory_region_test.c
> @@ -0,0 +1,142 @@
> +// SPDX-License-Identifier: GPL-2.0
> +#define _GNU_SOURCE /* for program_invocation_short_name */
> +#include <fcntl.h>
> +#include <pthread.h>
> +#include <sched.h>
> +#include <signal.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <sys/ioctl.h>
> +
> +#include <linux/compiler.h>
> +
> +#include <test_util.h>
> +#include <kvm_util.h>
> +#include <processor.h>
> +
> +#define VCPU_ID 0
> +
> +/*
> + * Somewhat arbitrary location and slot, intended to not overlap anything.  The
> + * location and size are specifically 2mb sized/aligned so that the initial
> + * region corresponds to exactly one large page (on x86 and arm64).
> + */
> +#define MEM_REGION_GPA		0xc0000000
> +#define MEM_REGION_SIZE		0x200000
> +#define MEM_REGION_SLOT		10
> +
> +static void guest_code(void)
> +{
> +	uint64_t val;
> +
> +	do {
> +		val = READ_ONCE(*((uint64_t *)MEM_REGION_GPA));
> +	} while (!val);
> +
> +	if (val != 1)
> +		ucall(UCALL_ABORT, 1, val);
> +
> +	GUEST_DONE();
> +}
> +
> +static void *vcpu_worker(void *data)
> +{
> +	struct kvm_vm *vm = data;
> +	struct kvm_run *run;
> +	struct ucall uc;
> +	uint64_t cmd;
> +
> +	/*
> +	 * Loop until the guest is done.  Re-enter the guest on all MMIO exits,
> +	 * which will occur if the guest attempts to access a memslot while it
> +	 * is being moved.
> +	 */
> +	run = vcpu_state(vm, VCPU_ID);
> +	do {
> +		vcpu_run(vm, VCPU_ID);
> +	} while (run->exit_reason == KVM_EXIT_MMIO);
> +
> +	TEST_ASSERT(run->exit_reason == KVM_EXIT_IO,
> +		    "Unexpected exit reason = %d", run->exit_reason);


This will also not work for s390. Maybe just make this test x86 specific for now?


WARNING: multiple messages have this Message-ID (diff)
From: Christian Borntraeger <borntraeger@de.ibm.com>
To: Sean Christopherson <sean.j.christopherson@intel.com>,
	James Hogan <jhogan@kernel.org>,
	Paul Mackerras <paulus@ozlabs.org>,
	Janosch Frank <frankja@linux.ibm.com>,
	Paolo Bonzini <pbonzini@redhat.com>,
	Marc Zyngier <maz@kernel.org>
Cc: "Wanpeng Li" <wanpengli@tencent.com>,
	"Philippe Mathieu-Daudé" <f4bug@amsat.org>,
	kvm@vger.kernel.org, "David Hildenbrand" <david@redhat.com>,
	"Joerg Roedel" <joro@8bytes.org>,
	"Cornelia Huck" <cohuck@redhat.com>,
	linux-mips@vger.kernel.org, kvm-ppc@vger.kernel.org,
	linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	"Vitaly Kuznetsov" <vkuznets@redhat.com>,
	kvmarm@lists.cs.columbia.edu, "Jim Mattson" <jmattson@google.com>
Subject: Re: [PATCH v4 19/19] KVM: selftests: Add test for KVM_SET_USER_MEMORY_REGION
Date: Wed, 18 Dec 2019 12:39:43 +0100	[thread overview]
Message-ID: <f962fafb-3956-746f-d077-3dbcefaae7c8@de.ibm.com> (raw)
In-Reply-To: <20191217204041.10815-20-sean.j.christopherson@intel.com>



On 17.12.19 21:40, Sean Christopherson wrote:
> Add a KVM selftest to test moving the base gfn of a userspace memory
> region.  The test is primarily targeted at x86 to verify its memslot
> metadata is correctly updated, but also provides basic functionality
> coverage on other architectures.
> 
> Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
> ---
>  tools/testing/selftests/kvm/.gitignore        |   1 +
>  tools/testing/selftests/kvm/Makefile          |   3 +
>  .../testing/selftests/kvm/include/kvm_util.h  |   1 +
>  tools/testing/selftests/kvm/lib/kvm_util.c    |  30 ++++
>  .../selftests/kvm/set_memory_region_test.c    | 142 ++++++++++++++++++
>  5 files changed, 177 insertions(+)
>  create mode 100644 tools/testing/selftests/kvm/set_memory_region_test.c
> 
> diff --git a/tools/testing/selftests/kvm/.gitignore b/tools/testing/selftests/kvm/.gitignore
> index 30072c3f52fb..6f60ceb81440 100644
> --- a/tools/testing/selftests/kvm/.gitignore
> +++ b/tools/testing/selftests/kvm/.gitignore
> @@ -17,3 +17,4 @@
>  /clear_dirty_log_test
>  /dirty_log_test
>  /kvm_create_max_vcpus
> +/set_memory_region_test
> diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile
> index 3138a916574a..01c79e02c5b7 100644
> --- a/tools/testing/selftests/kvm/Makefile
> +++ b/tools/testing/selftests/kvm/Makefile
> @@ -29,15 +29,18 @@ TEST_GEN_PROGS_x86_64 += x86_64/xss_msr_test
>  TEST_GEN_PROGS_x86_64 += clear_dirty_log_test
>  TEST_GEN_PROGS_x86_64 += dirty_log_test
>  TEST_GEN_PROGS_x86_64 += kvm_create_max_vcpus
> +TEST_GEN_PROGS_x86_64 += set_memory_region_test
> 
>  TEST_GEN_PROGS_aarch64 += clear_dirty_log_test
>  TEST_GEN_PROGS_aarch64 += dirty_log_test
>  TEST_GEN_PROGS_aarch64 += kvm_create_max_vcpus
> +TEST_GEN_PROGS_aarch64 += set_memory_region_test
> 
>  TEST_GEN_PROGS_s390x = s390x/memop
>  TEST_GEN_PROGS_s390x += s390x/sync_regs_test
>  TEST_GEN_PROGS_s390x += dirty_log_test
>  TEST_GEN_PROGS_s390x += kvm_create_max_vcpus
> +TEST_GEN_PROGS_s390x += set_memory_region_test
> 
>  TEST_GEN_PROGS += $(TEST_GEN_PROGS_$(UNAME_M))
>  LIBKVM += $(LIBKVM_$(UNAME_M))
> diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing/selftests/kvm/include/kvm_util.h
> index 29cccaf96baf..15d3b8690ffb 100644
> --- a/tools/testing/selftests/kvm/include/kvm_util.h
> +++ b/tools/testing/selftests/kvm/include/kvm_util.h
> @@ -100,6 +100,7 @@ int _vcpu_ioctl(struct kvm_vm *vm, uint32_t vcpuid, unsigned long ioctl,
>  		void *arg);
>  void vm_ioctl(struct kvm_vm *vm, unsigned long ioctl, void *arg);
>  void vm_mem_region_set_flags(struct kvm_vm *vm, uint32_t slot, uint32_t flags);
> +void vm_mem_region_move(struct kvm_vm *vm, uint32_t slot, uint64_t new_gpa);
>  void vm_vcpu_add(struct kvm_vm *vm, uint32_t vcpuid);
>  vm_vaddr_t vm_vaddr_alloc(struct kvm_vm *vm, size_t sz, vm_vaddr_t vaddr_min,
>  			  uint32_t data_memslot, uint32_t pgd_memslot);
> diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
> index 41cf45416060..464a75ce9843 100644
> --- a/tools/testing/selftests/kvm/lib/kvm_util.c
> +++ b/tools/testing/selftests/kvm/lib/kvm_util.c
> @@ -756,6 +756,36 @@ void vm_mem_region_set_flags(struct kvm_vm *vm, uint32_t slot, uint32_t flags)
>  		ret, errno, slot, flags);
>  }
> 
> +/*
> + * VM Memory Region Move
> + *
> + * Input Args:
> + *   vm - Virtual Machine
> + *   slot - Slot of the memory region to move
> + *   flags - Starting guest physical address
> + *
> + * Output Args: None
> + *
> + * Return: None
> + *
> + * Change the gpa of a memory region.
> + */
> +void vm_mem_region_move(struct kvm_vm *vm, uint32_t slot, uint64_t new_gpa)
> +{
> +	struct userspace_mem_region *region;
> +	int ret;
> +
> +	region = memslot2region(vm, slot);
> +
> +	region->region.guest_phys_addr = new_gpa;
> +
> +	ret = ioctl(vm->fd, KVM_SET_USER_MEMORY_REGION, &region->region);
> +
> +	TEST_ASSERT(!ret, "KVM_SET_USER_MEMORY_REGION failed\n"
> +		    "ret: %i errno: %i slot: %u flags: 0x%x",
> +		    ret, errno, slot, new_gpa);
> +}
> +
>  /*
>   * VCPU mmap Size
>   *
> diff --git a/tools/testing/selftests/kvm/set_memory_region_test.c b/tools/testing/selftests/kvm/set_memory_region_test.c
> new file mode 100644
> index 000000000000..c9603b95ccf7
> --- /dev/null
> +++ b/tools/testing/selftests/kvm/set_memory_region_test.c
> @@ -0,0 +1,142 @@
> +// SPDX-License-Identifier: GPL-2.0
> +#define _GNU_SOURCE /* for program_invocation_short_name */
> +#include <fcntl.h>
> +#include <pthread.h>
> +#include <sched.h>
> +#include <signal.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <sys/ioctl.h>
> +
> +#include <linux/compiler.h>
> +
> +#include <test_util.h>
> +#include <kvm_util.h>
> +#include <processor.h>
> +
> +#define VCPU_ID 0
> +
> +/*
> + * Somewhat arbitrary location and slot, intended to not overlap anything.  The
> + * location and size are specifically 2mb sized/aligned so that the initial
> + * region corresponds to exactly one large page (on x86 and arm64).
> + */
> +#define MEM_REGION_GPA		0xc0000000
> +#define MEM_REGION_SIZE		0x200000
> +#define MEM_REGION_SLOT		10
> +
> +static void guest_code(void)
> +{
> +	uint64_t val;
> +
> +	do {
> +		val = READ_ONCE(*((uint64_t *)MEM_REGION_GPA));
> +	} while (!val);
> +
> +	if (val != 1)
> +		ucall(UCALL_ABORT, 1, val);
> +
> +	GUEST_DONE();
> +}
> +
> +static void *vcpu_worker(void *data)
> +{
> +	struct kvm_vm *vm = data;
> +	struct kvm_run *run;
> +	struct ucall uc;
> +	uint64_t cmd;
> +
> +	/*
> +	 * Loop until the guest is done.  Re-enter the guest on all MMIO exits,
> +	 * which will occur if the guest attempts to access a memslot while it
> +	 * is being moved.
> +	 */
> +	run = vcpu_state(vm, VCPU_ID);
> +	do {
> +		vcpu_run(vm, VCPU_ID);
> +	} while (run->exit_reason == KVM_EXIT_MMIO);
> +
> +	TEST_ASSERT(run->exit_reason == KVM_EXIT_IO,
> +		    "Unexpected exit reason = %d", run->exit_reason);


This will also not work for s390. Maybe just make this test x86 specific for now?

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

WARNING: multiple messages have this Message-ID (diff)
From: Christian Borntraeger <borntraeger@de.ibm.com>
To: Sean Christopherson <sean.j.christopherson@intel.com>,
	James Hogan <jhogan@kernel.org>,
	Paul Mackerras <paulus@ozlabs.org>,
	Janosch Frank <frankja@linux.ibm.com>,
	Paolo Bonzini <pbonzini@redhat.com>,
	Marc Zyngier <maz@kernel.org>
Cc: "Christoffer Dall" <christoffer.dall@arm.com>,
	"Wanpeng Li" <wanpengli@tencent.com>,
	"Philippe Mathieu-Daudé" <f4bug@amsat.org>,
	kvm@vger.kernel.org, "David Hildenbrand" <david@redhat.com>,
	"Joerg Roedel" <joro@8bytes.org>,
	"Cornelia Huck" <cohuck@redhat.com>,
	linux-mips@vger.kernel.org, kvm-ppc@vger.kernel.org,
	linux-kernel@vger.kernel.org, "James Morse" <james.morse@arm.com>,
	linux-arm-kernel@lists.infradead.org,
	"Vitaly Kuznetsov" <vkuznets@redhat.com>,
	"Suzuki K Poulose" <suzuki.poulose@arm.com>,
	kvmarm@lists.cs.columbia.edu,
	"Julien Thierry" <julien.thierry.kdev@gmail.com>,
	"Jim Mattson" <jmattson@google.com>
Subject: Re: [PATCH v4 19/19] KVM: selftests: Add test for KVM_SET_USER_MEMORY_REGION
Date: Wed, 18 Dec 2019 12:39:43 +0100	[thread overview]
Message-ID: <f962fafb-3956-746f-d077-3dbcefaae7c8@de.ibm.com> (raw)
In-Reply-To: <20191217204041.10815-20-sean.j.christopherson@intel.com>



On 17.12.19 21:40, Sean Christopherson wrote:
> Add a KVM selftest to test moving the base gfn of a userspace memory
> region.  The test is primarily targeted at x86 to verify its memslot
> metadata is correctly updated, but also provides basic functionality
> coverage on other architectures.
> 
> Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
> ---
>  tools/testing/selftests/kvm/.gitignore        |   1 +
>  tools/testing/selftests/kvm/Makefile          |   3 +
>  .../testing/selftests/kvm/include/kvm_util.h  |   1 +
>  tools/testing/selftests/kvm/lib/kvm_util.c    |  30 ++++
>  .../selftests/kvm/set_memory_region_test.c    | 142 ++++++++++++++++++
>  5 files changed, 177 insertions(+)
>  create mode 100644 tools/testing/selftests/kvm/set_memory_region_test.c
> 
> diff --git a/tools/testing/selftests/kvm/.gitignore b/tools/testing/selftests/kvm/.gitignore
> index 30072c3f52fb..6f60ceb81440 100644
> --- a/tools/testing/selftests/kvm/.gitignore
> +++ b/tools/testing/selftests/kvm/.gitignore
> @@ -17,3 +17,4 @@
>  /clear_dirty_log_test
>  /dirty_log_test
>  /kvm_create_max_vcpus
> +/set_memory_region_test
> diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile
> index 3138a916574a..01c79e02c5b7 100644
> --- a/tools/testing/selftests/kvm/Makefile
> +++ b/tools/testing/selftests/kvm/Makefile
> @@ -29,15 +29,18 @@ TEST_GEN_PROGS_x86_64 += x86_64/xss_msr_test
>  TEST_GEN_PROGS_x86_64 += clear_dirty_log_test
>  TEST_GEN_PROGS_x86_64 += dirty_log_test
>  TEST_GEN_PROGS_x86_64 += kvm_create_max_vcpus
> +TEST_GEN_PROGS_x86_64 += set_memory_region_test
> 
>  TEST_GEN_PROGS_aarch64 += clear_dirty_log_test
>  TEST_GEN_PROGS_aarch64 += dirty_log_test
>  TEST_GEN_PROGS_aarch64 += kvm_create_max_vcpus
> +TEST_GEN_PROGS_aarch64 += set_memory_region_test
> 
>  TEST_GEN_PROGS_s390x = s390x/memop
>  TEST_GEN_PROGS_s390x += s390x/sync_regs_test
>  TEST_GEN_PROGS_s390x += dirty_log_test
>  TEST_GEN_PROGS_s390x += kvm_create_max_vcpus
> +TEST_GEN_PROGS_s390x += set_memory_region_test
> 
>  TEST_GEN_PROGS += $(TEST_GEN_PROGS_$(UNAME_M))
>  LIBKVM += $(LIBKVM_$(UNAME_M))
> diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing/selftests/kvm/include/kvm_util.h
> index 29cccaf96baf..15d3b8690ffb 100644
> --- a/tools/testing/selftests/kvm/include/kvm_util.h
> +++ b/tools/testing/selftests/kvm/include/kvm_util.h
> @@ -100,6 +100,7 @@ int _vcpu_ioctl(struct kvm_vm *vm, uint32_t vcpuid, unsigned long ioctl,
>  		void *arg);
>  void vm_ioctl(struct kvm_vm *vm, unsigned long ioctl, void *arg);
>  void vm_mem_region_set_flags(struct kvm_vm *vm, uint32_t slot, uint32_t flags);
> +void vm_mem_region_move(struct kvm_vm *vm, uint32_t slot, uint64_t new_gpa);
>  void vm_vcpu_add(struct kvm_vm *vm, uint32_t vcpuid);
>  vm_vaddr_t vm_vaddr_alloc(struct kvm_vm *vm, size_t sz, vm_vaddr_t vaddr_min,
>  			  uint32_t data_memslot, uint32_t pgd_memslot);
> diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
> index 41cf45416060..464a75ce9843 100644
> --- a/tools/testing/selftests/kvm/lib/kvm_util.c
> +++ b/tools/testing/selftests/kvm/lib/kvm_util.c
> @@ -756,6 +756,36 @@ void vm_mem_region_set_flags(struct kvm_vm *vm, uint32_t slot, uint32_t flags)
>  		ret, errno, slot, flags);
>  }
> 
> +/*
> + * VM Memory Region Move
> + *
> + * Input Args:
> + *   vm - Virtual Machine
> + *   slot - Slot of the memory region to move
> + *   flags - Starting guest physical address
> + *
> + * Output Args: None
> + *
> + * Return: None
> + *
> + * Change the gpa of a memory region.
> + */
> +void vm_mem_region_move(struct kvm_vm *vm, uint32_t slot, uint64_t new_gpa)
> +{
> +	struct userspace_mem_region *region;
> +	int ret;
> +
> +	region = memslot2region(vm, slot);
> +
> +	region->region.guest_phys_addr = new_gpa;
> +
> +	ret = ioctl(vm->fd, KVM_SET_USER_MEMORY_REGION, &region->region);
> +
> +	TEST_ASSERT(!ret, "KVM_SET_USER_MEMORY_REGION failed\n"
> +		    "ret: %i errno: %i slot: %u flags: 0x%x",
> +		    ret, errno, slot, new_gpa);
> +}
> +
>  /*
>   * VCPU mmap Size
>   *
> diff --git a/tools/testing/selftests/kvm/set_memory_region_test.c b/tools/testing/selftests/kvm/set_memory_region_test.c
> new file mode 100644
> index 000000000000..c9603b95ccf7
> --- /dev/null
> +++ b/tools/testing/selftests/kvm/set_memory_region_test.c
> @@ -0,0 +1,142 @@
> +// SPDX-License-Identifier: GPL-2.0
> +#define _GNU_SOURCE /* for program_invocation_short_name */
> +#include <fcntl.h>
> +#include <pthread.h>
> +#include <sched.h>
> +#include <signal.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <sys/ioctl.h>
> +
> +#include <linux/compiler.h>
> +
> +#include <test_util.h>
> +#include <kvm_util.h>
> +#include <processor.h>
> +
> +#define VCPU_ID 0
> +
> +/*
> + * Somewhat arbitrary location and slot, intended to not overlap anything.  The
> + * location and size are specifically 2mb sized/aligned so that the initial
> + * region corresponds to exactly one large page (on x86 and arm64).
> + */
> +#define MEM_REGION_GPA		0xc0000000
> +#define MEM_REGION_SIZE		0x200000
> +#define MEM_REGION_SLOT		10
> +
> +static void guest_code(void)
> +{
> +	uint64_t val;
> +
> +	do {
> +		val = READ_ONCE(*((uint64_t *)MEM_REGION_GPA));
> +	} while (!val);
> +
> +	if (val != 1)
> +		ucall(UCALL_ABORT, 1, val);
> +
> +	GUEST_DONE();
> +}
> +
> +static void *vcpu_worker(void *data)
> +{
> +	struct kvm_vm *vm = data;
> +	struct kvm_run *run;
> +	struct ucall uc;
> +	uint64_t cmd;
> +
> +	/*
> +	 * Loop until the guest is done.  Re-enter the guest on all MMIO exits,
> +	 * which will occur if the guest attempts to access a memslot while it
> +	 * is being moved.
> +	 */
> +	run = vcpu_state(vm, VCPU_ID);
> +	do {
> +		vcpu_run(vm, VCPU_ID);
> +	} while (run->exit_reason == KVM_EXIT_MMIO);
> +
> +	TEST_ASSERT(run->exit_reason == KVM_EXIT_IO,
> +		    "Unexpected exit reason = %d", run->exit_reason);


This will also not work for s390. Maybe just make this test x86 specific for now?


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

WARNING: multiple messages have this Message-ID (diff)
From: Christian Borntraeger <borntraeger@de.ibm.com>
To: Sean Christopherson <sean.j.christopherson@intel.com>,
	James Hogan <jhogan@kernel.org>,
	Paul Mackerras <paulus@ozlabs.org>,
	Janosch Frank <frankja@linux.ibm.com>,
	Paolo Bonzini <pbonzini@redhat.com>,
	Marc Zyngier <maz@kernel.org>
Cc: "David Hildenbrand" <david@redhat.com>,
	"Cornelia Huck" <cohuck@redhat.com>,
	"Vitaly Kuznetsov" <vkuznets@redhat.com>,
	"Wanpeng Li" <wanpengli@tencent.com>,
	"Jim Mattson" <jmattson@google.com>,
	"Joerg Roedel" <joro@8bytes.org>,
	"James Morse" <james.morse@arm.com>,
	"Julien Thierry" <julien.thierry.kdev@gmail.com>,
	"Suzuki K Poulose" <suzuki.poulose@arm.com>,
	linux-mips@vger.kernel.org, kvm-ppc@vger.kernel.org,
	kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
	kvmarm@lists.cs.columbia.edu, linux-kernel@vger.kernel.org,
	"Christoffer Dall" <christoffer.dall@arm.com>,
	"Philippe Mathieu-Daudé" <f4bug@amsat.org>
Subject: Re: [PATCH v4 19/19] KVM: selftests: Add test for KVM_SET_USER_MEMORY_REGION
Date: Wed, 18 Dec 2019 11:39:43 +0000	[thread overview]
Message-ID: <f962fafb-3956-746f-d077-3dbcefaae7c8@de.ibm.com> (raw)
In-Reply-To: <20191217204041.10815-20-sean.j.christopherson@intel.com>



On 17.12.19 21:40, Sean Christopherson wrote:
> Add a KVM selftest to test moving the base gfn of a userspace memory
> region.  The test is primarily targeted at x86 to verify its memslot
> metadata is correctly updated, but also provides basic functionality
> coverage on other architectures.
> 
> Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
> ---
>  tools/testing/selftests/kvm/.gitignore        |   1 +
>  tools/testing/selftests/kvm/Makefile          |   3 +
>  .../testing/selftests/kvm/include/kvm_util.h  |   1 +
>  tools/testing/selftests/kvm/lib/kvm_util.c    |  30 ++++
>  .../selftests/kvm/set_memory_region_test.c    | 142 ++++++++++++++++++
>  5 files changed, 177 insertions(+)
>  create mode 100644 tools/testing/selftests/kvm/set_memory_region_test.c
> 
> diff --git a/tools/testing/selftests/kvm/.gitignore b/tools/testing/selftests/kvm/.gitignore
> index 30072c3f52fb..6f60ceb81440 100644
> --- a/tools/testing/selftests/kvm/.gitignore
> +++ b/tools/testing/selftests/kvm/.gitignore
> @@ -17,3 +17,4 @@
>  /clear_dirty_log_test
>  /dirty_log_test
>  /kvm_create_max_vcpus
> +/set_memory_region_test
> diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile
> index 3138a916574a..01c79e02c5b7 100644
> --- a/tools/testing/selftests/kvm/Makefile
> +++ b/tools/testing/selftests/kvm/Makefile
> @@ -29,15 +29,18 @@ TEST_GEN_PROGS_x86_64 += x86_64/xss_msr_test
>  TEST_GEN_PROGS_x86_64 += clear_dirty_log_test
>  TEST_GEN_PROGS_x86_64 += dirty_log_test
>  TEST_GEN_PROGS_x86_64 += kvm_create_max_vcpus
> +TEST_GEN_PROGS_x86_64 += set_memory_region_test
> 
>  TEST_GEN_PROGS_aarch64 += clear_dirty_log_test
>  TEST_GEN_PROGS_aarch64 += dirty_log_test
>  TEST_GEN_PROGS_aarch64 += kvm_create_max_vcpus
> +TEST_GEN_PROGS_aarch64 += set_memory_region_test
> 
>  TEST_GEN_PROGS_s390x = s390x/memop
>  TEST_GEN_PROGS_s390x += s390x/sync_regs_test
>  TEST_GEN_PROGS_s390x += dirty_log_test
>  TEST_GEN_PROGS_s390x += kvm_create_max_vcpus
> +TEST_GEN_PROGS_s390x += set_memory_region_test
> 
>  TEST_GEN_PROGS += $(TEST_GEN_PROGS_$(UNAME_M))
>  LIBKVM += $(LIBKVM_$(UNAME_M))
> diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing/selftests/kvm/include/kvm_util.h
> index 29cccaf96baf..15d3b8690ffb 100644
> --- a/tools/testing/selftests/kvm/include/kvm_util.h
> +++ b/tools/testing/selftests/kvm/include/kvm_util.h
> @@ -100,6 +100,7 @@ int _vcpu_ioctl(struct kvm_vm *vm, uint32_t vcpuid, unsigned long ioctl,
>  		void *arg);
>  void vm_ioctl(struct kvm_vm *vm, unsigned long ioctl, void *arg);
>  void vm_mem_region_set_flags(struct kvm_vm *vm, uint32_t slot, uint32_t flags);
> +void vm_mem_region_move(struct kvm_vm *vm, uint32_t slot, uint64_t new_gpa);
>  void vm_vcpu_add(struct kvm_vm *vm, uint32_t vcpuid);
>  vm_vaddr_t vm_vaddr_alloc(struct kvm_vm *vm, size_t sz, vm_vaddr_t vaddr_min,
>  			  uint32_t data_memslot, uint32_t pgd_memslot);
> diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
> index 41cf45416060..464a75ce9843 100644
> --- a/tools/testing/selftests/kvm/lib/kvm_util.c
> +++ b/tools/testing/selftests/kvm/lib/kvm_util.c
> @@ -756,6 +756,36 @@ void vm_mem_region_set_flags(struct kvm_vm *vm, uint32_t slot, uint32_t flags)
>  		ret, errno, slot, flags);
>  }
> 
> +/*
> + * VM Memory Region Move
> + *
> + * Input Args:
> + *   vm - Virtual Machine
> + *   slot - Slot of the memory region to move
> + *   flags - Starting guest physical address
> + *
> + * Output Args: None
> + *
> + * Return: None
> + *
> + * Change the gpa of a memory region.
> + */
> +void vm_mem_region_move(struct kvm_vm *vm, uint32_t slot, uint64_t new_gpa)
> +{
> +	struct userspace_mem_region *region;
> +	int ret;
> +
> +	region = memslot2region(vm, slot);
> +
> +	region->region.guest_phys_addr = new_gpa;
> +
> +	ret = ioctl(vm->fd, KVM_SET_USER_MEMORY_REGION, &region->region);
> +
> +	TEST_ASSERT(!ret, "KVM_SET_USER_MEMORY_REGION failed\n"
> +		    "ret: %i errno: %i slot: %u flags: 0x%x",
> +		    ret, errno, slot, new_gpa);
> +}
> +
>  /*
>   * VCPU mmap Size
>   *
> diff --git a/tools/testing/selftests/kvm/set_memory_region_test.c b/tools/testing/selftests/kvm/set_memory_region_test.c
> new file mode 100644
> index 000000000000..c9603b95ccf7
> --- /dev/null
> +++ b/tools/testing/selftests/kvm/set_memory_region_test.c
> @@ -0,0 +1,142 @@
> +// SPDX-License-Identifier: GPL-2.0
> +#define _GNU_SOURCE /* for program_invocation_short_name */
> +#include <fcntl.h>
> +#include <pthread.h>
> +#include <sched.h>
> +#include <signal.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <sys/ioctl.h>
> +
> +#include <linux/compiler.h>
> +
> +#include <test_util.h>
> +#include <kvm_util.h>
> +#include <processor.h>
> +
> +#define VCPU_ID 0
> +
> +/*
> + * Somewhat arbitrary location and slot, intended to not overlap anything.  The
> + * location and size are specifically 2mb sized/aligned so that the initial
> + * region corresponds to exactly one large page (on x86 and arm64).
> + */
> +#define MEM_REGION_GPA		0xc0000000
> +#define MEM_REGION_SIZE		0x200000
> +#define MEM_REGION_SLOT		10
> +
> +static void guest_code(void)
> +{
> +	uint64_t val;
> +
> +	do {
> +		val = READ_ONCE(*((uint64_t *)MEM_REGION_GPA));
> +	} while (!val);
> +
> +	if (val != 1)
> +		ucall(UCALL_ABORT, 1, val);
> +
> +	GUEST_DONE();
> +}
> +
> +static void *vcpu_worker(void *data)
> +{
> +	struct kvm_vm *vm = data;
> +	struct kvm_run *run;
> +	struct ucall uc;
> +	uint64_t cmd;
> +
> +	/*
> +	 * Loop until the guest is done.  Re-enter the guest on all MMIO exits,
> +	 * which will occur if the guest attempts to access a memslot while it
> +	 * is being moved.
> +	 */
> +	run = vcpu_state(vm, VCPU_ID);
> +	do {
> +		vcpu_run(vm, VCPU_ID);
> +	} while (run->exit_reason = KVM_EXIT_MMIO);
> +
> +	TEST_ASSERT(run->exit_reason = KVM_EXIT_IO,
> +		    "Unexpected exit reason = %d", run->exit_reason);


This will also not work for s390. Maybe just make this test x86 specific for now?

  parent reply	other threads:[~2019-12-18 11:39 UTC|newest]

Thread overview: 160+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-12-17 20:40 [PATCH v4 00/19] KVM: Dynamically size memslot arrays Sean Christopherson
2019-12-17 20:40 ` Sean Christopherson
2019-12-17 20:40 ` Sean Christopherson
2019-12-17 20:40 ` Sean Christopherson
2019-12-17 20:40 ` [PATCH v4 01/19] KVM: x86: Allocate new rmap and large page tracking when moving memslot Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:48   ` Sean Christopherson
2019-12-17 20:48     ` Sean Christopherson
2019-12-17 20:48     ` Sean Christopherson
2019-12-17 20:48     ` Sean Christopherson
2019-12-17 20:50     ` Sean Christopherson
2019-12-17 21:56   ` Peter Xu
2019-12-17 21:56     ` Peter Xu
2019-12-17 21:56     ` Peter Xu
2019-12-17 21:56     ` Peter Xu
2019-12-17 22:20     ` Sean Christopherson
2019-12-17 22:20       ` Sean Christopherson
2019-12-17 22:20       ` Sean Christopherson
2019-12-17 22:20       ` Sean Christopherson
2019-12-17 22:37       ` Peter Xu
2019-12-17 22:37         ` Peter Xu
2019-12-17 22:37         ` Peter Xu
2019-12-17 22:37         ` Peter Xu
2019-12-17 20:40 ` [PATCH v4 02/19] KVM: Reinstall old memslots if arch preparation fails Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40 ` [PATCH v4 03/19] KVM: Don't free new memslot if allocation of said memslot fails Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40 ` [PATCH v4 04/19] KVM: PPC: Move memslot memory allocation into prepare_memory_region() Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40 ` [PATCH v4 05/19] KVM: x86: Allocate memslot resources during prepare_memory_region() Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 22:07   ` Peter Xu
2019-12-17 22:07     ` Peter Xu
2019-12-17 22:07     ` Peter Xu
2019-12-17 22:07     ` Peter Xu
2019-12-17 20:40 ` [PATCH v4 06/19] KVM: Drop kvm_arch_create_memslot() Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40 ` [PATCH v4 07/19] KVM: Explicitly free allocated-but-unused dirty bitmap Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 22:24   ` Peter Xu
2019-12-17 22:24     ` Peter Xu
2019-12-17 22:24     ` Peter Xu
2019-12-17 22:24     ` Peter Xu
2019-12-17 22:51     ` Sean Christopherson
2019-12-17 22:51       ` Sean Christopherson
2019-12-17 22:51       ` Sean Christopherson
2019-12-17 22:51       ` Sean Christopherson
2019-12-18 16:17       ` Peter Xu
2019-12-18 16:17         ` Peter Xu
2019-12-18 16:17         ` Peter Xu
2019-12-18 16:17         ` Peter Xu
2019-12-17 20:40 ` [PATCH v4 08/19] KVM: Refactor error handling for setting memory region Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40 ` [PATCH v4 09/19] KVM: Move setting of memslot into helper routine Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40 ` [PATCH v4 10/19] KVM: Drop "const" attribute from old memslot in commit_memory_region() Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40 ` [PATCH v4 11/19] KVM: x86: Free arrays for old memslot when moving memslot's base gfn Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 22:48   ` Peter Xu
2019-12-17 22:48     ` Peter Xu
2019-12-17 22:48     ` Peter Xu
2019-12-17 22:48     ` Peter Xu
2019-12-17 20:40 ` [PATCH v4 12/19] KVM: Move memslot deletion to helper function Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40 ` [PATCH v4 13/19] KVM: Simplify kvm_free_memslot() and all its descendents Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40 ` [PATCH v4 14/19] KVM: Clean up local variable usage in __kvm_set_memory_region() Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40 ` [PATCH v4 15/19] KVM: Provide common implementation for generic dirty log functions Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40 ` [PATCH v4 16/19] KVM: Ensure validity of memslot with respect to kvm_get_dirty_log() Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-24 18:19   ` Peter Xu
2019-12-24 18:19     ` Peter Xu
2019-12-24 18:19     ` Peter Xu
2019-12-24 18:19     ` Peter Xu
2020-01-14 18:25     ` Sean Christopherson
2020-01-14 18:25       ` Sean Christopherson
2020-01-14 18:25       ` Sean Christopherson
2020-01-14 18:25       ` Sean Christopherson
2020-02-06 22:03       ` Peter Xu
2020-02-06 22:03         ` Peter Xu
2020-02-06 22:03         ` Peter Xu
2020-02-06 22:03         ` Peter Xu
2020-02-07 18:52         ` Sean Christopherson
2020-02-07 18:52           ` Sean Christopherson
2020-02-07 18:52           ` Sean Christopherson
2020-02-07 18:52           ` Sean Christopherson
2019-12-17 20:40 ` [PATCH v4 17/19] KVM: Terminate memslot walks via used_slots Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40 ` [PATCH v4 18/19] KVM: Dynamically size memslot array based on number of used slots Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40 ` [PATCH v4 19/19] KVM: selftests: Add test for KVM_SET_USER_MEMORY_REGION Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-17 20:40   ` Sean Christopherson
2019-12-18 11:29   ` Christian Borntraeger
2019-12-18 11:29     ` Christian Borntraeger
2019-12-18 11:29     ` Christian Borntraeger
2019-12-18 11:29     ` Christian Borntraeger
2019-12-18 11:39   ` Christian Borntraeger [this message]
2019-12-18 11:39     ` Christian Borntraeger
2019-12-18 11:39     ` Christian Borntraeger
2019-12-18 11:39     ` Christian Borntraeger
2019-12-18 16:39     ` Sean Christopherson
2019-12-18 16:39       ` Sean Christopherson
2019-12-18 16:39       ` Sean Christopherson
2019-12-18 16:39       ` Sean Christopherson
2020-03-24  9:43       ` Christian Borntraeger
2020-03-24  9:43         ` Christian Borntraeger
2020-03-24  9:43         ` Christian Borntraeger
2020-03-24  9:43         ` Christian Borntraeger
2020-03-24 18:20         ` Sean Christopherson
2020-03-24 18:20           ` Sean Christopherson
2020-03-24 18:20           ` Sean Christopherson
2020-03-24 18:20           ` Sean Christopherson
2019-12-18 11:40 ` [PATCH v4 00/19] KVM: Dynamically size memslot arrays Christian Borntraeger
2019-12-18 11:40   ` Christian Borntraeger
2019-12-18 11:40   ` Christian Borntraeger
2019-12-18 11:40   ` Christian Borntraeger
2019-12-18 18:10 ` Marc Zyngier
2019-12-18 18:10   ` Marc Zyngier
2019-12-18 18:10   ` Marc Zyngier

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=f962fafb-3956-746f-d077-3dbcefaae7c8@de.ibm.com \
    --to=borntraeger@de.ibm.com \
    --cc=christoffer.dall@arm.com \
    --cc=cohuck@redhat.com \
    --cc=david@redhat.com \
    --cc=f4bug@amsat.org \
    --cc=frankja@linux.ibm.com \
    --cc=james.morse@arm.com \
    --cc=jhogan@kernel.org \
    --cc=jmattson@google.com \
    --cc=joro@8bytes.org \
    --cc=julien.thierry.kdev@gmail.com \
    --cc=kvm-ppc@vger.kernel.org \
    --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=linux-mips@vger.kernel.org \
    --cc=maz@kernel.org \
    --cc=paulus@ozlabs.org \
    --cc=pbonzini@redhat.com \
    --cc=sean.j.christopherson@intel.com \
    --cc=suzuki.poulose@arm.com \
    --cc=vkuznets@redhat.com \
    --cc=wanpengli@tencent.com \
    /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.