Re: [PATCH v10 12/41] KVM: guest_memfd: Call arch make_shared callback for to-shared conversion

Sean Christopherson <[email protected]>
Newsgroups gmane.linux.documentation,gmane.comp.emulators.kvm.devel,gmane.linux.kernel,gmane.linux.kernel.mm
Message-ID <[email protected]>
On Thu, Aug 13, 2026, Ackerley Tng wrote:
> Sean Christopherson <[email protected]> writes:
> 
> > On Thu, Aug 13, 2026, Binbin Wu wrote:
> >> On 8/8/2026 5:52 AM, Ackerley Tng via B4 Relay wrote:
> >> > +#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_CONVERT
> >> > +static void kvm_gmem_make_shared(struct inode *inode, pgoff_t start, pgoff_t end)
> >> > +{
> >> > +	struct folio_batch fbatch;
> >> > +	pgoff_t next = start;
> >> > +	int i;
> >> > +
> >> > +	folio_batch_init(&fbatch);
> >> > +	while (filemap_get_folios(inode->i_mapping, &next, end - 1, &fbatch)) {
> >> > +		for (i = 0; i < folio_batch_count(&fbatch); ++i) {
> >> > +			struct folio *folio = fbatch.folios[i];
> >> > +			pgoff_t start_index, end_index;
> >> > +			kvm_pfn_t start_pfn;
> >> > +			kvm_pfn_t nr_pages;
> >> > +
> >> > +			start_index = max(start, folio->index);
> >> > +			end_index = min(end, folio_next_index(folio));
> >> > +			/*
> >> > +			 * end_index is either in folio or points to
> >> > +			 * the first page of the next folio. Hence,
> >> > +			 * all pages in range [start_index, end_index)
> >> > +			 * are contiguous.
> >> > +			 */
> >> > +			start_pfn = folio_file_pfn(folio, start_index);
> >> > +			nr_pages = end_index - start_index;
> >> > +
> >> > +			kvm_arch_gmem_make_shared(start_pfn, nr_pages);
> >> > +		}
> >> > +
> >> > +		folio_batch_release(&fbatch);
> >> > +		cond_resched();
> >> > +	}
> >> > +}
> >> > +#else
> >> > +static void kvm_gmem_make_shared(struct inode *inode, pgoff_t start, pgoff_t end) {}
> >> > +#endif
> >> > +
> >> >  static int __kvm_gmem_set_attributes(struct inode *inode, pgoff_t start,
> >> >  				     size_t nr_pages, uint64_t attrs,
> >> >  				     pgoff_t *err_index)
> >> > @@ -599,7 +636,12 @@ static int __kvm_gmem_set_attributes(struct inode *inode, pgoff_t start,
> >> >
> >> >  	filter = to_private ? KVM_FILTER_SHARED : KVM_FILTER_PRIVATE;
> >> >  	kvm_gmem_invalidate_start(inode, start, end, filter);
> >> > +
> >> > +	if (!to_private)
> 
> Should I make this condition
> 
> 	if (!to_private && kvm_x86_ops.gmem_make_shared)
> 
> instead?
> 
> Will that help?

No, because that's bleeding x86 details into common code, which defeats the purpose
of arch hooks.  That's why I think it's worth analyzing the cost: if it's in the
noise, leave it alone.  If it's meaningful, figure out a not-too-gross way to skip
the entire thing if kvm_arch_gmem_make_shared() is a glorified nop in the end.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.