All of lore.kernel.org
 help / color / mirror / Atom feed
From: Roman Penyaev <rpenyaev@suse.de>
To: unlisted-recipients:; (no To-header on input)
Cc: Roman Penyaev <rpenyaev@suse.de>,
	Andrew Morton <akpm@linux-foundation.org>,
	Al Viro <viro@zeniv.linux.org.uk>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH v4 12/14] epoll: support mapping for epfd when polled from userspace
Date: Tue, 11 Jun 2019 16:54:56 +0200	[thread overview]
Message-ID: <20190611145458.9540-13-rpenyaev@suse.de> (raw)
In-Reply-To: <20190611145458.9540-1-rpenyaev@suse.de>

User has to mmap user_header and user_index vmalloce'd pointers in order
to consume events from userspace.  Also we do not let any copies of vma
on fork().

Signed-off-by: Roman Penyaev <rpenyaev@suse.de>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: linux-fsdevel@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
---
 fs/eventpoll.c | 36 ++++++++++++++++++++++++++++++++++++
 1 file changed, 36 insertions(+)

diff --git a/fs/eventpoll.c b/fs/eventpoll.c
index e42ddf580556..c5db15c5f8b0 100644
--- a/fs/eventpoll.c
+++ b/fs/eventpoll.c
@@ -1426,11 +1426,47 @@ static void ep_show_fdinfo(struct seq_file *m, struct file *f)
 }
 #endif
 
+static int ep_eventpoll_mmap(struct file *filep, struct vm_area_struct *vma)
+{
+	struct eventpoll *ep = vma->vm_file->private_data;
+	size_t size;
+	int rc;
+
+	if (!ep_polled_by_user(ep))
+		return -ENOTSUPP;
+
+	size = vma->vm_end - vma->vm_start;
+	if (!vma->vm_pgoff && size > ep->header_length)
+		return -ENXIO;
+	if (vma->vm_pgoff && ep->header_length != (vma->vm_pgoff << PAGE_SHIFT))
+		/* Index ring starts exactly after the header */
+		return -ENXIO;
+	if (vma->vm_pgoff && size > ep->index_length)
+		return -ENXIO;
+
+	/*
+	 * vm_pgoff is used *only* for indication, what is mapped: user header
+	 * or user index ring.  Sizes are checked above.
+	 */
+	if (!vma->vm_pgoff)
+		rc = remap_vmalloc_range_partial(vma, vma->vm_start,
+						 ep->user_header, size);
+	else
+		rc = remap_vmalloc_range_partial(vma, vma->vm_start,
+						 ep->user_index, size);
+	if (likely(!rc))
+		/* No copies for forks(), please */
+		vma->vm_flags |= VM_DONTCOPY;
+
+	return rc;
+}
+
 /* File callbacks that implement the eventpoll file behaviour */
 static const struct file_operations eventpoll_fops = {
 #ifdef CONFIG_PROC_FS
 	.show_fdinfo	= ep_show_fdinfo,
 #endif
+	.mmap		= ep_eventpoll_mmap,
 	.release	= ep_eventpoll_release,
 	.poll		= ep_eventpoll_poll,
 	.llseek		= noop_llseek,
-- 
2.21.0


  parent reply	other threads:[~2019-06-11 14:55 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-11 14:54 [PATCH v4 00/14] epoll: support pollable epoll from userspace Roman Penyaev
2019-06-11 14:54 ` [PATCH v4 01/14] epoll: move private helpers from a header to the source Roman Penyaev
2019-06-11 14:54 ` [PATCH v4 02/14] epoll: introduce user structures for polling from userspace Roman Penyaev
2019-06-11 14:54 ` [PATCH v4 03/14] epoll: allocate user header and user events ring " Roman Penyaev
2019-06-11 14:54 ` [PATCH v4 04/14] epoll: some sanity flags checks for epoll syscalls " Roman Penyaev
2019-06-11 14:54 ` [PATCH v4 05/14] epoll: offload polling to a work in case of epfd polled " Roman Penyaev
2019-06-11 14:54 ` [PATCH v4 06/14] epoll: introduce helpers for adding/removing events to uring Roman Penyaev
2019-06-11 14:54 ` [PATCH v4 07/14] epoll: call ep_add_event_to_uring() from ep_poll_callback() Roman Penyaev
2019-06-11 14:54 ` [PATCH v4 08/14] epoll: support polling from userspace for ep_insert() Roman Penyaev
2019-06-11 14:54 ` [PATCH v4 09/14] epoll: support polling from userspace for ep_remove() Roman Penyaev
2019-06-11 14:54 ` [PATCH v4 10/14] epoll: support polling from userspace for ep_modify() Roman Penyaev
2019-06-11 14:54 ` [PATCH v4 11/14] epoll: support polling from userspace for ep_poll() Roman Penyaev
2019-06-11 14:54 ` Roman Penyaev [this message]
2019-06-11 14:54 ` [PATCH v4 13/14] epoll: implement epoll_create2() syscall Roman Penyaev
2019-06-11 14:54 ` [PATCH v4 14/14] kselftest: add uepoll-test which tests polling from userspace Roman Penyaev
2019-07-26 23:22 ` [PATCH v4 00/14] epoll: support pollable epoll " Andrew Morton
2019-07-27 17:16   ` Eric Wong

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=20190611145458.9540-13-rpenyaev@suse.de \
    --to=rpenyaev@suse.de \
    --cc=akpm@linux-foundation.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=torvalds@linux-foundation.org \
    --cc=viro@zeniv.linux.org.uk \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.