From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pj1-f45.google.com (mail-pj1-f45.google.com [209.85.216.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7221E40680B for ; Wed, 10 Jun 2026 12:47:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.45 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781095672; cv=none; b=CxHZW/19BmWSiqH8epDd47tiUgiAao3SsD5hfCT7g7yjG5vQbLBQU+bKFlobRyJN5o5E2UNYj25GNEd83lvs+6+/hsc/B92EFjQwGfiEDocdpkaVGVZvUkrizcQZGv/zRBEmTDD/u0USMXGbE/oFnhk+deGwsjn7wCjGwKC5FAU= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781095672; c=relaxed/simple; bh=5W+tGp30D38VoHhXvVJ/TBcgn8TA0xRvKMpQjGDRMF0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Gx+P0zlofhfMy5Ljj3trnqTOIEX/7Vw3Eum1wCtmTpjkps4K5RtlEy/RrvtbZORaOKQUtYqfgm1j5qG754UhaAh7IMXOfwnPhMuojJjEw1l83biYELabBb9QQxbv8jxlo/UfveQ2S+v/ufJ0mDkW5oD8cUh5ipiImWPyW2dJ+t8= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=oWLZhcKf; arc=none smtp.client-ip=209.85.216.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="oWLZhcKf" Received: by mail-pj1-f45.google.com with SMTP id 98e67ed59e1d1-36bdb11bf8bso3959334a91.0 for ; Wed, 10 Jun 2026 05:47:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1781095670; x=1781700470; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=k0vOlqOnh5jkFuU9tmOA1F8NP87zeNaswUFOalPtmFY=; b=oWLZhcKfY+BsZl1ULQLS04XMh4Mw4EYgjM7ZJRcoMWrtBWg9Hs1xksTEq7Y7KgJDUc ujxWTZv28HiObzle2yXNTwRwHzHbumIuuXj6Sp9XCwqaLfX5pDzB3k6bUry7tdH3+qNW DpFqddaC2y1CApztHzQWV8Qmq90sY5Fm3NKNOyotSHZ2PFCm6aEFRJHvXQzpCrbluPb8 /E6NYiMw4Lp4cn3uyHOGSQIn+QXGZaSowBqma+hRFniayyk1VsQhJ/NucN5pIqVqQCUf XxvBOExjo4o0qizRIZzjzLxZ8+2vb7izS+WA737vEQ4N2AujW/BgZxLlhjM4tn5Eqe6d khCQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781095670; x=1781700470; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=k0vOlqOnh5jkFuU9tmOA1F8NP87zeNaswUFOalPtmFY=; b=dCoriVhcTCedMVzuhxM2ifAW4MKCRHXmoNHUQO2zV5KBw+UMG3K/+0mZe35alCLgQB +2tlAoUcuQH9zN2rErchxApBonRhPjLWxssrKKCK7rCMC136f+F3jq0Rrlx/MYRhhy3F zcPtzWlbJbWARhC4TMlYZUhjCtFOZXZ1cixfrrz/BBqUbydfJ5PPx0RMPzvOZ0Cf9iTp S/nrrqKIAEc0/c6bJea5O1Cb2+xIPhu8SLtQ6gU5GzF4TmU1DPYC4kDNACrsIPhhCGI0 AaNv0NEWeRPiED75tjzMn+i9+vPb/uil8WzD3fM0vfW/3z/UP0XblgqeOMJwKHJ0iLLp 4Olw== X-Forwarded-Encrypted: i=1; AFNElJ8lsCLHIbjFMRpaFqe7O6QD+8yJXt0TISE+ESlmqOzBOZSlH6STg8R22judHsL2b+FDhOPPpF37zwRwass=@vger.kernel.org X-Gm-Message-State: AOJu0YzzZIv5LeI24ivn9d0SyARDm+GXRrYN1Qqu4E/64dsKZvq5nk5O 4D897xvZptBV5Iw7u4KLnilNcoQ8gYxn2DwFqWWqYTa5iNmfAPEablGP X-Gm-Gg: Acq92OEw3WNn/x55Qjh5q8tTP772/G23M1h6apGJwm5ZWwNSl8S4SkFbzx0XRnIjeL8 ZXXmHelBMPz7410etOdRaaNU8fdlpcm5ICOtHleoyE3e/WXSbIe/f8H0Z8CwjzcdQmVwrogwkyD XQuYXdXDPsqjhp3TNy1ZdyKBdVrL03CXyIkwmpg48Iczil67BMSHDFAEAdqp+CW4auFR3pIAR2p hD7b+y1DYz8/JF3mL7ngHVJVcP1Vzl5qLqCUnbLvIQ0VJ9akVza4DkG9ByBHRl77VIaCs/gvgmb YSCxLl1cUNV+Scv0O0D0n3xfcLjY6J3Z12JgPrMBGQssPj6W9Gm/iDmIz2F+rEDFhXJrCcoQzsB 7J36JTCPcbuNhs2vN1snEfV4mVetDyhP/0JMMSTIoQzZdwgUJx8zr1Ze9685oIXYlmlc9U413AB TKYMxB9PPJjyxoyE1GKgXDZPQLWCiyjF7kpgb2Pb5cghwtqFLY1fWlw22/zng5vA== X-Received: by 2002:a17:90b:2f85:b0:368:147f:bd2b with SMTP id 98e67ed59e1d1-370f0e488f3mr28109280a91.23.1781095669630; Wed, 10 Jun 2026 05:47:49 -0700 (PDT) Received: from localhost.localdomain ([171.76.83.25]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-37624b83589sm3783554a91.16.2026.06.10.05.47.44 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Wed, 10 Jun 2026 05:47:48 -0700 (PDT) From: "Ritesh Harjani (IBM)" To: kvm@vger.kernel.org, Paolo Bonzini Cc: linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org, Michael Ellerman , Christophe Leroy , Anushree Mathur , Venkat Rao Bagalkote , Harsh Prateek Bora , Sean Christopherson , Ackerley Tng , Christian Borntraeger , Claudio Imbrenda , Nicholas Piggin , "Ritesh Harjani (IBM)" Subject: [PATCH v3 RESEND 02/10] KVM: selftests: Add aligned guest physical page allocator Date: Wed, 10 Jun 2026 18:17:18 +0530 Message-ID: X-Mailer: git-send-email 2.50.1 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: Nicholas Piggin powerpc will require this to allocate MMU tables in guest memory that are larger than guest base page size. Signed-off-by: Nicholas Piggin [Rebased to latest mainline tree] Signed-off-by: Ritesh Harjani (IBM) --- .../testing/selftests/kvm/include/kvm_util.h | 20 +++++++++-- tools/testing/selftests/kvm/lib/kvm_util.c | 33 +++++++++---------- 2 files changed, 33 insertions(+), 20 deletions(-) diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing/selftests/kvm/include/kvm_util.h index 3666a8530f31..c515c918c2c9 100644 --- a/tools/testing/selftests/kvm/include/kvm_util.h +++ b/tools/testing/selftests/kvm/include/kvm_util.h @@ -991,8 +991,8 @@ void kvm_gsi_routing_write(struct kvm_vm *vm, struct kvm_irq_routing *routing); const char *exit_reason_str(unsigned int exit_reason); gpa_t vm_phy_page_alloc(struct kvm_vm *vm, gpa_t min_gpa, u32 memslot); -gpa_t __vm_phy_pages_alloc(struct kvm_vm *vm, size_t num, gpa_t min_gpa, - u32 memslot, bool protected); +gpa_t __vm_phy_pages_alloc(struct kvm_vm *vm, size_t num, size_t align, + gpa_t min_gpa, u32 memslot, bool protected); gpa_t vm_alloc_page_table(struct kvm_vm *vm); static inline gpa_t vm_phy_pages_alloc(struct kvm_vm *vm, size_t num, @@ -1003,10 +1003,24 @@ static inline gpa_t vm_phy_pages_alloc(struct kvm_vm *vm, size_t num, * protected memory, as the majority of memory for such VMs is * protected, i.e. using shared memory is effectively opt-in. */ - return __vm_phy_pages_alloc(vm, num, min_gpa, memslot, + return __vm_phy_pages_alloc(vm, num, 1, min_gpa, memslot, vm_arch_has_protected_memory(vm)); } +static inline gpa_t vm_phy_pages_alloc_align(struct kvm_vm *vm, size_t num, + size_t align, gpa_t min_gpa, + u32 memslot) +{ + /* + * By default, allocate memory as protected for VMs that support + * protected memory, as the majority of memory for such VMs is + * protected, i.e. using shared memory is effectively opt-in. + */ + return __vm_phy_pages_alloc(vm, num, align, min_gpa, memslot, + vm_arch_has_protected_memory(vm)); +} + + /* * ____vm_create() does KVM_CREATE_VM and little else. __vm_create() also * loads the test binary into guest memory and creates an IRQ chip (x86 only). diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c index e08967ef7b7b..ac7215824203 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -1442,7 +1442,7 @@ static gva_t ____vm_alloc(struct kvm_vm *vm, size_t sz, gva_t min_gva, u64 pages = (sz >> vm->page_shift) + ((sz % vm->page_size) != 0); virt_pgd_alloc(vm); - gpa_t gpa = __vm_phy_pages_alloc(vm, pages, + gpa_t gpa = __vm_phy_pages_alloc(vm, pages, 1, KVM_UTIL_MIN_PFN * vm->page_size, vm->memslots[type], protected); @@ -2021,7 +2021,7 @@ const char *exit_reason_str(unsigned int exit_reason) * and their base address is returned. A TEST_ASSERT failure occurs if * not enough pages are available at or above min_gpa. */ -gpa_t __vm_phy_pages_alloc(struct kvm_vm *vm, size_t num, +gpa_t __vm_phy_pages_alloc(struct kvm_vm *vm, size_t num, size_t align, gpa_t min_gpa, u32 memslot, bool protected) { @@ -2039,23 +2039,22 @@ gpa_t __vm_phy_pages_alloc(struct kvm_vm *vm, size_t num, TEST_ASSERT(!protected || region->protected_phy_pages, "Region doesn't support protected memory"); - base = pg = min_gpa >> vm->page_shift; - do { - for (; pg < base + num; ++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: + base = (base + align - 1) & ~(align - 1); + for (pg = base; pg < base + num; ++pg) { + if (!sparsebit_is_set(region->unused_phy_pages, pg)) { + base = sparsebit_next_set(region->unused_phy_pages, pg); + if (!base) { + 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(); } + goto again; } - } while (pg && pg != base + num); - - 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 + num; ++pg) { -- 2.50.1 (Apple Git-155)