> 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.


-- 
Cheers,

David

Reply via email to