| Message ID | 20260902164123.2546762-6-seanjc@google.com |
|---|---|
| State | New |
| Headers | show |
| Series | KVM: selftests: PPC pre-enabling | expand |
On Wed, Sep 02, 2026 at 09:41:08AM -0700, Sean Christopherson wrote: > From: Nicholas Piggin <npiggin@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@gmail.com> > [Rebased to latest mainline tree] > Signed-off-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com> > [sean: separate from alignment change, use enomem label, write changelog] > Tested-by: Itaru Kitayama <itaru.kitayama@fujitsu.com> > Signed-off-by: Sean Christopherson <seanjc@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.966.g6673acef38-goog > Acked-by: Gautam Menghani <gautam@linux.ibm.com>
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)