From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pf1-f181.google.com (mail-pf1-f181.google.com [209.85.210.181]) (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 63D433F9260 for ; Fri, 15 May 2026 16:04:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.181 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778861087; cv=none; b=nuvE1V7CoBmn74XSkKg/zZi2e+wchBelfv5tYor6WHrk9uCQjAT0XKGDzJv77zPqmibOlrWdCyC2eUfHuQU/Q2Ea9hcr8E7ZKqEaTF0kNSIOqfBFl6radHXUYT7xXCalz6uZMZ2JXx1hnyazzSkTOWLZxRE3kAKe2TjmvurUsco= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778861087; c=relaxed/simple; bh=tG/vwPXG+NgCJqpeTpzbd4mkkNiN98tDPGGb1Pn/dzg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Xsp7lJEIpD1b3qUPn/fCmNvYUJN7GxdiVUmTP0IPvQ4HWKbNB1kqSbgIZ236k8dvyTKpp/xYlmW5I7lY6kcW5YLGxZ+86TjB57P3gett1uvS51rsRPY2cQogr15dFpNR1Z7m//YaUkqATfJ5HpmBxA0a4jXZdglHKSl/pRLGxm4= 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=P1CoDm84; arc=none smtp.client-ip=209.85.210.181 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="P1CoDm84" Received: by mail-pf1-f181.google.com with SMTP id d2e1a72fcca58-837b39eb078so6421859b3a.2 for ; Fri, 15 May 2026 09:04:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778861086; x=1779465886; 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=dYv7n7MNQFWGtdjlWPVxo0rnA4k4aMTlnbBv8oYiho8=; b=P1CoDm841RdLfhufFvZbcH5Z5jYygOD1GqrQNBCa5nC1iV13pRnCLUvq3TQ4kKSyvb H2YSnLdPNfAp0JzM8rCnv8Xq3mIVGXKntx47mUWR67PL7ncAaf9XXOxr+xLRjNn+9FSt FAik1aD+t6eIHo9/Aex8E9Z6B4mYzRD5SjCFxcjWN+9K8lgRoiBv8m5n99ylxQFa7xTU ZJQwKJsJmpw6JYR2/BIFb06LGYbQLtoZBL4CSUW9rVMUCIFKMfdYLqxx4ZhBDLJnifQC e/o9hPB2nKda9pIoLdgmMh60ImLCVVHJyK5gX0ztJCX7Lpnqb/X5CWL0WlnOdBYVyxfb mozw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778861086; x=1779465886; 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=dYv7n7MNQFWGtdjlWPVxo0rnA4k4aMTlnbBv8oYiho8=; b=PEcRs3nHpAYlOG/2jk4AIG5BvPgQePVkT0Ljg4b80L45WGjAfuRoNZ5Ne+JMcJni9u u9zsKLZReKD3lXufWkpCHKqUsbnjV+XGwoeJ2alz5QASPz0SEQyXDyvjxUo5IZDYUdVR sYH4UKVUCnibvM4+rnYdPerkLPkQwUFSpPR731b8t2KbcsPjMjxgR3FwM2rcipw/hDam OHtopPAGmjljWhtusuJSyqnAFFETuwtI1+s76dYlfh31Hs2579DWz393acxZkz8Wlor8 Xxl0yBVdZlq/hey6I9tsy3qGR67rM4rvOdHQMJ1LJZltOyEqwxYMVBakOpMCXbXvXG1n Yshg== X-Forwarded-Encrypted: i=1; AFNElJ/0K2sye/iwE03TO+9mvXZYRNNXiojH82ATIGyi1GM5LrUQ0JVqh4ZPpmaPEY27fPx69VfEqvoODpj97hg=@vger.kernel.org X-Gm-Message-State: AOJu0YwlYDBtM8iX0QoXhqQlKUQc8WWeIQGGmZ+p3OUTiVSuceLD/sgq GjLef8xmP7YZRPGucVcPUhCdAbWV2JbAq+EBjqWYHfEArX2ikceDieyJ X-Gm-Gg: Acq92OHPSlrS+XluhdIsD8NhYlm4KcZX76ul1mGVsce+yXoNU3x9g3cj5x1v3H9Cs1k AMSVziW/pUXBfm24VF73ir0E2OYf1f2ds2YspXfcf49YQHl4UwHix8O1n/WqmkBtn9LlHhd4H2E W0/WUvN/nDF1HAONqsL8nLwWF+X9j/KAujCtCTxPiw1e++SRAf0ljMK/kC14TltiHouUQmQBsWS PIEU9RTTmobyYE3s0l/K4wajTJjsoNwbMAVfBDpQAFK4jjpymBnt3igfPfJv+IgmdQiSvw2o/pH j9jvoI9bLBiK7Wf02hcNnxjaODn3x/La53aEEVIURZUvI2lx4xlTfbqOdR6X33Z2dkWR0EDOh1c j7mddzOMJdfFSlVSsDG0B9w4N6/nsCrH1q7Ls54T/ooCuy0/6lfQIzmWU6tWdgqWsr/gphlSnZr dLPHp2DmKyddfKlYcjSnXmpSkRxOXT5p9kV1SYZL6suQ8X8WygsTZD X-Received: by 2002:a05:6a00:1902:b0:834:ea1a:4b25 with SMTP id d2e1a72fcca58-83f33b2e0c9mr5587593b3a.12.1778861085597; Fri, 15 May 2026 09:04:45 -0700 (PDT) Received: from localhost.localdomain ([171.76.86.174]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-83f19c7c74fsm7920262b3a.49.2026.05.15.09.04.40 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 15 May 2026 09:04:43 -0700 (PDT) From: "Ritesh Harjani (IBM)" To: kvm@vger.kernel.org Cc: linuxppc-dev@lists.ozlabs.org, Madhavan Srinivasan , Harsh Prateek Bora , Christophe Leroy , Venkat Rao Bagalkote , Nicholas Piggin , linux-kernel@vger.kernel.org, "Ritesh Harjani (IBM)" Subject: [RFC 2/4] KVM: selftests: Add aligned guest physical page allocator Date: Fri, 15 May 2026 21:34:21 +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 2a76eca7029d..cdb004c9ba56 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.39.5