Provided by: manpages-dev_6.16-1_all bug

NAME

       UFFDIO_MOVE - atomically move a continuous memory chunk into the userfault registered range

LIBRARY

       Standard C library (libc, -lc)

SYNOPSIS

       #include <linux/userfaultfd.h>  /* Definition of UFFD* constants */
       #include <sys/ioctl.h>

       int ioctl(int fd, UFFDIO_MOVE, struct uffdio_move *argp);

       #include <linux/userfaultfd.h>

       struct uffdio_move {
           __u64  dst;   /* Destination of move */
           __u64  src;   /* Source of move */
           __u64  len;   /* Number of bytes to move */
           __u64  mode;  /* Flags controlling behavior of move */
           __s64  move;  /* Number of bytes moved, or negated error */
       };

DESCRIPTION

       Atomically  move a continuous memory chunk into the userfault registered range and optionally wake up the
       blocked thread.

       The following value may be bitwise ORed in .mode to change the behavior of the UFFDIO_MOVE operation:

       UFFDIO_MOVE_MODE_DONTWAKE
              Do not wake up the thread that waits for page-fault resolution

       UFFDIO_MOVE_MODE_ALLOW_SRC_HOLES
              Allow holes in the source virtual range that is being moved.  When not specified, the  holes  will
              result in ENOENT error.  When specified, the holes will be accounted as successfully moved memory.
              This  is  mostly  useful  to  move  hugepage  aligned virtual regions without knowing if there are
              transparent hugepages in the regions or not, but preventing  the  risk  of  having  to  split  the
              hugepage during the operation.

       The  .move field is used by the kernel to return the number of bytes that was actually moved, or an error
       (a negated errno-style value).  The .move field is  output-only;  it  is  not  read  by  the  UFFDIO_MOVE
       operation.

RETURN VALUE

       On success, 0 is returned.  In this case, the entire area was moved.

       On error, -1 is returned and errno is set to indicate the error.

ERRORS

       EAGAIN The  number  of bytes moved (i.e., the value returned in the .move field) does not equal the value
              that was specified in the .len field.

       EINVAL Either .dst or .len was not a multiple of the system page size, or the range specified by .src and
              .len or .dst and .len was invalid.

       EINVAL An invalid bit was specified in the .mode field.

       ENOENT The source virtual memory range has unmapped holes  and  UFFDIO_MOVE_MODE_ALLOW_SRC_HOLES  is  not
              set.

       EEXIST The destination virtual memory range is fully or partially mapped.

       EBUSY  The  pages  in  the source virtual memory range are either pinned or not exclusive to the process.
              Once KSM deduplicates pages or fork(2) COW-shares pages during fork(2) with child processes,  they
              are  no  longer exclusive.  The kernel might only perform lightweight checks for detecting whether
              the pages are exclusive.  To make the operation more likely to succeed, KSM  should  be  disabled,
              fork(2) should be avoided or MADV_DONTFORK should be configured for the source virtual memory area
              before fork(2).

       ENOMEM Allocating memory needed for the operation failed.

       ESRCH  The target process has exited at the time of a UFFDIO_MOVE operation.

STANDARDS

       Linux.

HISTORY

       Linux 6.8.

SEE ALSO

       ioctl(2), ioctl_userfaultfd(2), userfaultfd(2)

       linux.git/Documentation/admin-guide/mm/userfaultfd.rst

Linux man-pages 6.16                               2025-05-17                                UFFDIO_MOVE(2const)