[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