Re: [PATCH v10 11/41] KVM: guest_memfd: Ensure pages are not in use before conversion
Ackerley Tng <[email protected]>
| Newsgroups | org.kernel.vger.linux-kselftest,dev.linux.lists.linux-coco,org.kernel.vger.kvm,org.kernel.vger.linux-doc,org.kernel.vger.linux-kernel,org.kernel.vger.linux-trace-kernel,org.kvack.linux-mm |
|---|---|
| Message-ID | <CAEvNRgGzqYQLC9ThxcHCQ7KJm7rRMvqzGoznCz1d4dxAkiLkxQ@mail.gmail.com> |
"David Hildenbrand (Arm)" <[email protected]> writes: >> helps the reader understand what's being checked without having to look at the >> details, and also helps communicate the ordering dependency without needing a >> comment. >> >> There are definitely times where the usage of a function bleeds into its name, >> but usually that's because the name and the usage are on and the same. E.g. >> get_user() describes both the usage and the "what". And it's easy/possible to >> go too far in the opposite direction, e.g. by giving a play-by-play of what a >> function is doing, but that's why we have bikshedding sessions :-) > > Note that the problem I have with kvm_gmem_is_safe_for_conversion() that it is > all about *conversion to private*, not *conversion to shared*. In that sense, > the function name is just confusing. > >> >>> Perhaps a little ahead of its time, >> >> Ya. >> >>> but later with restructuring for huge pages, we also need no additional >>> refcounts other than gmem's own so that restructuring is safe, hence this >>> function name was meant to extend there as well. >> >> Given that I've read that at least five times and still don't understand the >> nuance, I think it's safe (ha!) to say we'll need to revisit and review those >> changes no matter what. :-) >> >> >>> In this case "unexpected" (especially since the next patch adds checks >>> for maybe dma pinned and unmapping), begs the question "unexpected in >>> what way"? >> >> Ya, that's why I like "outstanding", it succinctly captures that one or more >> references have been "loaned" but not yet "repaid". >> >>>> >>>> I'd rather add a comment than have this filemap_get_folios_refcount. >> >> +1, the local variable just made me scratch my head. >> >>>> >>>> /* >>>> * We expect one reference per folio-page in the pagecache and one >>>> * reference from filemap_get_folios(). >> >> Nit, please no pronouns in KVM code. > > Whatever floats KVM's boat :) > >> >>>> */ >>>> if (folio_ref_count(folio) != folio_nr_pages(folio) + 1) >>>> >>> >>> This comment explains what's "unexpected". I can do this and switch it >>> to kvm_gmem_mem_has_unexpected_refs() unless people have other >>> suggestions. >>> >>> I wish there was a folio_pagecache_refs(folio) that >>> folio_expected_ref_count() can share with this, and also >>> folio_swapcache_refs(), to solidify the definition of refcounts taken by >>> the pagecache. >> >> ... >> >>>> >>>> I'd add a comment here for the "why are we unmapping". >>>> >>> >>> Does this sound right: >>> >>> Unmap here to ensure that userspace page tables have no mappings, which >>> also ensures refcounts from those mappings are dropped. >> >> How about: >> >> /* >> * Forcefully unmap the pages from all userspace page tables, >> * and then verify there are no outstanding references, e.g. >> * acquired via GUP or similar. Tell userspace to try again if >> * there are oustanding references and hope that whatever has >> * pinned the page will put its reference "soon". >> */ >> unmap_mapping_pages(mapping, start, nr_pages, false); >> >> if (!kvm_gmem_is_safe_for_conversion(inode, start, nr_pages, >> err_index)) { >> mas_destroy(&mas); >> r = -EAGAIN; >> goto out; >> } > > > Sounds good besides the function still not being clear about *which* kind of > conversion. > Circling back to this since Binbin also had a comment about the comment! I'll drop the use of the const local variable and do if (folio_ref_count(folio) != folio_nr_pages(folio) + 1) , and add a comment rephrased without the pronouns: No references outstanding if guest_memfd sees 1 reference per folio-page in the pagecache and 1 reference from filemap_get_folios() , and then also take the comment and rename the function from kvm_gmem_is_safe_for_conversion to kvm_gmem_has_outstanding_references. if (to_private) { /* * Forcefully unmap the pages from all userspace page tables, * and then verify there are no outstanding references, e.g. * acquired via GUP or similar. Tell userspace to try again if * there are oustanding references and hope that whatever has * pinned the page will put its reference "soon". */ unmap_mapping_pages(mapping, start, nr_pages, false); if (kvm_gmem_has_outstanding_references(inode, start, nr_pages, err_index)) { mas_destroy(&mas); r = -EAGAIN; goto out; } } I think renaming the function from kvm_gmem_is_safe_for_conversion to kvm_gmem_has_outstanding_references should be better since it doesn't really make a statement on what kind of conversion the outstanding references are for. > > -- > Cheers, > > David