• Axel Rasmussen's avatar
    userfaultfd: don't fail on unrecognized features · 914eedcb
    Axel Rasmussen authored
    The basic interaction for setting up a userfaultfd is, userspace issues
    a UFFDIO_API ioctl, and passes in a set of zero or more feature flags,
    indicating the features they would prefer to use.
    
    Of course, different kernels may support different sets of features
    (depending on kernel version, kconfig options, architecture, etc).
    Userspace's expectations may also not match: perhaps it was built
    against newer kernel headers, which defined some features the kernel
    it's running on doesn't support.
    
    Currently, if userspace passes in a flag we don't recognize, the
    initialization fails and we return -EINVAL. This isn't great, though.
    Userspace doesn't have an obvious way to react to this; sure, one of the
    features I asked for was unavailable, but which one? The only option it
    has is to turn off things "at random" and hope something works.
    
    Instead, modify UFFDIO_API to just ignore any unrecognized feature
    flags. The interaction is now that the initialization will succeed, and
    as always we return the *subset* of feature flags that can actually be
    used back to userspace.
    
    Now userspace has an obvious way to react: it checks if any flags it
    asked for are missing. If so, it can conclude this kernel doesn't
    support those, and it can either resign itself to not using them, or
    fail with an error on its own, or whatever else.
    
    Link: https://lkml.kernel.org/r/20220722201513.1624158-1-axelrasmussen@google.comSigned-off-by: default avatarAxel Rasmussen <axelrasmussen@google.com>
    Cc: Peter Xu <peterx@redhat.com>
    Cc: Axel Rasmussen <axelrasmussen@google.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    914eedcb
userfaultfd.c 54.5 KB