linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Shaohua Li <shli@fb.com>
To: linux-mm@kvack.org
Cc: kernel-team@fb.com, Andrew Morton <akpm@linux-foundation.org>
Subject: [RFC 0/8] userfaultfd: add write protect support
Date: Thu, 19 Nov 2015 14:33:45 -0800	[thread overview]
Message-ID: <cover.1447964595.git.shli@fb.com> (raw)

Hi,

There is plan to support write protect fault into userfaultfd before, but it's
not implemented yet. I'm working on a library to support different types of
buffer like compressed buffer and file buffer, something like a page cache
implementation in userspace. The buffer enables userfaultfd and does something
like decompression in userfault handler. When memory size exceeds a
threshold, madvise is used to reclaim memory. The problem is data can be
corrupted in reclaim without memory protection support.

For example, in the compressed buffer case, reclaim does:
1. compress memory range and store compressed data elsewhere
2. madvise the memory range

But if the memory is changed before 2, new change is lost. memory write
protection can solve the issue. With it, the reclaim does:
1. write protect memory range
2. compress memory range and store compressed data elsewhere
3. madvise the memory range
4. undo write protect memory range and wakeup tasks waiting in write protect
fault.
If a task changes memory before 3, write protect fault will be triggered. we
can put the task into sleep till step 4 runs for example. In this way memory
changes will not be lost.

This patch set add write protect support for userfaultfd. One issue is write
protect fault can happen even without enabling write protect in userfault. For
example, a write to address backed by zero page. There is no way to distinguish
if this is a write protect fault expected by userfault. This patch just blindly
triggers write protect fault to userfault if corresponding vma enables
VM_UFFD_WP. Application should be prepared to handle such write protect fault.

Thanks,
Shaohua


Shaohua Li (8):
  userfaultfd: add helper for writeprotect check
  userfaultfd: support write protection for userfault vma range
  userfaultfd: expose writeprotect API to ioctl
  userfaultfd: allow userfaultfd register success with writeprotection
  userfaultfd: undo write proctection in unregister
  userfaultfd: hook userfault handler to write protection fault
  userfaultfd: fault try one more time
  userfaultfd: enabled write protection in userfaultfd API

 arch/alpha/mm/fault.c            |  8 ++++-
 arch/arc/mm/fault.c              |  8 ++++-
 arch/arm/mm/fault.c              |  8 ++++-
 arch/arm64/mm/fault.c            |  8 ++++-
 arch/avr32/mm/fault.c            |  8 ++++-
 arch/cris/mm/fault.c             |  8 ++++-
 arch/hexagon/mm/vm_fault.c       |  8 ++++-
 arch/ia64/mm/fault.c             |  8 ++++-
 arch/m68k/mm/fault.c             |  8 ++++-
 arch/metag/mm/fault.c            |  8 ++++-
 arch/microblaze/mm/fault.c       |  8 ++++-
 arch/mips/mm/fault.c             |  8 ++++-
 arch/mn10300/mm/fault.c          |  8 ++++-
 arch/nios2/mm/fault.c            |  8 ++++-
 arch/openrisc/mm/fault.c         |  8 ++++-
 arch/parisc/mm/fault.c           |  8 ++++-
 arch/powerpc/mm/fault.c          |  8 ++++-
 arch/s390/mm/fault.c             |  9 +++++-
 arch/sh/mm/fault.c               |  8 ++++-
 arch/sparc/mm/fault_32.c         |  8 ++++-
 arch/sparc/mm/fault_64.c         |  8 ++++-
 arch/tile/mm/fault.c             |  8 ++++-
 arch/um/kernel/trap.c            |  8 ++++-
 arch/unicore32/mm/fault.c        |  8 ++++-
 arch/x86/mm/fault.c              |  9 +++++-
 arch/xtensa/mm/fault.c           |  8 ++++-
 fs/userfaultfd.c                 | 66 ++++++++++++++++++++++++++++++++++------
 include/linux/mm.h               |  3 +-
 include/linux/userfaultfd_k.h    | 12 ++++++++
 include/uapi/linux/userfaultfd.h | 17 +++++++++--
 mm/memory.c                      | 66 +++++++++++++++++++++++++++++-----------
 mm/userfaultfd.c                 | 52 +++++++++++++++++++++++++++++++
 32 files changed, 369 insertions(+), 57 deletions(-)

-- 
2.4.6

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

             reply	other threads:[~2015-11-19 22:34 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-11-19 22:33 Shaohua Li [this message]
2015-11-19 22:33 ` [RFC 1/8] userfaultfd: add helper for writeprotect check Shaohua Li
2015-11-19 22:33 ` [RFC 2/8] userfaultfd: support write protection for userfault vma range Shaohua Li
2016-04-14 21:07   ` Andrea Arcangeli
2015-11-19 22:33 ` [RFC 3/8] userfaultfd: expose writeprotect API to ioctl Shaohua Li
2015-11-19 22:33 ` [RFC 4/8] userfaultfd: allow userfaultfd register success with writeprotection Shaohua Li
2015-11-19 22:33 ` [RFC 5/8] userfaultfd: undo write proctection in unregister Shaohua Li
2015-11-19 22:33 ` [RFC 6/8] userfaultfd: hook userfault handler to write protection fault Shaohua Li
2015-11-20  2:54   ` Jerome Glisse
2015-11-19 22:33 ` [RFC 7/8] userfaultfd: fault try one more time Shaohua Li
2015-11-20  3:04   ` Jerome Glisse
2015-11-19 22:33 ` [RFC 8/8] userfaultfd: enabled write protection in userfaultfd API Shaohua Li
2015-11-20  3:13 ` [RFC 0/8] userfaultfd: add write protect support Jerome Glisse

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=cover.1447964595.git.shli@fb.com \
    --to=shli@fb.com \
    --cc=akpm@linux-foundation.org \
    --cc=kernel-team@fb.com \
    --cc=linux-mm@kvack.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).