From patchwork Mon Jun 12 15:25:11 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ferruh Yigit X-Patchwork-Id: 25285 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 71B712C0B; Mon, 12 Jun 2017 17:25:21 +0200 (CEST) Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by dpdk.org (Postfix) with ESMTP id C4B253DC for ; Mon, 12 Jun 2017 17:25:17 +0200 (CEST) Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 12 Jun 2017 08:25:16 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.39,334,1493708400"; d="scan'208";a="273215758" Received: from silpixa00372839.ir.intel.com (HELO silpixa00372839.ger.corp.intel.com) ([10.237.222.154]) by fmsmga004.fm.intel.com with ESMTP; 12 Jun 2017 08:25:15 -0700 From: Ferruh Yigit To: Bruce Richardson Cc: dev@dpdk.org, Ferruh Yigit Date: Mon, 12 Jun 2017 16:25:11 +0100 Message-Id: <20170612152512.11970-2-ferruh.yigit@intel.com> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170612152512.11970-1-ferruh.yigit@intel.com> References: <20170612141354.59062-1-ferruh.yigit@intel.com> <20170612152512.11970-1-ferruh.yigit@intel.com> Subject: [dpdk-dev] [PATCH v5 2/3] net/ring: use EAL APIs in PMD specific API 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: , Errors-To: dev-bounces@dpdk.org Sender: "dev" When ring PMD created via PMD specific API instead of EAL abstraction it is missing the virtual device creation done by EAL vdev. And this makes eth_dev unusable exact same as other PMDs used, because of some missing fields, like rte_device->name. Now API calls EAL APIs to create ring PMDs. Signed-off-by: Ferruh Yigit Acked-by: Bruce Richardson --- v5: * fix build error * add sanity check where addr get --- drivers/net/ring/rte_eth_ring.c | 83 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 77 insertions(+), 6 deletions(-) diff --git a/drivers/net/ring/rte_eth_ring.c b/drivers/net/ring/rte_eth_ring.c index 6feb137..73ec2e4 100644 --- a/drivers/net/ring/rte_eth_ring.c +++ b/drivers/net/ring/rte_eth_ring.c @@ -45,12 +45,23 @@ #define ETH_RING_NUMA_NODE_ACTION_ARG "nodeaction" #define ETH_RING_ACTION_CREATE "CREATE" #define ETH_RING_ACTION_ATTACH "ATTACH" +#define ETH_RING_INTERNAL_ARG "internal" static const char *valid_arguments[] = { ETH_RING_NUMA_NODE_ACTION_ARG, + ETH_RING_INTERNAL_ARG, NULL }; +struct ring_internal_args { + struct rte_ring * const *rx_queues; + const unsigned int nb_rx_queues; + struct rte_ring * const *tx_queues; + const unsigned int nb_tx_queues; + const unsigned int numa_node; + void *addr; /* self addr for sanity check */ +}; + enum dev_action { DEV_CREATE, DEV_ATTACH @@ -372,7 +383,18 @@ rte_eth_from_rings(const char *name, struct rte_ring *const rx_queues[], const unsigned nb_tx_queues, const unsigned numa_node) { - struct rte_eth_dev *eth_dev = NULL; + struct ring_internal_args args = { + .rx_queues = rx_queues, + .nb_rx_queues = nb_rx_queues, + .tx_queues = tx_queues, + .nb_tx_queues = nb_tx_queues, + .numa_node = numa_node, + .addr = &args, + }; + char args_str[32] = { 0 }; + char ring_name[32] = { 0 }; + uint8_t port_id = RTE_MAX_ETHPORTS; + int ret; /* do some parameter checking */ if (rx_queues == NULL && nb_rx_queues > 0) { @@ -388,9 +410,18 @@ rte_eth_from_rings(const char *name, struct rte_ring *const rx_queues[], return -1; } - return do_eth_dev_ring_create(name, rx_queues, nb_rx_queues, - tx_queues, nb_tx_queues, numa_node, DEV_ATTACH, - ð_dev); + snprintf(args_str, 32, "%s=%p", ETH_RING_INTERNAL_ARG, &args); + snprintf(ring_name, 32, "net_ring_%s", name); + + ret = rte_vdev_init(ring_name, args_str); + if (ret) { + rte_errno = EINVAL; + return -1; + } + + rte_eth_dev_get_port_by_name(ring_name, &port_id); + + return port_id; } int @@ -508,6 +539,23 @@ static int parse_kvlist (const char *key __rte_unused, const char *value, void * } static int +parse_internal_args(const char *key __rte_unused, const char *value, + void *data) +{ + struct ring_internal_args **internal_args = data; + void *args; + + sscanf(value, "%p", &args); + + *internal_args = args; + + if ((*internal_args)->addr != args) + return -1; + + return 0; +} + +static int rte_pmd_ring_probe(struct rte_vdev_device *dev) { const char *name, *params; @@ -515,6 +563,7 @@ rte_pmd_ring_probe(struct rte_vdev_device *dev) int ret = 0; struct node_action_list *info = NULL; struct rte_eth_dev *eth_dev = NULL; + struct ring_internal_args *internal_args; name = rte_vdev_device_name(dev); params = rte_vdev_device_args(dev); @@ -530,8 +579,7 @@ rte_pmd_ring_probe(struct rte_vdev_device *dev) ret = eth_dev_ring_create(name, rte_socket_id(), DEV_ATTACH, ð_dev); } - } - else { + } else { kvlist = rte_kvargs_parse(params, valid_arguments); if (!kvlist) { @@ -546,7 +594,30 @@ rte_pmd_ring_probe(struct rte_vdev_device *dev) ret = eth_dev_ring_create(name, rte_socket_id(), DEV_ATTACH, ð_dev); } + + if (eth_dev) + eth_dev->device = &dev->device; + return ret; + } + + if (rte_kvargs_count(kvlist, ETH_RING_INTERNAL_ARG) == 1) { + ret = rte_kvargs_process(kvlist, ETH_RING_INTERNAL_ARG, + parse_internal_args, + &internal_args); + if (ret < 0) + goto out_free; + + ret = do_eth_dev_ring_create(name, + internal_args->rx_queues, + internal_args->nb_rx_queues, + internal_args->tx_queues, + internal_args->nb_tx_queues, + internal_args->numa_node, + DEV_ATTACH, + ð_dev); + if (ret >= 0) + ret = 0; } else { ret = rte_kvargs_count(kvlist, ETH_RING_NUMA_NODE_ACTION_ARG); info = rte_zmalloc("struct node_action_list",