From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by dpdk.org (Postfix) with ESMTP id C37BA1B1BB for ; Mon, 9 Oct 2017 12:53:44 +0200 (CEST) Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 09 Oct 2017 03:53:44 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.42,500,1500966000"; d="scan'208";a="321115956" Received: from dpdk06.sh.intel.com ([10.67.110.196]) by fmsmga004.fm.intel.com with ESMTP; 09 Oct 2017 03:53:41 -0700 From: Jianfeng Tan To: dev@dpdk.org Cc: jblunck@infradead.org, bruce.richardson@intel.com, konstantin.ananyev@intel.com, pablo.de.lara.guarch@intel.com, thomas@monjalon.net, yliu@fridaylinux.org, maxime.coquelin@redhat.com, mtetsuyah@gmail.com, ferruh.yigit@intel.com, Jianfeng Tan Date: Mon, 9 Oct 2017 10:55:02 +0000 Message-Id: <1507546506-25227-2-git-send-email-jianfeng.tan@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1507546506-25227-1-git-send-email-jianfeng.tan@intel.com> References: <1507519229-80692-1-git-send-email-jianfeng.tan@intel.com> <1507546506-25227-1-git-send-email-jianfeng.tan@intel.com> Subject: [dpdk-dev] [PATCH v4 1/5] bus/vdev: scan and probe vdev in secondary processes X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 09 Oct 2017 10:53:45 -0000 Base on primary/secondary communication channel, we add vdev action to scan virtual devices in secondary processes. Signed-off-by: Jianfeng Tan --- drivers/bus/vdev/vdev.c | 104 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 100 insertions(+), 4 deletions(-) diff --git a/drivers/bus/vdev/vdev.c b/drivers/bus/vdev/vdev.c index e0ba0da..1d1690f 100644 --- a/drivers/bus/vdev/vdev.c +++ b/drivers/bus/vdev/vdev.c @@ -104,7 +104,7 @@ vdev_probe_all_drivers(struct rte_vdev_device *dev) name = rte_vdev_device_name(dev); - VDEV_LOG(DEBUG, "Search driver %s to probe device %s\n", name, + VDEV_LOG(DEBUG, "Search driver %s to probe device %s", name, rte_vdev_device_name(dev)); if (vdev_parse(name, &driver)) @@ -190,7 +190,7 @@ rte_vdev_init(const char *name, const char *args) ret = vdev_probe_all_drivers(dev); if (ret) { if (ret > 0) - VDEV_LOG(ERR, "no driver found for %s\n", name); + VDEV_LOG(ERR, "no driver found for %s", name); goto fail; } @@ -213,7 +213,7 @@ vdev_remove_driver(struct rte_vdev_device *dev) const struct rte_vdev_driver *driver; if (!dev->device.driver) { - VDEV_LOG(DEBUG, "no driver attach to device %s\n", name); + VDEV_LOG(DEBUG, "no driver attach to device %s", name); return 1; } @@ -252,12 +252,105 @@ rte_vdev_uninit(const char *name) return 0; } +struct vdev_action_params { +#define VDEV_SCAN_REQUEST 1 +#define VDEV_SCAN_RESPONSE 2 + int type; + char name[32]; +}; + +static int vdev_plug(struct rte_device *dev); + +static int +vdev_action(const void *params, int len, + int fds[] __rte_unused, + int fds_num __rte_unused) +{ + struct rte_vdev_device *dev; + struct rte_devargs *devargs; + struct vdev_action_params ou_params; + const struct vdev_action_params *in_params = params; + + switch (in_params->type) { + case VDEV_SCAN_REQUEST: + ou_params.type = VDEV_SCAN_RESPONSE; + TAILQ_FOREACH(dev, &vdev_device_list, next) { + VDEV_LOG(INFO, "push vdev, %s", dev->device.name); + strncpy(ou_params.name, dev->device.name, 32); + rte_eal_mp_sendmsg("vdev", &ou_params, + len, NULL, 0); + } + break; + case VDEV_SCAN_RESPONSE: + VDEV_LOG(INFO, "get vdev, %s", in_params->name); + + if (strlen(in_params->name) == 0) { + VDEV_LOG(ERR, "invalid name was passed"); + break; + } + + dev = find_vdev(in_params->name); + if (dev) { + VDEV_LOG(ERR, "vdev already exists: %s", in_params->name); + break; + } + + devargs = alloc_devargs(in_params->name, NULL); + if (!devargs) { + VDEV_LOG(ERR, "failed to allocate memory"); + break; + } + + dev = calloc(1, sizeof(*dev)); + if (!dev) { + VDEV_LOG(ERR, "failed to allocate memory"); + free(devargs); + break; + } + + dev->device.devargs = devargs; + dev->device.numa_node = 0; /* to be corrected in probe() */ + dev->device.name = devargs->name; + + TAILQ_INSERT_TAIL(&devargs_list, devargs, next); + TAILQ_INSERT_TAIL(&vdev_device_list, dev, next); + + if (vdev_plug(&dev->device) < 0) { + VDEV_LOG(ERR, "failed to plug device %s", in_params->name); + free(devargs); + free(dev); + } else + VDEV_LOG(INFO, "plug in device: %s", in_params->name); + + break; + default: + VDEV_LOG(ERR, "vdev cannot recognize this message"); + } + + return 0; +} + static int vdev_scan(void) { struct rte_vdev_device *dev; struct rte_devargs *devargs; + if (rte_eal_mp_action_register("vdev", vdev_action) < 0) { + VDEV_LOG(ERR, "vdev fails to add action"); + return -1; + } + + if (rte_eal_process_type() == RTE_PROC_SECONDARY) { + struct vdev_action_params params; + + params.type = VDEV_SCAN_REQUEST; + rte_eal_mp_sendmsg("vdev", ¶ms, + sizeof(params), NULL, 0); + + return 0; + } + /* for virtual devices we scan the devargs_list populated via cmdline */ TAILQ_FOREACH(devargs, &devargs_list, next) { @@ -287,6 +380,9 @@ vdev_probe(void) { struct rte_vdev_device *dev; + if (rte_eal_process_type() == RTE_PROC_SECONDARY) + return 0; + /* call the init function for each virtual device */ TAILQ_FOREACH(dev, &vdev_device_list, next) { @@ -294,7 +390,7 @@ vdev_probe(void) continue; if (vdev_probe_all_drivers(dev)) { - VDEV_LOG(ERR, "failed to initialize %s device\n", + VDEV_LOG(ERR, "failed to initialize %s device", rte_vdev_device_name(dev)); return -1; } -- 2.7.4