[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2 14/16] postcopy: Update userfaultfd.h header
From: |
Laurent Vivier |
Subject: |
Re: [Qemu-devel] [PATCH v2 14/16] postcopy: Update userfaultfd.h header |
Date: |
Fri, 24 Feb 2017 17:09:30 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.7.0 |
On 06/02/2017 18:33, Dr. David Alan Gilbert (git) wrote:
> From: "Dr. David Alan Gilbert" <address@hidden>
>
> We use a new userfaultfd define, so update the header.
> (Not needed if someone just runs the update script once it's
> gone into the main kernel).
>
> Signed-off-by: Dr. David Alan Gilbert <address@hidden>
> Reviewed-by: Juan Quintela <address@hidden>
> ---
> linux-headers/linux/userfaultfd.h | 81
> ++++++++++++++++++++++++++++++++++-----
> 1 file changed, 71 insertions(+), 10 deletions(-)
>
> diff --git a/linux-headers/linux/userfaultfd.h
> b/linux-headers/linux/userfaultfd.h
> index 19e8453..a7c1a62 100644
> --- a/linux-headers/linux/userfaultfd.h
> +++ b/linux-headers/linux/userfaultfd.h
> @@ -11,13 +11,19 @@
>
> #include <linux/types.h>
>
> -#define UFFD_API ((__u64)0xAA)
> /*
> - * After implementing the respective features it will become:
> - * #define UFFD_API_FEATURES (UFFD_FEATURE_PAGEFAULT_FLAG_WP | \
> - * UFFD_FEATURE_EVENT_FORK)
> + * If the UFFDIO_API is upgraded someday, the UFFDIO_UNREGISTER and
> + * UFFDIO_WAKE ioctls should be defined as _IOW and not as _IOR. In
> + * userfaultfd.h we assumed the kernel was reading (instead _IOC_READ
> + * means the userland is reading).
> */
> -#define UFFD_API_FEATURES (0)
> +#define UFFD_API ((__u64)0xAA)
> +#define UFFD_API_FEATURES (UFFD_FEATURE_PAGEFAULT_FLAG_WP | \
> + UFFD_FEATURE_EVENT_FORK | \
> + UFFD_FEATURE_EVENT_REMAP | \
> + UFFD_FEATURE_EVENT_MADVDONTNEED | \
> + UFFD_FEATURE_MISSING_HUGETLBFS | \
> + UFFD_FEATURE_MISSING_SHMEM)
> #define UFFD_API_IOCTLS \
> ((__u64)1 << _UFFDIO_REGISTER | \
> (__u64)1 << _UFFDIO_UNREGISTER | \
> @@ -25,7 +31,11 @@
> #define UFFD_API_RANGE_IOCTLS \
> ((__u64)1 << _UFFDIO_WAKE | \
> (__u64)1 << _UFFDIO_COPY | \
> - (__u64)1 << _UFFDIO_ZEROPAGE)
> + (__u64)1 << _UFFDIO_ZEROPAGE | \
> + (__u64)1 << _UFFDIO_WRITEPROTECT)
> +#define UFFD_API_RANGE_IOCTLS_BASIC \
> + ((__u64)1 << _UFFDIO_WAKE | \
> + (__u64)1 << _UFFDIO_COPY)
>
> /*
> * Valid ioctl command number range with this API is from 0x00 to
> @@ -40,6 +50,7 @@
> #define _UFFDIO_WAKE (0x02)
> #define _UFFDIO_COPY (0x03)
> #define _UFFDIO_ZEROPAGE (0x04)
> +#define _UFFDIO_WRITEPROTECT (0x05)
> #define _UFFDIO_API (0x3F)
>
> /* userfaultfd ioctl ids */
> @@ -56,6 +67,8 @@
> struct uffdio_copy)
> #define UFFDIO_ZEROPAGE _IOWR(UFFDIO, _UFFDIO_ZEROPAGE, \
> struct uffdio_zeropage)
> +#define UFFDIO_WRITEPROTECT _IOWR(UFFDIO, _UFFDIO_WRITEPROTECT, \
> + struct uffdio_writeprotect)
>
> /* read() structure */
> struct uffd_msg {
> @@ -72,6 +85,21 @@ struct uffd_msg {
> } pagefault;
>
> struct {
> + __u32 ufd;
> + } fork;
> +
> + struct {
> + __u64 from;
> + __u64 to;
> + __u64 len;
> + } remap;
> +
> + struct {
> + __u64 start;
> + __u64 end;
> + } madv_dn;
> +
> + struct {
> /* unused reserved fields */
> __u64 reserved1;
> __u64 reserved2;
> @@ -84,9 +112,9 @@ struct uffd_msg {
> * Start at 0x12 and not at 0 to be more strict against bugs.
> */
> #define UFFD_EVENT_PAGEFAULT 0x12
> -#if 0 /* not available yet */
> #define UFFD_EVENT_FORK 0x13
> -#endif
> +#define UFFD_EVENT_REMAP 0x14
> +#define UFFD_EVENT_MADVDONTNEED 0x15
>
> /* flags for UFFD_EVENT_PAGEFAULT */
> #define UFFD_PAGEFAULT_FLAG_WRITE (1<<0) /* If this was a write fault */
> @@ -104,11 +132,37 @@ struct uffdio_api {
> * Note: UFFD_EVENT_PAGEFAULT and UFFD_PAGEFAULT_FLAG_WRITE
> * are to be considered implicitly always enabled in all kernels as
> * long as the uffdio_api.api requested matches UFFD_API.
> + *
> + * UFFD_FEATURE_MISSING_HUGETLBFS means an UFFDIO_REGISTER
> + * with UFFDIO_REGISTER_MODE_MISSING mode will succeed on
> + * hugetlbfs virtual memory ranges. Adding or not adding
> + * UFFD_FEATURE_MISSING_HUGETLBFS to uffdio_api.features has
> + * no real functional effect after UFFDIO_API returns, but
> + * it's only useful for an initial feature set probe at
> + * UFFDIO_API time. There are two ways to use it:
> + *
> + * 1) by adding UFFD_FEATURE_MISSING_HUGETLBFS to the
> + * uffdio_api.features before calling UFFDIO_API, an error
> + * will be returned by UFFDIO_API on a kernel without
> + * hugetlbfs missing support
> + *
> + * 2) the UFFD_FEATURE_MISSING_HUGETLBFS can not be added in
> + * uffdio_api.features and instead it will be set by the
> + * kernel in the uffdio_api.features if the kernel supports
> + * it, so userland can later check if the feature flag is
> + * present in uffdio_api.features after UFFDIO_API
> + * succeeded.
> + *
> + * UFFD_FEATURE_MISSING_SHMEM works the same as
> + * UFFD_FEATURE_MISSING_HUGETLBFS, but it applies to shmem
> + * (i.e. tmpfs and other shmem based APIs).
> */
> -#if 0 /* not available yet */
> #define UFFD_FEATURE_PAGEFAULT_FLAG_WP (1<<0)
> #define UFFD_FEATURE_EVENT_FORK (1<<1)
> -#endif
> +#define UFFD_FEATURE_EVENT_REMAP (1<<2)
> +#define UFFD_FEATURE_EVENT_MADVDONTNEED (1<<3)
> +#define UFFD_FEATURE_MISSING_HUGETLBFS (1<<4)
> +#define UFFD_FEATURE_MISSING_SHMEM (1<<5)
> __u64 features;
>
> __u64 ioctls;
> @@ -164,4 +218,11 @@ struct uffdio_zeropage {
> __s64 zeropage;
> };
>
> +struct uffdio_writeprotect {
> + struct uffdio_range range;
> + /* !WP means undo writeprotect. DONTWAKE is valid only with !WP */
> +#define UFFDIO_WRITEPROTECT_MODE_WP ((__u64)1<<0)
> +#define UFFDIO_WRITEPROTECT_MODE_DONTWAKE ((__u64)1<<1)
> + __u64 mode;
> +};
> #endif /* _LINUX_USERFAULTFD_H */
>
Reviewed-by: Laurent Vivier <address@hidden>
- [Qemu-devel] [PATCH v2 11/16] postcopy: Mask fault addresses to huge page boundary, (continued)
- [Qemu-devel] [PATCH v2 11/16] postcopy: Mask fault addresses to huge page boundary, Dr. David Alan Gilbert (git), 2017/02/06
- [Qemu-devel] [PATCH v2 08/16] postcopy: Plumb pagesize down into place helpers, Dr. David Alan Gilbert (git), 2017/02/06
- [Qemu-devel] [PATCH v2 13/16] postcopy: Allow hugepages, Dr. David Alan Gilbert (git), 2017/02/06
- [Qemu-devel] [PATCH v2 14/16] postcopy: Update userfaultfd.h header, Dr. David Alan Gilbert (git), 2017/02/06
- Re: [Qemu-devel] [PATCH v2 14/16] postcopy: Update userfaultfd.h header,
Laurent Vivier <=
- [Qemu-devel] [PATCH v2 12/16] postcopy: Send whole huge pages, Dr. David Alan Gilbert (git), 2017/02/06
- [Qemu-devel] [PATCH v2 16/16] postcopy: Add doc about hugepages and postcopy, Dr. David Alan Gilbert (git), 2017/02/06
- [Qemu-devel] [PATCH v2 10/16] postcopy: Load huge pages in one go, Dr. David Alan Gilbert (git), 2017/02/06
- [Qemu-devel] [PATCH v2 15/16] postcopy: Check for userfault+hugepage feature, Dr. David Alan Gilbert (git), 2017/02/06