Re: [PATCH v10 13/41] KVM: guest_memfd: Return early if range already has requested attributes
Xiaoyao Li <[email protected]>
| Newsgroups | org.kernel.vger.kvm,dev.linux.lists.linux-coco,org.kernel.vger.linux-doc,org.kernel.vger.linux-kernel,org.kernel.vger.linux-kselftest,org.kernel.vger.linux-trace-kernel,org.kvack.linux-mm |
|---|---|
| Message-ID | <[email protected]> |
On 8/8/2026 5:52 AM, Ackerley Tng via B4 Relay wrote: > From: Ackerley Tng <[email protected]> > > Provide function to check that a range has given attributes. > > Optimize setting memory attributes by returning early if all pages in the > requested range already has the requested attributes. > > Reviewed-by: Fuad Tabba <[email protected]> > Tested-by: Shivank Garg <[email protected]> > Signed-off-by: Ackerley Tng <[email protected]> Reviewed-by: Xiaoyao Li <[email protected]> > --- > virt/kvm/guest_memfd.c | 23 ++++++++++++++++++++++- > 1 file changed, 22 insertions(+), 1 deletion(-) > > diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c > index c9874bd85c5d8..896699afcad9d 100644 > --- a/virt/kvm/guest_memfd.c > +++ b/virt/kvm/guest_memfd.c > @@ -95,6 +95,24 @@ static bool kvm_gmem_is_shared_mem(struct inode *inode, pgoff_t index) > return !kvm_gmem_is_private_mem(inode, index); > } > > +static bool kvm_gmem_range_has_attributes(struct inode *inode, > + pgoff_t index, size_t nr_pages, > + u64 attributes) > +{ > + struct maple_tree *mt = &GMEM_I(inode)->attributes; > + pgoff_t end = index + nr_pages - 1; > + void *entry; > + > + lockdep_assert(mt_lock_is_held(mt)); > + > + mt_for_each(mt, entry, index, end) { > + if (kvm_gmem_get_attributes(inode, entry) != attributes) > + return false; > + } > + > + return true; > +} > + > /* > * Returns a locked folio on success. The caller is responsible for > * setting the up-to-date flag before the memory is mapped into the guest. > @@ -605,12 +623,15 @@ static int __kvm_gmem_set_attributes(struct inode *inode, pgoff_t start, > pgoff_t end = start + nr_pages; > struct maple_tree *mt; > struct ma_state mas; > - int r; > + int r = 0; > > mt = &gi->attributes; > > filemap_invalidate_lock(mapping); > > + if (kvm_gmem_range_has_attributes(inode, start, nr_pages, attrs)) > + goto out; > + > mas_init(&mas, mt, start); > r = kvm_gmem_mas_preallocate(&mas, attrs, start, nr_pages); > if (r) { >