From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5424736D51A for ; Thu, 20 Nov 2025 17:36:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763660194; cv=none; b=cf/3pT87ccvdVQWf+EGUgIIYc9bLPn8F6D4ttasVFmUkQyXU7rteEbJtDA7eoyRiZJB+JVjzVeqN8nk7FF5k8yBqUi3ZyHH73XJrQsxYE9CmklS/0CrkBbOCSDYA2Y0fzZfh1jWXmiLQTKsZt+NIeHl18qRX40NHYsYxIxfArwE= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763660194; c=relaxed/simple; bh=O45l2dIqP2/DX090Bg36qploXTF0tscZcUwPbKG+Trw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZkYWmHCQ02mOJdFAv3aKtYiAZ5CkIbcXgQ6I5ZylKZV7KQcLvSyDsVtp2tTzFbDHtT1YrjCt7OEJxTVX8qKPyZGVjeBo/6GecTiPL32u0c35di4UH5uO7xU+ctmJ54/n92sqwhsxrFtyjLbXKQAauLSyY4DO3tzrPXGwG3pCwdM= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=vAlWKP02; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="vAlWKP02" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 93594C116C6; Thu, 20 Nov 2025 17:36:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1763660194; bh=O45l2dIqP2/DX090Bg36qploXTF0tscZcUwPbKG+Trw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=vAlWKP021PQKPFnE05LFDGcwMhhfVc9bpBvSUuG6IZXdcitgKCr9JS4uH6bcKF6Lu LGQRBdDo1y1glH5etSDzaZxruDrgD1W4JgTq1M7PkKcB6JVmoxlacFUfB3PjaVUgW/ oSh6zpM9c877OUWsdbL9daLeAcPU+gBzUS9/b8ZV0yNDwE8P82vOVuOgHRn1Du/w33 nhV4qPIje1xEEqZZ9z5x/tIoblGxBQRl2+/3AXuHFx74DT0ch3Bzxa2H8i7w/+XJPB CiSdLlEzTFMGoV3hymrS4OQRVglZUoqqPP5ekfBnbVn8f3KJQt2AqXReqreDdj8wAA 4v5eyTh4Ojllw== From: Sasha Levin To: stable@vger.kernel.org Cc: Sean Christopherson , Dmitry Osipenko , Paolo Bonzini , Sasha Levin Subject: [PATCH 6.12.y 1/3] KVM: guest_memfd: Pass index, not gfn, to __kvm_gmem_get_pfn() Date: Thu, 20 Nov 2025 12:36:29 -0500 Message-ID: <20251120173631.1905381-1-sashal@kernel.org> X-Mailer: git-send-email 2.51.0 In-Reply-To: <2025112009-getaway-overplay-a36a@gregkh> References: <2025112009-getaway-overplay-a36a@gregkh> Precedence: bulk X-Mailing-List: stable@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: Sean Christopherson [ Upstream commit 4af18dc6a9204464db76d9771d1f40e2b46bf6ae ] Refactor guest_memfd usage of __kvm_gmem_get_pfn() to pass the index into the guest_memfd file instead of the gfn, i.e. resolve the index based on the slot+gfn in the caller instead of in __kvm_gmem_get_pfn(). This will allow kvm_gmem_get_pfn() to retrieve and return the specific "struct page", which requires the index into the folio, without a redoing the index calculation multiple times (which isn't costly, just hard to follow). Opportunistically add a kvm_gmem_get_index() helper to make the copy+pasted code easier to understand. Signed-off-by: Sean Christopherson Tested-by: Dmitry Osipenko Signed-off-by: Paolo Bonzini Message-ID: <20241010182427.1434605-46-seanjc@google.com> Stable-dep-of: ae431059e75d ("KVM: guest_memfd: Remove bindings on memslot deletion when gmem is dying") Signed-off-by: Sasha Levin --- virt/kvm/guest_memfd.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index bb062d3d24572..73e5db8ef1611 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -304,6 +304,11 @@ static inline struct file *kvm_gmem_get_file(struct kvm_memory_slot *slot) return get_file_active(&slot->gmem.file); } +static pgoff_t kvm_gmem_get_index(struct kvm_memory_slot *slot, gfn_t gfn) +{ + return gfn - slot->base_gfn + slot->gmem.pgoff; +} + static struct file_operations kvm_gmem_fops = { .open = generic_file_open, .release = kvm_gmem_release, @@ -553,12 +558,11 @@ void kvm_gmem_unbind(struct kvm_memory_slot *slot) } /* Returns a locked folio on success. */ -static struct folio * -__kvm_gmem_get_pfn(struct file *file, struct kvm_memory_slot *slot, - gfn_t gfn, kvm_pfn_t *pfn, bool *is_prepared, - int *max_order) +static struct folio *__kvm_gmem_get_pfn(struct file *file, + struct kvm_memory_slot *slot, + pgoff_t index, kvm_pfn_t *pfn, + bool *is_prepared, int *max_order) { - pgoff_t index = gfn - slot->base_gfn + slot->gmem.pgoff; struct kvm_gmem *gmem = file->private_data; struct folio *folio; @@ -594,6 +598,7 @@ __kvm_gmem_get_pfn(struct file *file, struct kvm_memory_slot *slot, int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory_slot *slot, gfn_t gfn, kvm_pfn_t *pfn, int *max_order) { + pgoff_t index = kvm_gmem_get_index(slot, gfn); struct file *file = kvm_gmem_get_file(slot); struct folio *folio; bool is_prepared = false; @@ -602,7 +607,7 @@ int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory_slot *slot, if (!file) return -EFAULT; - folio = __kvm_gmem_get_pfn(file, slot, gfn, pfn, &is_prepared, max_order); + folio = __kvm_gmem_get_pfn(file, slot, index, pfn, &is_prepared, max_order); if (IS_ERR(folio)) { r = PTR_ERR(folio); goto out; @@ -650,6 +655,7 @@ long kvm_gmem_populate(struct kvm *kvm, gfn_t start_gfn, void __user *src, long for (i = 0; i < npages; i += (1 << max_order)) { struct folio *folio; gfn_t gfn = start_gfn + i; + pgoff_t index = kvm_gmem_get_index(slot, gfn); bool is_prepared = false; kvm_pfn_t pfn; @@ -658,7 +664,7 @@ long kvm_gmem_populate(struct kvm *kvm, gfn_t start_gfn, void __user *src, long break; } - folio = __kvm_gmem_get_pfn(file, slot, gfn, &pfn, &is_prepared, &max_order); + folio = __kvm_gmem_get_pfn(file, slot, index, &pfn, &is_prepared, &max_order); if (IS_ERR(folio)) { ret = PTR_ERR(folio); break; -- 2.51.0