# UFFDIO_MOVE

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


* * *