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.
