---
name: "UFFDIO_COPY"
section: "2const"
platform: "linux"
package: "man-pages"
version: "6.19-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/UFFDIO_COPY"
---

# UFFDIO\_COPY(2const)

atomically copy a continuous memory chunk into the userfault registered range

## NAME

UFFDIO\_COPY - atomically copy 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\_COPY, struct uffdio\_copy \****argp***);**

**#include \<linux/userfaultfd.h\>**

```
struct uffdio_copy {
    __u64  dst;   /* Destination of copy */
    __u64  src;   /* Source of copy */
    __u64  len;   /* Number of bytes to copy */
    __u64  mode;  /* Flags controlling behavior of copy */
    __s64  copy;  /* Number of bytes copied, or negated error */
};
```

## DESCRIPTION

Atomically copy 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\_COPY** operation:

- **UFFDIO\_COPY\_MODE\_DONTWAKE**

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

- **UFFDIO\_COPY\_MODE\_WP**

  Copy the page with read-only permission. This allows the user to trap the next write to the page, which will block and generate another write-protect userfault message. This is used only when both **UFFDIO\_REGISTER\_MODE\_MISSING** and **UFFDIO\_REGISTER\_MODE\_WP** modes are enabled for the registered range.

The *copy* field is used by the kernel to return the number of bytes that was actually copied, or an error (a negated *errno*-style value). The *copy* field is output-only; it is not read by the **UFFDIO\_COPY** operation.

## RETURN VALUE

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

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

## ERRORS

- **EAGAIN**

  The number of bytes copied (i.e., the value returned in the *copy* 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** (since Linux 4.11)

  The faulting process has changed its virtual memory layout simultaneously with an outstanding **UFFDIO\_COPY** operation.

- **ENOSPC** (from Linux 4.11 until Linux 4.13)

  The faulting process has exited at the time of a **UFFDIO\_COPY** operation.

- **ESRCH** (since Linux 4.13)

  The faulting process has exited at the time of a **UFFDIO\_COPY** operation.

## STANDARDS

Linux.

## HISTORY

Linux 4.3.

## EXAMPLES

See [**userfaultfd**(2)](/userfaultfd/2.md).

## SEE ALSO

[**ioctl**(2)](/ioctl/2.md), [**ioctl\_userfaultfd**(2)](/ioctl_userfaultfd/2.md), [**userfaultfd**(2)](/userfaultfd/2.md)

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