diff --git a/fs/userfaultfd.c b/fs/userfaultfd.c index ae4b211c2716..f36e6e018b26 100644 --- a/fs/userfaultfd.c +++ b/fs/userfaultfd.c @@ -1942,7 +1942,8 @@ static int userfaultfd_move(struct userfaultfd_ctx *ctx, return ret; if (uffdio_move.mode & ~(UFFDIO_MOVE_MODE_ALLOW_SRC_HOLES| - UFFDIO_MOVE_MODE_DONTWAKE)) + UFFDIO_MOVE_MODE_DONTWAKE| + UFFDIO_MOVE_MODE_CONFIRM_FIXED)) return -EINVAL; if (mmget_not_zero(mm)) { diff --git a/include/uapi/linux/userfaultfd.h b/include/uapi/linux/userfaultfd.h index 2be5c8899f1f..ffdbefb3c5d5 100644 --- a/include/uapi/linux/userfaultfd.h +++ b/include/uapi/linux/userfaultfd.h @@ -325,6 +325,13 @@ struct uffdio_move { */ #define UFFDIO_MOVE_MODE_DONTWAKE ((__u64)1<<0) #define UFFDIO_MOVE_MODE_ALLOW_SRC_HOLES ((__u64)1<<1) + /* + * To confirm if the ioctl has fixes to avoid panic when src folio is + * in swap-cache. Also, to avoid livelock when multiple threads try + * to move same src folio. It's a KMI workaround and cannot be relied + * upon by userspace. + */ +#define UFFDIO_MOVE_MODE_CONFIRM_FIXED ((__u64)1<<63) __u64 mode; /* * "move" is written by the ioctl and must be at the end: the