[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <8fe83dba66ca0fcaf94a990a30b4f7d8ea2ae37a.camel@intel.com>
Date: Thu, 18 Dec 2025 22:24:04 +0000
From: "Huang, Kai" <kai.huang@...el.com>
To: "kvm@...r.kernel.org" <kvm@...r.kernel.org>, "michael.roth@....com"
<michael.roth@....com>
CC: "david@...hat.com" <david@...hat.com>, "liam.merwick@...cle.com"
<liam.merwick@...cle.com>, "seanjc@...gle.com" <seanjc@...gle.com>,
"aik@....com" <aik@....com>, "linux-mm@...ck.org" <linux-mm@...ck.org>,
"Annapurve, Vishal" <vannapurve@...gle.com>, "linux-kernel@...r.kernel.org"
<linux-kernel@...r.kernel.org>, "thomas.lendacky@....com"
<thomas.lendacky@....com>, "vbabka@...e.cz" <vbabka@...e.cz>,
"ashish.kalra@....com" <ashish.kalra@....com>, "linux-coco@...ts.linux.dev"
<linux-coco@...ts.linux.dev>, "Weiny, Ira" <ira.weiny@...el.com>,
"pbonzini@...hat.com" <pbonzini@...hat.com>, "ackerleytng@...gle.com"
<ackerleytng@...gle.com>, "Zhao, Yan Y" <yan.y.zhao@...el.com>
Subject: Re: [PATCH v2 5/5] KVM: guest_memfd: GUP source pages prior to
populating guest memory
On Mon, 2025-12-15 at 09:34 -0600, Michael Roth wrote:
> Currently the post-populate callbacks handle copying source pages into
> private GPA ranges backed by guest_memfd, where kvm_gmem_populate()
> acquires the filemap invalidate lock, then calls a post-populate
> callback which may issue a get_user_pages() on the source pages prior to
> copying them into the private GPA (e.g. TDX).
>
> This will not be compatible with in-place conversion, where the
> userspace page fault path will attempt to acquire filemap invalidate
> lock while holding the mm->mmap_lock, leading to a potential ABBA
> deadlock[1].
Nit: there's no link to mention [1].
[...]
> Suggested-by: Sean Christopherson <seanjc@...gle.com>
> Co-developed-by: Sean Christopherson <seanjc@...gle.com>
> Signed-off-by: Sean Christopherson <seanjc@...gle.com>
> Co-developed-by: Vishal Annapurve <vannapurve@...gle.com>
> Signed-off-by: Vishal Annapurve <vannapurve@...gle.com>
> Signed-off-by: Michael Roth <michael.roth@....com>
>
[...]
> + if (src_page) {
> + void *src_vaddr = kmap_local_pfn(page_to_pfn(src_page));
Nit: maybe you can use kmap_local_page(src_page) directly.
> + void *dst_vaddr = kmap_local_pfn(pfn);
>
> - if (copy_from_user(vaddr, src, PAGE_SIZE)) {
> - ret = -EFAULT;
> - goto out;
> - }
> - kunmap_local(vaddr);
> + memcpy(dst_vaddr, src_vaddr, PAGE_SIZE);
> +
> + kunmap_local(src_vaddr);
> + kunmap_local(dst_vaddr);
> }
>
> ret = rmp_make_private(pfn, gfn << PAGE_SHIFT, PG_LEVEL_4K,
> @@ -2325,17 +2325,19 @@ static int sev_gmem_post_populate(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pfn,
> if (ret && !snp_page_reclaim(kvm, pfn) &&
> sev_populate_args->type == KVM_SEV_SNP_PAGE_TYPE_CPUID &&
> sev_populate_args->fw_error == SEV_RET_INVALID_PARAM) {
> - void *vaddr = kmap_local_pfn(pfn);
> + void *src_vaddr = kmap_local_pfn(page_to_pfn(src_page));
Ditto.
Powered by blists - more mailing lists