On Thu, Feb 02, 2023 at 04:29:10PM +0500, Muhammad Usama Anjum wrote:
Add new WP Async mode (UFFD_FEATURE_WP_ASYNC) which resolves the page faults on its own. It can be used to track that which pages have been written-to from the time the pages were write-protected. It is very efficient way to track the changes as uffd is by nature pte/pmd based.
UFFD synchronous WP sends the page faults to the userspace where the pages which have been written-to can be tracked. But it is not efficient. This is why this asynchronous version is being added. After setting the WP Async, the pages which have been written to can be found in the pagemap file or information can be obtained from the PAGEMAP_IOCTL.
Suggested-by: Peter Xu peterx@redhat.com Signed-off-by: Muhammad Usama Anjum usama.anjum@collabora.com
Changes in v10:
- Build fix
- Update comments and add error condition to return error from uffd register if hugetlb pages are present when wp async flag is set
Changes in v9:
- Correct the fault resolution with code contributed by Peter
Changes in v7:
- Remove UFFDIO_WRITEPROTECT_MODE_ASYNC_WP and add UFFD_FEATURE_WP_ASYNC
- Handle automatic page fault resolution in better way (thanks to Peter)
update to wp async
uffd wp async
fs/userfaultfd.c | 20 ++++++++++++++++++-- include/linux/userfaultfd_k.h | 11 +++++++++++ include/uapi/linux/userfaultfd.h | 10 +++++++++- mm/memory.c | 23 ++++++++++++++++++++--- 4 files changed, 58 insertions(+), 6 deletions(-)
diff --git a/fs/userfaultfd.c b/fs/userfaultfd.c index 15a5bf765d43..422f2530c63e 100644 --- a/fs/userfaultfd.c +++ b/fs/userfaultfd.c @@ -1422,10 +1422,15 @@ static int userfaultfd_register(struct userfaultfd_ctx *ctx, goto out_unlock; /*
* Note vmas containing huge pages
* Note vmas containing huge pages. Hugetlb isn't supported
*/* with UFFD_FEATURE_WP_ASYNC.
Need to set "ret = -EINVAL;" here. Or..
if (is_vm_hugetlb_page(cur))
if (is_vm_hugetlb_page(cur)) {
if (ctx->features & UFFD_FEATURE_WP_ASYNC)
goto out_unlock;
.. it'll return -EBUSY, which does not sound like the right errcode here.
Drop this empty line?
basic_ioctls = true;
}
found = true; }
Other than that looks good, thanks.