From: Maxime Coquelin <maxime.coquelin@redhat.com>
To: dev@dpdk.org, chenbo.xia@intel.com, david.marchand@redhat.com,
mkp@redhat.com, fbl@redhat.com, jasowang@redhat.com,
cunming.liang@intel.com, xieyongji@bytedance.com,
echaudro@redhat.com, eperezma@redhat.com, amorenoz@redhat.com,
lulu@redhat.com
Cc: Maxime Coquelin <maxime.coquelin@redhat.com>
Subject: [PATCH v3 22/28] vhost: add VDUSE events handler
Date: Thu, 25 May 2023 18:25:45 +0200 [thread overview]
Message-ID: <20230525162551.70359-23-maxime.coquelin@redhat.com> (raw)
In-Reply-To: <20230525162551.70359-1-maxime.coquelin@redhat.com>
This patch makes use of Vhost lib's FD manager to install
a handler for VDUSE events occurring on the VDUSE device FD.
Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
Reviewed-by: Chenbo Xia <chenbo.xia@intel.com>
---
lib/vhost/vduse.c | 101 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 101 insertions(+)
diff --git a/lib/vhost/vduse.c b/lib/vhost/vduse.c
index d39e39b9dc..92c515cff2 100644
--- a/lib/vhost/vduse.c
+++ b/lib/vhost/vduse.c
@@ -17,6 +17,7 @@
#include <rte_common.h>
+#include "fd_man.h"
#include "iotlb.h"
#include "vduse.h"
#include "vhost.h"
@@ -42,6 +43,31 @@
(1ULL << VIRTIO_F_IN_ORDER) | \
(1ULL << VIRTIO_F_IOMMU_PLATFORM))
+struct vduse {
+ struct fdset fdset;
+};
+
+static struct vduse vduse = {
+ .fdset = {
+ .fd = { [0 ... MAX_FDS - 1] = {-1, NULL, NULL, NULL, 0} },
+ .fd_mutex = PTHREAD_MUTEX_INITIALIZER,
+ .fd_pooling_mutex = PTHREAD_MUTEX_INITIALIZER,
+ .num = 0
+ },
+};
+
+static bool vduse_events_thread;
+
+static const char * const vduse_reqs_str[] = {
+ "VDUSE_GET_VQ_STATE",
+ "VDUSE_SET_STATUS",
+ "VDUSE_UPDATE_IOTLB",
+};
+
+#define vduse_req_id_to_str(id) \
+ (id < RTE_DIM(vduse_reqs_str) ? \
+ vduse_reqs_str[id] : "Unknown")
+
static int
vduse_inject_irq(struct virtio_net *dev, struct vhost_virtqueue *vq)
{
@@ -115,16 +141,80 @@ static struct vhost_backend_ops vduse_backend_ops = {
.inject_irq = vduse_inject_irq,
};
+static void
+vduse_events_handler(int fd, void *arg, int *remove __rte_unused)
+{
+ struct virtio_net *dev = arg;
+ struct vduse_dev_request req;
+ struct vduse_dev_response resp;
+ int ret;
+
+ memset(&resp, 0, sizeof(resp));
+
+ ret = read(fd, &req, sizeof(req));
+ if (ret < 0) {
+ VHOST_LOG_CONFIG(dev->ifname, ERR, "Failed to read request: %s\n",
+ strerror(errno));
+ return;
+ } else if (ret < (int)sizeof(req)) {
+ VHOST_LOG_CONFIG(dev->ifname, ERR, "Incomplete to read request %d\n", ret);
+ return;
+ }
+
+ VHOST_LOG_CONFIG(dev->ifname, INFO, "New request: %s (%u)\n",
+ vduse_req_id_to_str(req.type), req.type);
+
+ switch (req.type) {
+ default:
+ resp.result = VDUSE_REQ_RESULT_FAILED;
+ break;
+ }
+
+ resp.request_id = req.request_id;
+
+ ret = write(dev->vduse_dev_fd, &resp, sizeof(resp));
+ if (ret != sizeof(resp)) {
+ VHOST_LOG_CONFIG(dev->ifname, ERR, "Failed to write response %s\n",
+ strerror(errno));
+ return;
+ }
+ VHOST_LOG_CONFIG(dev->ifname, INFO, "Request %s (%u) handled successfully\n",
+ vduse_req_id_to_str(req.type), req.type);
+}
+
int
vduse_device_create(const char *path)
{
int control_fd, dev_fd, vid, ret;
+ pthread_t fdset_tid;
uint32_t i;
struct virtio_net *dev;
uint64_t ver = VHOST_VDUSE_API_VERSION;
struct vduse_dev_config *dev_config = NULL;
const char *name = path + strlen("/dev/vduse/");
+ /* If first device, create events dispatcher thread */
+ if (vduse_events_thread == false) {
+ /**
+ * create a pipe which will be waited by poll and notified to
+ * rebuild the wait list of poll.
+ */
+ if (fdset_pipe_init(&vduse.fdset) < 0) {
+ VHOST_LOG_CONFIG(path, ERR, "failed to create pipe for vduse fdset\n");
+ return -1;
+ }
+
+ ret = rte_ctrl_thread_create(&fdset_tid, "vduse-events", NULL,
+ fdset_event_dispatch, &vduse.fdset);
+ if (ret != 0) {
+ VHOST_LOG_CONFIG(path, ERR, "failed to create vduse fdset handling thread\n");
+ fdset_pipe_uninit(&vduse.fdset);
+ return -1;
+ }
+
+ vduse_events_thread = true;
+ }
+
control_fd = open(VDUSE_CTRL_PATH, O_RDWR);
if (control_fd < 0) {
VHOST_LOG_CONFIG(name, ERR, "Failed to open %s: %s\n",
@@ -215,6 +305,14 @@ vduse_device_create(const char *path)
}
}
+ ret = fdset_add(&vduse.fdset, dev->vduse_dev_fd, vduse_events_handler, NULL, dev);
+ if (ret) {
+ VHOST_LOG_CONFIG(name, ERR, "Failed to add fd %d to vduse fdset\n",
+ dev->vduse_dev_fd);
+ goto out_dev_destroy;
+ }
+ fdset_pipe_notify(&vduse.fdset);
+
free(dev_config);
return 0;
@@ -253,6 +351,9 @@ vduse_device_destroy(const char *path)
if (vid == RTE_MAX_VHOST_DEVICE)
return -1;
+ fdset_del(&vduse.fdset, dev->vduse_dev_fd);
+ fdset_pipe_notify(&vduse.fdset);
+
if (dev->vduse_dev_fd >= 0) {
close(dev->vduse_dev_fd);
dev->vduse_dev_fd = -1;
--
2.40.1
next prev parent reply other threads:[~2023-05-25 16:28 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-05-25 16:25 [PATCH v3 00/28] Add VDUSE support to Vhost library Maxime Coquelin
2023-05-25 16:25 ` [PATCH v3 01/28] vhost: fix missing guest notif stat increment Maxime Coquelin
2023-06-01 19:59 ` Maxime Coquelin
2023-05-25 16:25 ` [PATCH v3 02/28] vhost: fix invalid call FD handling Maxime Coquelin
2023-05-25 16:25 ` [PATCH v3 03/28] vhost: fix IOTLB entries overlap check with previous entry Maxime Coquelin
2023-05-25 16:25 ` [PATCH v3 04/28] vhost: add helper of IOTLB entries coredump Maxime Coquelin
2023-05-26 8:46 ` David Marchand
2023-06-01 13:43 ` Maxime Coquelin
2023-05-25 16:25 ` [PATCH v3 05/28] vhost: add helper for IOTLB entries shared page check Maxime Coquelin
2023-05-25 16:25 ` [PATCH v3 06/28] vhost: don't dump unneeded pages with IOTLB Maxime Coquelin
2023-05-25 16:25 ` [PATCH v3 07/28] vhost: change to single IOTLB cache per device Maxime Coquelin
2023-05-29 6:32 ` Xia, Chenbo
2023-05-25 16:25 ` [PATCH v3 08/28] vhost: add offset field to IOTLB entries Maxime Coquelin
2023-05-25 16:25 ` [PATCH v3 09/28] vhost: add page size info to IOTLB entry Maxime Coquelin
2023-05-29 6:32 ` Xia, Chenbo
2023-05-25 16:25 ` [PATCH v3 10/28] vhost: retry translating IOVA after IOTLB miss Maxime Coquelin
2023-05-25 16:25 ` [PATCH v3 11/28] vhost: introduce backend ops Maxime Coquelin
2023-05-25 16:25 ` [PATCH v3 12/28] vhost: add IOTLB cache entry removal callback Maxime Coquelin
2023-05-29 6:33 ` Xia, Chenbo
2023-05-25 16:25 ` [PATCH v3 13/28] vhost: add helper for IOTLB misses Maxime Coquelin
2023-05-29 6:33 ` Xia, Chenbo
2023-05-25 16:25 ` [PATCH v3 14/28] vhost: add helper for interrupt injection Maxime Coquelin
2023-05-26 8:54 ` David Marchand
2023-06-01 13:58 ` Maxime Coquelin
2023-05-25 16:25 ` [PATCH v3 15/28] vhost: add API to set max queue pairs Maxime Coquelin
2023-05-26 8:58 ` David Marchand
2023-06-01 14:00 ` Maxime Coquelin
2023-05-25 16:25 ` [PATCH v3 16/28] net/vhost: use " Maxime Coquelin
2023-05-25 16:25 ` [PATCH v3 17/28] vhost: add control virtqueue support Maxime Coquelin
2023-05-29 6:51 ` Xia, Chenbo
2023-05-25 16:25 ` [PATCH v3 18/28] vhost: add VDUSE device creation and destruction Maxime Coquelin
2023-05-26 9:11 ` David Marchand
2023-06-01 14:05 ` Maxime Coquelin
2023-05-25 16:25 ` [PATCH v3 19/28] vhost: add VDUSE callback for IOTLB miss Maxime Coquelin
2023-05-25 16:25 ` [PATCH v3 20/28] vhost: add VDUSE callback for IOTLB entry removal Maxime Coquelin
2023-05-29 6:51 ` Xia, Chenbo
2023-05-25 16:25 ` [PATCH v3 21/28] vhost: add VDUSE callback for IRQ injection Maxime Coquelin
2023-05-25 16:25 ` Maxime Coquelin [this message]
2023-05-25 16:25 ` [PATCH v3 23/28] vhost: add support for virtqueue state get event Maxime Coquelin
2023-05-25 16:25 ` [PATCH v3 24/28] vhost: add support for VDUSE status set event Maxime Coquelin
2023-05-25 16:25 ` [PATCH v3 25/28] vhost: add support for VDUSE IOTLB update event Maxime Coquelin
2023-05-29 6:52 ` Xia, Chenbo
2023-05-25 16:25 ` [PATCH v3 26/28] vhost: add VDUSE device startup Maxime Coquelin
2023-05-25 16:25 ` [PATCH v3 27/28] vhost: add multiqueue support to VDUSE Maxime Coquelin
2023-05-25 16:25 ` [PATCH v3 28/28] vhost: add VDUSE device stop Maxime Coquelin
2023-05-29 6:53 ` Xia, Chenbo
2023-06-01 18:48 ` Maxime Coquelin
2023-05-26 9:14 ` [PATCH v3 00/28] Add VDUSE support to Vhost library David Marchand
2023-06-01 14:59 ` Maxime Coquelin
2023-06-01 15:18 ` David Marchand
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=20230525162551.70359-23-maxime.coquelin@redhat.com \
--to=maxime.coquelin@redhat.com \
--cc=amorenoz@redhat.com \
--cc=chenbo.xia@intel.com \
--cc=cunming.liang@intel.com \
--cc=david.marchand@redhat.com \
--cc=dev@dpdk.org \
--cc=echaudro@redhat.com \
--cc=eperezma@redhat.com \
--cc=fbl@redhat.com \
--cc=jasowang@redhat.com \
--cc=lulu@redhat.com \
--cc=mkp@redhat.com \
--cc=xieyongji@bytedance.com \
/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).