All of lore.kernel.org
 help / color / mirror / Atom feed
From: Pavel Boldin <pboldin@mirantis.com>
To: dev@dpdk.org
Subject: [PATCH v6 2/3] vhost: add EVENTFD_COPY2 ioctl
Date: Wed, 28 Oct 2015 20:33:48 +0200	[thread overview]
Message-ID: <6a5337337b7135d29cf86b82246d031b382055d3.1446056748.git.pboldin@mirantis.com> (raw)
In-Reply-To: <cover.1446055521.git.pboldin@mirantis.com>
In-Reply-To: <1440787880-7079-1-git-send-email-pboldin@mirantis.com>

Signed-off-by: Pavel Boldin <pboldin@mirantis.com>
---
 lib/librte_vhost/eventfd_link/eventfd_link.c | 61 ++++++++++++++++++++++++++++
 lib/librte_vhost/eventfd_link/eventfd_link.h | 28 ++++++++++---
 2 files changed, 84 insertions(+), 5 deletions(-)

diff --git a/lib/librte_vhost/eventfd_link/eventfd_link.c b/lib/librte_vhost/eventfd_link/eventfd_link.c
index 7cbebd4..c54a938 100644
--- a/lib/librte_vhost/eventfd_link/eventfd_link.c
+++ b/lib/librte_vhost/eventfd_link/eventfd_link.c
@@ -78,6 +78,64 @@ fget_from_files(struct files_struct *files, unsigned fd)
 }
 
 static long
+eventfd_link_ioctl_copy2(unsigned long arg)
+{
+	void __user *argp = (void __user *) arg;
+	struct task_struct *task_target = NULL;
+	struct file *file;
+	struct files_struct *files;
+	struct eventfd_copy2 eventfd_copy2;
+	long ret = -EFAULT;
+
+	if (copy_from_user(&eventfd_copy2, argp, sizeof(struct eventfd_copy2)))
+		goto out;
+
+	/*
+	 * Find the task struct for the target pid
+	 */
+	ret = -ESRCH;
+
+	task_target =
+		get_pid_task(find_vpid(eventfd_copy2.pid), PIDTYPE_PID);
+	if (task_target == NULL) {
+		pr_info("Unable to find pid %d\n", eventfd_copy2.pid);
+		goto out;
+	}
+
+	ret = -ESTALE;
+	files = get_files_struct(task_target);
+	if (files == NULL) {
+		pr_info("Failed to get target files struct\n");
+		goto out_task;
+	}
+
+	ret = -EBADF;
+	file = fget_from_files(files, eventfd_copy2.fd);
+	put_files_struct(files);
+
+	if (file == NULL) {
+		pr_info("Failed to get fd %d from target\n", eventfd_copy2.fd);
+		goto out_task;
+	}
+
+	/*
+	 * Install the file struct from the target process into the
+	 * newly allocated file desciptor of the source process.
+	 */
+	ret = get_unused_fd_flags(eventfd_copy2.flags);
+	if (ret < 0) {
+		fput(file);
+		goto out_task;
+	}
+	fd_install(ret, file);
+
+out_task:
+	put_task_struct(task_target);
+out:
+	return ret;
+}
+
+static long
 eventfd_link_ioctl_copy(unsigned long arg)
 {
 	void __user *argp = (void __user *) arg;
@@ -176,6 +234,9 @@ eventfd_link_ioctl(struct file *f, unsigned int ioctl, unsigned long arg)
 	case EVENTFD_COPY:
 		ret = eventfd_link_ioctl_copy(arg);
 		break;
+	case EVENTFD_COPY2:
+		ret = eventfd_link_ioctl_copy2(arg);
+		break;
 	}
 
 	return ret;
diff --git a/lib/librte_vhost/eventfd_link/eventfd_link.h b/lib/librte_vhost/eventfd_link/eventfd_link.h
index ea619ec..5ebc20b 100644
--- a/lib/librte_vhost/eventfd_link/eventfd_link.h
+++ b/lib/librte_vhost/eventfd_link/eventfd_link.h
@@ -61,11 +61,6 @@
 #define _EVENTFD_LINK_H_
 
 /*
- * ioctl to copy an fd entry in calling process to an fd in a target process
- */
-#define EVENTFD_COPY 1
-
-/*
  * arguements for the EVENTFD_COPY ioctl
  */
 struct eventfd_copy {
@@ -73,4 +68,27 @@ struct eventfd_copy {
 	unsigned source_fd; /* fd in the calling pid */
 	pid_t target_pid; /* pid of the target pid */
 };
+
+/*
+ * ioctl to copy an fd entry in calling process to an fd in a target process
+ * NOTE: this one should be
+ * #define EVENTFD_COPY _IOWR('D', 1, struct eventfd_copy) actually
+ */
+#define EVENTFD_COPY 1
+
+/*
+ * arguments for the EVENTFD_COPY2 ioctl
+ */
+struct eventfd_copy2 {
+	unsigned fd; /* fd to steal */
+	pid_t pid; /* pid of the process to steal from */
+	unsigned flags; /* flags to allocate new fd with */
+};
+
+/*
+ * ioctl to copy an fd entry from the target process into newly allocated
+ * fd in the calling process
+ */
+#define EVENTFD_COPY2 _IOW('D', 2, struct eventfd_copy2)
+
 #endif /* _EVENTFD_LINK_H_ */
-- 
1.9.1

  parent reply	other threads:[~2015-10-28 18:34 UTC|newest]

Thread overview: 59+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-03-16 16:40 [PATCH] Fix `eventfd_link' module leakages and races Pavel Boldin
     [not found] ` <1426524059-30886-1-git-send-email-pboldin+dpdk-nYU0QVwCCFFWk0Htik3J/w@public.gmane.org>
2015-03-16 17:55   ` Neil Horman
2015-03-17  1:29   ` Ouyang, Changchun
     [not found]     ` <F52918179C57134FAEC9EA62FA2F962511A5E173-E2R4CRU6q/6iAffOGbnezLfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2015-03-20 15:57       ` Pavel Boldin
2015-03-18 13:16   ` [PATCH v2] " Pavel Boldin
     [not found]     ` <1426684571-14782-1-git-send-email-pboldin-nYU0QVwCCFFWk0Htik3J/w@public.gmane.org>
2015-03-23 11:15       ` Thomas Monjalon
2015-03-23 11:36         ` Pavel Boldin
     [not found]           ` <CACf4_B8buRSAPCFO+fWJjQ8it5n0cgN789jSrsB6Bc-cJGOyHQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-03-23 11:44             ` Thomas Monjalon
2015-03-23 15:15       ` [PATCH v3] vhost: Refactor module `eventfd_link' Pavel Boldin
     [not found]         ` <1427123731-15654-1-git-send-email-pboldin-nYU0QVwCCFFWk0Htik3J/w@public.gmane.org>
2015-04-02 17:01           ` [PATCH v4 0/5] " Pavel Boldin
     [not found]             ` <1427994080-10163-1-git-send-email-pboldin-nYU0QVwCCFFWk0Htik3J/w@public.gmane.org>
2015-04-02 17:01               ` [PATCH v4 1/5] vhost: eventfd_link: moving ioctl to a function Pavel Boldin
2015-05-07  7:57                 ` Xie, Huawei
     [not found]                   ` <C37D651A908B024F974696C65296B57B0F476887-0J0gbvR4kThpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2015-05-07 13:16                     ` Pavel Boldin
2015-05-18  6:06                       ` Xie, Huawei
2015-05-18  9:16                         ` Pavel Boldin
2015-06-18  3:08                       ` Xie, Huawei
2015-04-02 17:01               ` [PATCH v4 2/5] vhost: eventfd_link: add function fget_from_files Pavel Boldin
2015-04-02 17:01               ` [PATCH v4 3/5] vhost: eventfd_link: fix ioctl return values Pavel Boldin
2015-04-02 17:01               ` [PATCH v4 4/5] vhost: eventfd_link: replace copy-pasted sys_close Pavel Boldin
2015-04-02 17:01               ` [PATCH v4 5/5] vhost: eventfd_link: removing extra #includes Pavel Boldin
2015-04-16 11:48               ` [PATCH v5 0/5] Refactor module `eventfd_link' Pavel Boldin
     [not found]                 ` <1429184910-30186-1-git-send-email-pboldin-nYU0QVwCCFFWk0Htik3J/w@public.gmane.org>
2015-04-16 11:48                   ` [PATCH v5 1/5] vhost: eventfd_link: moving ioctl to a function Pavel Boldin
2015-08-28 18:51                     ` [PATCH v5 1/4] vhost: eventfd_link: refactoring EVENTFD_COPY handler Pavel Boldin
2015-09-23 20:25                       ` Pavel Boldin
2015-09-29 19:42                         ` Thomas Monjalon
2015-09-29 23:29                           ` Pavel Boldin
2015-10-20  9:06                       ` Xie, Huawei
2015-10-28 18:33                       ` [PATCH v6 0/3] vhost: eventfd_link refactoring Pavel Boldin
2015-10-29 18:33                         ` Xie, Huawei
2015-10-30 19:10                           ` Thomas Monjalon
2015-10-28 18:33                       ` [PATCH v6 1/3] vhost: eventfd_link: refactoring EVENTFD_COPY handler Pavel Boldin
2015-10-28 18:33                       ` Pavel Boldin [this message]
2015-10-28 18:33                       ` [PATCH v6 3/3] vhost: using EVENTFD_COPY2 Pavel Boldin
2015-08-28 18:51                     ` [PATCH v5 2/4] vhost: add EVENTFD_COPY2 ioctl Pavel Boldin
2015-10-20  9:43                       ` Xie, Huawei
2015-08-28 18:51                     ` [PATCH v5 3/4] vhost: using EVENTFD_COPY2 Pavel Boldin
2015-10-20  9:52                       ` Xie, Huawei
2015-10-21 12:16                         ` Pavel Boldin
2015-10-26  1:45                           ` Xie, Huawei
2015-10-28 18:35                             ` Pavel Boldin
2015-08-28 18:51                     ` [PATCH v5 4/4] DO NOT MERGE: Tests for new eventfd_link module Pavel Boldin
2015-04-16 11:48                   ` [PATCH v5 2/5] vhost: eventfd_link: add function fget_from_files Pavel Boldin
2015-04-16 11:48                   ` [PATCH v5 3/5] vhost: eventfd_link: fix ioctl return values Pavel Boldin
2015-04-16 11:48                   ` [PATCH v5 4/5] vhost: eventfd_link: replace copy-pasted sys_close Pavel Boldin
2015-05-07  6:54                     ` Xie, Huawei
2015-06-17 15:24                       ` Thomas Monjalon
2015-07-09  0:59                         ` Thomas Monjalon
2015-07-10 14:27                         ` Xie, Huawei
2015-07-10 14:50                           ` Pavel Boldin
2015-07-10 15:32                             ` Xie, Huawei
2015-07-10 15:42                             ` Xie, Huawei
2015-07-10 15:49                               ` Thomas Monjalon
2015-07-10 16:06                                 ` Xie, Huawei
2015-07-11 15:08                               ` Pavel Boldin
2015-07-13  1:59                                 ` Xie, Huawei
2015-07-19 12:39                                   ` Pavel Boldin
2015-04-16 11:48                   ` [PATCH v5 5/5] vhost: eventfd_link: removing extra #includes Pavel Boldin
2015-04-28 14:35                   ` [PATCH v5 0/5] Refactor module `eventfd_link' Thomas Monjalon
2015-05-04  5:29                     ` Xie, Huawei

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=6a5337337b7135d29cf86b82246d031b382055d3.1446056748.git.pboldin@mirantis.com \
    --to=pboldin@mirantis.com \
    --cc=dev@dpdk.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 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.