Message ID | 20190121075722.7945-21-peterx@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | userfaultfd: write protection support | expand |
On Mon, Jan 21, 2019 at 03:57:18PM +0800, Peter Xu wrote: > It does not make sense to try to wake up any waiting thread when we're > write-protecting a memory region. Only wake up when resolving a write > protected page fault. Probably it would be better to make it default to wake up only when requested explicitly? Then we can simply disallow _DONTWAKE for uffd_wp and only use UFFDIO_WRITEPROTECT_MODE_WP as possible mode. > Signed-off-by: Peter Xu <peterx@redhat.com> > --- > fs/userfaultfd.c | 13 ++++++++----- > 1 file changed, 8 insertions(+), 5 deletions(-) > > diff --git a/fs/userfaultfd.c b/fs/userfaultfd.c > index 455b87c0596f..e54ab6076e13 100644 > --- a/fs/userfaultfd.c > +++ b/fs/userfaultfd.c > @@ -1771,6 +1771,7 @@ static int userfaultfd_writeprotect(struct userfaultfd_ctx *ctx, > struct uffdio_writeprotect uffdio_wp; > struct uffdio_writeprotect __user *user_uffdio_wp; > struct userfaultfd_wake_range range; > + bool mode_wp, mode_dontwake; > > user_uffdio_wp = (struct uffdio_writeprotect __user *) arg; > > @@ -1786,17 +1787,19 @@ static int userfaultfd_writeprotect(struct userfaultfd_ctx *ctx, > if (uffdio_wp.mode & ~(UFFDIO_WRITEPROTECT_MODE_DONTWAKE | > UFFDIO_WRITEPROTECT_MODE_WP)) > return -EINVAL; > - if ((uffdio_wp.mode & UFFDIO_WRITEPROTECT_MODE_WP) && > - (uffdio_wp.mode & UFFDIO_WRITEPROTECT_MODE_DONTWAKE)) > + > + mode_wp = uffdio_wp.mode & UFFDIO_WRITEPROTECT_MODE_WP; > + mode_dontwake = uffdio_wp.mode & UFFDIO_WRITEPROTECT_MODE_DONTWAKE; > + > + if (mode_wp && mode_dontwake) > return -EINVAL; > > ret = mwriteprotect_range(ctx->mm, uffdio_wp.range.start, > - uffdio_wp.range.len, uffdio_wp.mode & > - UFFDIO_WRITEPROTECT_MODE_WP); > + uffdio_wp.range.len, mode_wp); > if (ret) > return ret; > > - if (!(uffdio_wp.mode & UFFDIO_WRITEPROTECT_MODE_DONTWAKE)) { > + if (!mode_wp && !mode_dontwake) { > range.start = uffdio_wp.range.start; > range.len = uffdio_wp.range.len; > wake_userfault(ctx, &range); > -- > 2.17.1 >
On Mon, Jan 21, 2019 at 01:10:39PM +0200, Mike Rapoport wrote: > On Mon, Jan 21, 2019 at 03:57:18PM +0800, Peter Xu wrote: > > It does not make sense to try to wake up any waiting thread when we're > > write-protecting a memory region. Only wake up when resolving a write > > protected page fault. > > Probably it would be better to make it default to wake up only when > requested explicitly? Yes, I think that's what this series does? Now when we do UFFDIO_WRITEPROTECT with !WP and !DONTWAKE then we'll first resolve the page fault, then wake up the process properly. And we request that explicity using !WP and DONTWAKE. Or did I misunderstood the question? > Then we can simply disallow _DONTWAKE for uffd_wp and only use > UFFDIO_WRITEPROTECT_MODE_WP as possible mode. I'd admit I don't know the major usage of DONTWAKE (and I'd be glad to know...), however since we have this flag for both UFFDIO_COPY and UFFDIO_ZEROCOPY, then it seems sane to have DONTWAKE for WRITEPROTECT too? Or is there any other explicit reason to omit it? Thanks!
diff --git a/fs/userfaultfd.c b/fs/userfaultfd.c index 455b87c0596f..e54ab6076e13 100644 --- a/fs/userfaultfd.c +++ b/fs/userfaultfd.c @@ -1771,6 +1771,7 @@ static int userfaultfd_writeprotect(struct userfaultfd_ctx *ctx, struct uffdio_writeprotect uffdio_wp; struct uffdio_writeprotect __user *user_uffdio_wp; struct userfaultfd_wake_range range; + bool mode_wp, mode_dontwake; user_uffdio_wp = (struct uffdio_writeprotect __user *) arg; @@ -1786,17 +1787,19 @@ static int userfaultfd_writeprotect(struct userfaultfd_ctx *ctx, if (uffdio_wp.mode & ~(UFFDIO_WRITEPROTECT_MODE_DONTWAKE | UFFDIO_WRITEPROTECT_MODE_WP)) return -EINVAL; - if ((uffdio_wp.mode & UFFDIO_WRITEPROTECT_MODE_WP) && - (uffdio_wp.mode & UFFDIO_WRITEPROTECT_MODE_DONTWAKE)) + + mode_wp = uffdio_wp.mode & UFFDIO_WRITEPROTECT_MODE_WP; + mode_dontwake = uffdio_wp.mode & UFFDIO_WRITEPROTECT_MODE_DONTWAKE; + + if (mode_wp && mode_dontwake) return -EINVAL; ret = mwriteprotect_range(ctx->mm, uffdio_wp.range.start, - uffdio_wp.range.len, uffdio_wp.mode & - UFFDIO_WRITEPROTECT_MODE_WP); + uffdio_wp.range.len, mode_wp); if (ret) return ret; - if (!(uffdio_wp.mode & UFFDIO_WRITEPROTECT_MODE_DONTWAKE)) { + if (!mode_wp && !mode_dontwake) { range.start = uffdio_wp.range.start; range.len = uffdio_wp.range.len; wake_userfault(ctx, &range);
It does not make sense to try to wake up any waiting thread when we're write-protecting a memory region. Only wake up when resolving a write protected page fault. Signed-off-by: Peter Xu <peterx@redhat.com> --- fs/userfaultfd.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-)