Sean Christopherson <[email protected]> writes:

>
> [...snip...]
>
>> +#ifdef CONFIG_USERFAULTFD
>> +static bool kvm_gmem_can_userfault(struct vm_area_struct *vma, vm_flags_t 
>> vm_flags)
>> +{
>> +    struct inode *inode = file_inode(vma->vm_file);
>> +
>> +    /*
>> +     * Only support userfaultfd for guest_memfd with INIT_SHARED flag.
>> +     * This ensures the memory can be mapped to userspace.
>> +     */

Is the principle here that any memory that is allowed to be mapped to
userspace can be userfault-ed?

>> +    if (!(GMEM_I(inode)->flags & GUEST_MEMFD_FLAG_INIT_SHARED))
>> +            return false;
>
> I'm not comfortable with this change.  It works for now, but it's going to be
> wildly wrong when in-place conversion comes along.  While I agree with the 
> "Let's
> solve each problem in it's time :)"[*], the time for in-place conversion is 
> now.
> In-place conversion isn't landing this cycle or next, but it's been in 
> development
> for longer than UFFD support, and I'm not willing to punt solvable problems to
> that series, because it's plenty fat as is.
>

Thanks :)

> Happily, IIUC, this is an easy problem to solve, and will have a nice side 
> effect
> for the common UFFD code.
>
> My objection to an early, global "can_userfault()" check is that it's 
> guaranteed
> to cause TOCTOU issues.  E.g. for VM_UFFD_MISSING and VM_UFFD_MINOR, the 
> check on
> whether or not a given address can be faulted in needs to happen in 
> __do_userfault(),
> not broadly when VM_UFFD_MINOR is added to a VMA.  Conceptually, that also 
> better
> aligns the code with the "normal" user fault path in 
> kvm_gmem_fault_user_mapping().
>
> I'm definitely not asking to fully prep for in-place conversion, I just want 
> to
> set us up for success and also to not have to churn a pile of code.  
> Concretely,
> again IIUC, I think we just need to move the INIT_SHARED check to 
> ->alloc_folio()
> and ->get_folio_noalloc().  And if we extract kvm_gmem_is_shared_mem() now 
> instead
> of waiting for in-place conversion, then we'll avoid a small amount of churn 
> when
> in-place conversion comes along.
>

I think it would help if we do some refactoring of existing allocation
functions to provide guest_memfd's uffd ->alloc_folio and
->get_folio_noalloc callbacks instead of having new functions.

Perhaps uffd ->alloc_folio and ->get_folio_noalloc can call an alloc
function refactored out of kvm_gmem_get_folio(), and also do the
kvm_gmem_is_shared_mem() check.

[email protected], who is starting work on guest_memfd preservation
(as in LUO/KHO).

>
> [...snip...]
>

Reply via email to