From: Jianfeng Tan <jianfeng.tan@intel.com>
To: dev@dpdk.org
Cc: thomas@monjalon.net, Jianfeng Tan <jianfeng.tan@intel.com>
Subject: [dpdk-dev] [PATCH v2 3/5] bus/vdev: bus scan by multi-process channel
Date: Thu, 5 Apr 2018 17:45:01 +0000 [thread overview]
Message-ID: <1522950303-17206-4-git-send-email-jianfeng.tan@intel.com> (raw)
In-Reply-To: <1522950303-17206-1-git-send-email-jianfeng.tan@intel.com>
To scan the vdevs in primary, we send request to primary process
to obtain the names for vdevs.
Only the name is shared from the primary. In probe(), the device
driver is supposed to locate (or request more) the detail
information from the primary.
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
---
drivers/bus/vdev/Makefile | 1 +
drivers/bus/vdev/vdev.c | 134 ++++++++++++++++++++++++++++++++++++++++++----
2 files changed, 125 insertions(+), 10 deletions(-)
diff --git a/drivers/bus/vdev/Makefile b/drivers/bus/vdev/Makefile
index 24d424a..bd0bb89 100644
--- a/drivers/bus/vdev/Makefile
+++ b/drivers/bus/vdev/Makefile
@@ -10,6 +10,7 @@ LIB = librte_bus_vdev.a
CFLAGS += -O3
CFLAGS += $(WERROR_FLAGS)
+CFLAGS += -DALLOW_EXPERIMENTAL_API
# versioning export map
EXPORT_MAP := rte_bus_vdev_version.map
diff --git a/drivers/bus/vdev/vdev.c b/drivers/bus/vdev/vdev.c
index 1d1c642..dd40218 100644
--- a/drivers/bus/vdev/vdev.c
+++ b/drivers/bus/vdev/vdev.c
@@ -224,8 +224,8 @@ alloc_devargs(const char *name, const char *args)
return devargs;
}
-int
-rte_vdev_init(const char *name, const char *args)
+static int
+insert_vdev(const char *name, const char *args, struct rte_vdev_device **p_dev)
{
struct rte_vdev_device *dev;
struct rte_devargs *devargs;
@@ -257,6 +257,33 @@ rte_vdev_init(const char *name, const char *args)
TAILQ_INSERT_TAIL(&vdev_device_list, dev, next);
rte_spinlock_unlock(&vdev_device_list_lock);
+ TAILQ_INSERT_TAIL(&devargs_list, devargs, next);
+
+ if (p_dev)
+ *p_dev = dev;
+
+ return 0;
+
+fail:
+ free(devargs->args);
+ free(devargs);
+ free(dev);
+ return ret;
+}
+
+int
+rte_vdev_init(const char *name, const char *args)
+{
+ struct rte_vdev_device *dev;
+ struct rte_devargs *devargs;
+ int ret;
+
+ ret = insert_vdev(name, args, &dev);
+ if (ret < 0)
+ return ret;
+
+ devargs = dev->device.devargs;
+
ret = vdev_probe_all_drivers(dev);
if (ret) {
if (ret > 0)
@@ -265,17 +292,14 @@ rte_vdev_init(const char *name, const char *args)
rte_spinlock_lock(&vdev_device_list_lock);
TAILQ_REMOVE(&vdev_device_list, dev, next);
rte_spinlock_unlock(&vdev_device_list_lock);
- goto fail;
- }
- TAILQ_INSERT_TAIL(&devargs_list, devargs, next);
+ TAILQ_REMOVE(&devargs_list, devargs, next);
- return 0;
+ free(devargs->args);
+ free(devargs);
+ free(dev);
+ }
-fail:
- free(devargs->args);
- free(devargs);
- free(dev);
return ret;
}
@@ -333,6 +357,68 @@ rte_vdev_uninit(const char *name)
return 0;
}
+struct vdev_param {
+#define VDEV_SCAN_REQ 1
+#define VDEV_SCAN_ONE 2
+#define VDEV_SCAN_REP 3
+ int type;
+ int num;
+ char name[RTE_DEV_NAME_MAX_LEN];
+};
+
+static int vdev_plug(struct rte_device *dev);
+
+static int
+vdev_action(const struct rte_mp_msg *mp_msg, const void *peer)
+{
+ struct rte_vdev_device *dev;
+ struct rte_mp_msg mp_resp;
+ struct vdev_param *ou = (struct vdev_param *)&mp_resp.param;
+ const struct vdev_param *in = (const struct vdev_param *)mp_msg->param;
+ const char *devname;
+ int num;
+
+ strcpy(mp_resp.name, "vdev");
+ mp_resp.len_param = sizeof(*ou);
+ mp_resp.num_fds = 0;
+
+ switch (in->type) {
+ case VDEV_SCAN_REQ:
+ ou->type = VDEV_SCAN_ONE;
+ ou->num = 1;
+ num = 0;
+
+ rte_spinlock_lock(&vdev_device_list_lock);
+ TAILQ_FOREACH(dev, &vdev_device_list, next) {
+ devname = rte_vdev_device_name(dev);
+ if (strlen(devname) == 0)
+ VDEV_LOG(INFO, "vdev with no name is not sent");
+ VDEV_LOG(INFO, "send vdev, %s", devname);
+ strncpy(ou->name, devname, RTE_DEV_NAME_MAX_LEN);
+ if (rte_mp_sendmsg(&mp_resp) < 0)
+ VDEV_LOG(ERR, "send vdev, %s, failed, %s",
+ devname, strerror(rte_errno));
+ num++;
+ }
+ rte_spinlock_unlock(&vdev_device_list_lock);
+
+ ou->type = VDEV_SCAN_REP;
+ ou->num = num;
+ if (rte_mp_reply(&mp_resp, peer) < 0)
+ VDEV_LOG(ERR, "Failed to reply a scan request");
+ break;
+ case VDEV_SCAN_ONE:
+ VDEV_LOG(INFO, "receive vdev, %s", in->name);
+ if (insert_vdev(in->name, NULL, NULL) < 0)
+ VDEV_LOG(ERR, "failed to add vdev, %s", in->name);
+ break;
+ default:
+ VDEV_LOG(ERR, "vdev cannot recognize this message");
+ }
+
+ return 0;
+}
+
static int
vdev_scan(void)
{
@@ -340,6 +426,34 @@ vdev_scan(void)
struct rte_devargs *devargs;
struct vdev_custom_scan *custom_scan;
+ if (rte_mp_action_register("vdev", vdev_action) < 0 &&
+ rte_errno != EEXIST) {
+ VDEV_LOG(ERR, "vdev fails to add action");
+ return -1;
+ }
+
+ if (rte_eal_process_type() == RTE_PROC_SECONDARY) {
+ struct rte_mp_msg mp_req, *mp_rep;
+ struct rte_mp_reply mp_reply;
+ struct timespec ts = {.tv_sec = 5, .tv_nsec = 0};
+ struct vdev_param *req = (struct vdev_param *)mp_req.param;
+ struct vdev_param *resp;
+
+ strcpy(mp_req.name, "vdev");
+ mp_req.len_param = sizeof(*req);
+ mp_req.num_fds = 0;
+ req->type = VDEV_SCAN_REQ;
+ if (rte_mp_request_sync(&mp_req, &mp_reply, &ts) == 0 &&
+ mp_reply.nb_received == 1) {
+ mp_rep = &mp_reply.msgs[0];
+ resp = (struct vdev_param *)mp_rep->param;
+ VDEV_LOG(INFO, "Received %d vdevs", resp->num);
+ } else
+ VDEV_LOG(ERR, "Failed to request vdev from primary");
+
+ /* Fall through to allow private vdevs in secondary process */
+ }
+
/* call custom scan callbacks if any */
rte_spinlock_lock(&vdev_custom_scan_lock);
TAILQ_FOREACH(custom_scan, &vdev_custom_scans, next) {
--
2.7.4
next prev parent reply other threads:[~2018-04-05 17:43 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-04-05 17:44 [dpdk-dev] [PATCH v2 0/5] allow procinfo and pdump on eth vdev Jianfeng Tan
2018-04-05 17:44 ` [dpdk-dev] [PATCH v2 1/5] eal: bring forward multi-process channel init Jianfeng Tan
2018-04-05 17:45 ` [dpdk-dev] [PATCH v2 2/5] bus/vdev: add lock on vdev device list Jianfeng Tan
2018-04-05 17:45 ` Jianfeng Tan [this message]
2018-04-05 17:45 ` [dpdk-dev] [PATCH v2 4/5] drivers/net: not use private eth dev data Jianfeng Tan
2018-04-05 17:45 ` [dpdk-dev] [PATCH v2 5/5] drivers/net: share vdev data to secondary process Jianfeng Tan
2018-04-12 23:30 ` [dpdk-dev] [PATCH v2 0/5] allow procinfo and pdump on eth vdev Thomas Monjalon
2018-04-13 14:39 ` Tan, Jianfeng
2018-04-17 2:24 ` Zhang, Qi Z
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=1522950303-17206-4-git-send-email-jianfeng.tan@intel.com \
--to=jianfeng.tan@intel.com \
--cc=dev@dpdk.org \
--cc=thomas@monjalon.net \
/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).