[PATCH 05/20] KVM: selftests: Use goto instead of do-while to retry finding unused physical pages

Gautam Menghani gautam at linux.ibm.com
Wed Sep 2 10:50:10 PDT 2026


On Wed, Aug 26, 2026 at 04:04:56PM -0700, Sean Christopherson wrote:
> From: Nicholas Piggin <npiggin at gmail.com>
> 
> Rework the core loop of the physical page allocator to use a goto instead
> of do-while loop when retrying with a new base address.  The do-while loop
> obviously works, but it obfuscates the success vs. failure paths, and in
> general is convoluted.
> 
> For all intents and purposes, no functional change intended.
> 
> Signed-off-by: Nicholas Piggin <npiggin at gmail.com>
> [Rebased to latest mainline tree]
> Signed-off-by: Ritesh Harjani (IBM) <ritesh.list at gmail.com>
> [sean: separate from alignment change, use enomem label, write changelog]
> Signed-off-by: Sean Christopherson <seanjc at google.com>
> ---
>  tools/testing/selftests/kvm/lib/kvm_util.c | 32 +++++++++++-----------
>  1 file changed, 16 insertions(+), 16 deletions(-)
> 
> diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
> index b071d77dd301..bbf6d7684c0c 100644
> --- a/tools/testing/selftests/kvm/lib/kvm_util.c
> +++ b/tools/testing/selftests/kvm/lib/kvm_util.c
> @@ -2049,23 +2049,15 @@ gpa_t __vm_phy_pages_alloc(struct kvm_vm *vm, size_t nr_pages, gpa_t min_gpa,
>  	TEST_ASSERT(!protected || region->protected_phy_pages,
>  		    "Region doesn't support protected memory");
>  
> -	base = pg = min_gpa >> vm->page_shift;
> -	do {
> -		for (; pg < base + nr_pages; ++pg) {
> -			if (!sparsebit_is_set(region->unused_phy_pages, pg)) {
> -				base = pg = sparsebit_next_set(region->unused_phy_pages, pg);
> -				break;
> -			}
> +	base = min_gpa >> vm->page_shift;
> +again:
> +	for (pg = base; pg < base + nr_pages; ++pg) {
> +		if (!sparsebit_is_set(region->unused_phy_pages, pg)) {
> +			base = sparsebit_next_set(region->unused_phy_pages, pg);
> +			if (!base)
> +				goto enomem;
> +			goto again;
>  		}
> -	} while (pg && pg != base + nr_pages);
> -
> -	if (pg == 0) {
> -		fprintf(stderr, "No guest physical page available, "
> -			"min_gpa: 0x%lx page_size: 0x%x memslot: %u\n",
> -			min_gpa, vm->page_size, memslot);
> -		fputs("---- vm dump ----\n", stderr);
> -		vm_dump(stderr, vm, 2);
> -		abort();
>  	}
>  
>  	for (pg = base; pg < base + nr_pages; ++pg) {
> @@ -2075,6 +2067,14 @@ gpa_t __vm_phy_pages_alloc(struct kvm_vm *vm, size_t nr_pages, gpa_t min_gpa,
>  	}
>  
>  	return base * vm->page_size;
> +
> +enomem:
> +	fprintf(stderr, "No guest physical page available, min_gpa: 0x%lx page_size: 0x%x memslot: %u\n",
> +		min_gpa, vm->page_size, memslot);
> +	fputs("---- vm dump ----\n", stderr);
> +	vm_dump(stderr, vm, 2);
> +	abort();
> +	__builtin_unreachable();
>  }
>  
>  gpa_t vm_phy_page_alloc(struct kvm_vm *vm, gpa_t min_gpa, u32 memslot)
> -- 
> 2.55.0.887.g758fc8c411-goog
> 


Acked-by: Gautam Menghani <gautam at linux.ibm.com>




More information about the linux-arm-kernel mailing list