All of lore.kernel.org
 help / color / mirror / Atom feed
From: Suzuki K Poulose <suzuki.poulose@arm.com>
To: Andrew Jones <drjones@redhat.com>,
	kvm@vger.kernel.org, kvmarm@lists.cs.columbia.edu
Cc: marc.zyngier@arm.com, pbonzini@redhat.com
Subject: Re: [PATCH 00/13] kvm: selftests: add aarch64 framework and dirty
Date: Wed, 19 Sep 2018 14:13:48 +0100	[thread overview]
Message-ID: <f48129c0-4eb4-9803-a999-574f85acfab0@arm.com> (raw)
In-Reply-To: <20180919123738.yp6bncgwlpzhob2u@kamzik.brq.redhat.com>

Hi Drew,

On 09/19/2018 01:37 PM, Andrew Jones wrote:
> On Tue, Sep 18, 2018 at 07:54:23PM +0200, Andrew Jones wrote:
>> This series provides KVM selftests that test dirty log tracking on
>> AArch64 for both 4K and 64K guest page sizes. Additionally the
>> framework provides an easy way to test dirty log tracking with the
>> recently posted dynamic IPA and 52bit IPA series[1].
>>
>> The series breaks down into parts as follows:
>>
>>   01-02: generalize guest code to host userspace exit support by
>>          introducing "ucalls" - hypercalls to userspace
>>   03-05: prepare common code for a new architecture
>>   06-07: add virtual memory setup support for AArch64
>>      08: add vcpu setup support for AArch64
>>      09: port the dirty log test to AArch64
>>   10-11: add 64K guest page size support for the dirty log test
>>   12-13: prepare the dirty log test to also test > 40-bit guest
>>          physical address setups by allowing the test memory
>>          region to be placed at the top of physical memory
>>
>> [1] https://www.spinics.net/lists/arm-kernel/msg676819.html
>>
> 
> Hi Suzuki,
> 
> Here's an [untested] add-on patch that should provide the means to
> test dirty logging with a 52-bit guest physical address space.
> Hopefully it'll be as easy as compiling and then running with
> 
>   $ ./dirty_log_test -t

I will give this series a spin with 52 IPA and let you know.

Thanks
Suzuki

> 
> Thanks,
> drew
> 
>  From 09ea1d724551a95ef9962d357049ef21ea8c77e8 Mon Sep 17 00:00:00 2001
> From: Andrew Jones <drjones@redhat.com>
> Date: Wed, 19 Sep 2018 14:23:30 +0200
> Subject: [PATCH] kvm: selftests: aarch64: dirty_log_test: test with 52 PA-bits
> 
> Signed-off-by: Andrew Jones <drjones@redhat.com>
> ---
>   tools/testing/selftests/kvm/dirty_log_test.c  | 24 ++++++++++++++++---
>   .../testing/selftests/kvm/include/kvm_util.h  |  2 ++
>   tools/testing/selftests/kvm/lib/kvm_util.c    | 17 +++++++++----
>   .../selftests/kvm/lib/kvm_util_internal.h     |  1 +
>   4 files changed, 36 insertions(+), 8 deletions(-)
> 
> diff --git a/tools/testing/selftests/kvm/dirty_log_test.c b/tools/testing/selftests/kvm/dirty_log_test.c
> index d59820cc2d39..c11c76e09766 100644
> --- a/tools/testing/selftests/kvm/dirty_log_test.c
> +++ b/tools/testing/selftests/kvm/dirty_log_test.c
> @@ -82,6 +82,7 @@ static void guest_code(void)
>   static bool host_quit;
>   
>   /* Points to the test VM memory region on which we track dirty logs */
> +static uint8_t host_ipa_limit;
>   static void *host_test_mem;
>   static uint64_t host_num_pages;
>   
> @@ -209,12 +210,14 @@ static void vm_dirty_log_verify(unsigned long *bmap)
>   }
>   
>   static struct kvm_vm *create_vm(enum vm_guest_mode mode, uint32_t vcpuid,
> -				uint64_t extra_mem_pages, void *guest_code)
> +				uint64_t extra_mem_pages, void *guest_code,
> +				unsigned long type)
>   {
>   	struct kvm_vm *vm;
>   	uint64_t extra_pg_pages = extra_mem_pages / 512 * 2;
>   
> -	vm = vm_create(mode, DEFAULT_GUEST_PHY_PAGES + extra_pg_pages, O_RDWR);
> +	vm = _vm_create(mode, DEFAULT_GUEST_PHY_PAGES + extra_pg_pages,
> +			O_RDWR, type);
>   	kvm_vm_elf_load(vm, program_invocation_name, 0, 0);
>   #ifdef __x86_64__
>   	vm_create_irqchip(vm);
> @@ -231,15 +234,22 @@ static void run_test(enum vm_guest_mode mode, unsigned long iterations,
>   	struct kvm_vm *vm;
>   	uint64_t max_gfn;
>   	unsigned long *bmap;
> +	unsigned long type = 0;
>   
>   	switch (mode) {
>   	case VM_MODE_P52V48_4K:
>   		guest_pa_bits = 52;
>   		guest_page_shift = 12;
> +#ifdef __aarch64__
> +		type = KVM_VM_TYPE_ARM_IPA_SIZE(52);
> +#endif
>   		break;
>   	case VM_MODE_P52V48_64K:
>   		guest_pa_bits = 52;
>   		guest_page_shift = 16;
> +#ifdef __aarch64__
> +		type = KVM_VM_TYPE_ARM_IPA_SIZE(52);
> +#endif
>   		break;
>   	case VM_MODE_P40V48_4K:
>   		guest_pa_bits = 40;
> @@ -273,7 +283,7 @@ static void run_test(enum vm_guest_mode mode, unsigned long iterations,
>   	bmap = bitmap_alloc(host_num_pages);
>   	host_bmap_track = bitmap_alloc(host_num_pages);
>   
> -	vm = create_vm(mode, VCPU_ID, guest_num_pages, guest_code);
> +	vm = create_vm(mode, VCPU_ID, guest_num_pages, guest_code, type);
>   
>   	/* Add an extra memory slot for testing dirty logging */
>   	vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS,
> @@ -392,6 +402,14 @@ int main(int argc, char *argv[])
>   	unsigned int mode;
>   	int opt, i;
>   
> +#ifdef __aarch64__
> +	host_ipa_limit = kvm_check_cap(KVM_CAP_ARM_VM_IPA_SIZE);
> +	if (host_ipa_limit == 52) {
> +		vm_guest_modes[VM_MODE_P52V48_4K].supported = 1;
> +		vm_guest_modes[VM_MODE_P52V48_64K].supported = 1;
> +	}
> +#endif
> +
>   	while ((opt = getopt(argc, argv, "hi:I:o:tm:")) != -1) {
>   		switch (opt) {
>   		case 'i':
> diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing/selftests/kvm/include/kvm_util.h
> index d76431322a30..5202fce337e3 100644
> --- a/tools/testing/selftests/kvm/include/kvm_util.h
> +++ b/tools/testing/selftests/kvm/include/kvm_util.h
> @@ -53,6 +53,8 @@ enum vm_mem_backing_src_type {
>   int kvm_check_cap(long cap);
>   
>   struct kvm_vm *vm_create(enum vm_guest_mode mode, uint64_t phy_pages, int perm);
> +struct kvm_vm *_vm_create(enum vm_guest_mode mode, uint64_t phy_pages,
> +			  int perm, unsigned long type);
>   void kvm_vm_free(struct kvm_vm *vmp);
>   void kvm_vm_restart(struct kvm_vm *vmp, int perm);
>   void kvm_vm_release(struct kvm_vm *vmp);
> diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
> index 542336db7b4f..e1805c9e0f39 100644
> --- a/tools/testing/selftests/kvm/lib/kvm_util.c
> +++ b/tools/testing/selftests/kvm/lib/kvm_util.c
> @@ -62,13 +62,13 @@ int kvm_check_cap(long cap)
>   	return ret;
>   }
>   
> -static void vm_open(struct kvm_vm *vm, int perm)
> +static void vm_open(struct kvm_vm *vm, int perm, unsigned long type)
>   {
>   	vm->kvm_fd = open(KVM_DEV_PATH, perm);
>   	if (vm->kvm_fd < 0)
>   		exit(KSFT_SKIP);
>   
> -	vm->fd = ioctl(vm->kvm_fd, KVM_CREATE_VM, NULL);
> +	vm->fd = ioctl(vm->kvm_fd, KVM_CREATE_VM, type);
>   	TEST_ASSERT(vm->fd >= 0, "KVM_CREATE_VM ioctl failed, "
>   		"rc: %i errno: %i", vm->fd, errno);
>   }
> @@ -101,7 +101,8 @@ _Static_assert(sizeof(vm_guest_mode_string)/sizeof(char *) == NUM_VM_MODES,
>    * descriptor to control the created VM is created with the permissions
>    * given by perm (e.g. O_RDWR).
>    */
> -struct kvm_vm *vm_create(enum vm_guest_mode mode, uint64_t phy_pages, int perm)
> +struct kvm_vm *_vm_create(enum vm_guest_mode mode, uint64_t phy_pages,
> +			  int perm, unsigned long type)
>   {
>   	struct kvm_vm *vm;
>   	int kvm_fd;
> @@ -110,7 +111,8 @@ struct kvm_vm *vm_create(enum vm_guest_mode mode, uint64_t phy_pages, int perm)
>   	TEST_ASSERT(vm != NULL, "Insufficent Memory");
>   
>   	vm->mode = mode;
> -	vm_open(vm, perm);
> +	vm->type = type;
> +	vm_open(vm, perm, type);
>   
>   	/* Setup mode specific traits. */
>   	switch (vm->mode) {
> @@ -166,6 +168,11 @@ struct kvm_vm *vm_create(enum vm_guest_mode mode, uint64_t phy_pages, int perm)
>   	return vm;
>   }
>   
> +struct kvm_vm *vm_create(enum vm_guest_mode mode, uint64_t phy_pages, int perm)
> +{
> +	return _vm_create(mode, phy_pages, perm, 0);
> +}
> +
>   /*
>    * VM Restart
>    *
> @@ -183,7 +190,7 @@ void kvm_vm_restart(struct kvm_vm *vmp, int perm)
>   {
>   	struct userspace_mem_region *region;
>   
> -	vm_open(vmp, perm);
> +	vm_open(vmp, perm, vmp->type);
>   	if (vmp->has_irqchip)
>   		vm_create_irqchip(vmp);
>   
> diff --git a/tools/testing/selftests/kvm/lib/kvm_util_internal.h b/tools/testing/selftests/kvm/lib/kvm_util_internal.h
> index 5e05fb98dc62..51a56102a5c9 100644
> --- a/tools/testing/selftests/kvm/lib/kvm_util_internal.h
> +++ b/tools/testing/selftests/kvm/lib/kvm_util_internal.h
> @@ -44,6 +44,7 @@ struct vcpu {
>   
>   struct kvm_vm {
>   	int mode;
> +	unsigned long type;
>   	int kvm_fd;
>   	int fd;
>   	unsigned int pgtable_levels;
> 

  reply	other threads:[~2018-09-19 13:13 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-09-18 17:54 [PATCH 00/13] kvm: selftests: add aarch64 framework and dirty Andrew Jones
2018-09-18 17:54 ` [PATCH 01/13] kvm: selftests: vcpu_setup: set cr4.osfxsr Andrew Jones
2018-09-18 17:54 ` [PATCH 02/13] kvm: selftests: introduce ucall Andrew Jones
2018-09-18 17:54 ` [PATCH 03/13] kvm: selftests: move arch-specific files to arch-specific locations Andrew Jones
2018-09-18 17:54 ` [PATCH 04/13] kvm: selftests: add cscope make target Andrew Jones
2018-09-18 17:54 ` [PATCH 05/13] kvm: selftests: tidy up kvm_util Andrew Jones
2018-09-18 17:54 ` [PATCH 06/13] kvm: selftests: add vm_phy_pages_alloc Andrew Jones
2018-09-18 17:54 ` [PATCH 07/13] kvm: selftests: add virt mem support for aarch64 Andrew Jones
2018-09-18 17:54 ` [PATCH 08/13] kvm: selftests: add vcpu " Andrew Jones
2018-09-18 17:54 ` [PATCH 09/13] kvm: selftests: port dirty_log_test to aarch64 Andrew Jones
2018-09-18 17:54 ` [PATCH 10/13] kvm: selftests: introduce new VM mode for 64K pages Andrew Jones
2018-09-18 17:54 ` [PATCH 11/13] kvm: selftests: dirty_log_test: also test 64K pages on aarch64 Andrew Jones
2018-09-18 17:54 ` [PATCH 12/13] kvm: selftests: stop lying to aarch64 tests about PA-bits Andrew Jones
2018-09-18 17:54 ` [PATCH 13/13] kvm: selftests: support high GPAs in dirty_log_test Andrew Jones
2018-09-19 12:37 ` [PATCH 00/13] kvm: selftests: add aarch64 framework and dirty Andrew Jones
2018-09-19 13:13   ` Suzuki K Poulose [this message]
2018-10-29 17:40 ` Christoffer Dall
2018-10-30 17:38   ` Andrew Jones
2018-10-30 17:50     ` Paolo Bonzini
2018-11-01  9:08     ` Christoffer Dall
2018-11-01  9:31       ` Andrew Jones

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=f48129c0-4eb4-9803-a999-574f85acfab0@arm.com \
    --to=suzuki.poulose@arm.com \
    --cc=drjones@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=kvmarm@lists.cs.columbia.edu \
    --cc=marc.zyngier@arm.com \
    --cc=pbonzini@redhat.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.