X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fring%2Frte_eth_ring.c;h=76355a1c7691082728773484086b88c1cc4c1219;hb=d04fc01de2298e2b7e405f499a919d1bd4d551f1;hp=6feb137f9240c1bf5108301c28e35fc7844294df;hpb=a6992e9610503a97b431290769e48c89af6c6fec;p=dpdk.git diff --git a/drivers/net/ring/rte_eth_ring.c b/drivers/net/ring/rte_eth_ring.c index 6feb137f92..76355a1c76 100644 --- a/drivers/net/ring/rte_eth_ring.c +++ b/drivers/net/ring/rte_eth_ring.c @@ -36,7 +36,6 @@ #include #include #include -#include #include #include #include @@ -45,12 +44,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 @@ -179,7 +189,7 @@ eth_dev_info(struct rte_eth_dev *dev, dev_info->min_rx_bufsize = 0; } -static void +static int eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) { unsigned i; @@ -203,6 +213,8 @@ eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) stats->ipackets = rx_total; stats->opackets = tx_total; stats->oerrors = tx_err_total; + + return 0; } static void @@ -269,6 +281,8 @@ do_eth_dev_ring_create(const char *name, struct rte_eth_dev_data *data = NULL; struct pmd_internals *internals = NULL; struct rte_eth_dev *eth_dev = NULL; + void **rx_queues_local = NULL; + void **tx_queues_local = NULL; unsigned i; RTE_LOG(INFO, PMD, "Creating rings-backed ethdev on numa socket %u\n", @@ -283,16 +297,16 @@ do_eth_dev_ring_create(const char *name, goto error; } - data->rx_queues = rte_zmalloc_socket(name, + rx_queues_local = rte_zmalloc_socket(name, sizeof(void *) * nb_rx_queues, 0, numa_node); - if (data->rx_queues == NULL) { + if (rx_queues_local == NULL) { rte_errno = ENOMEM; goto error; } - data->tx_queues = rte_zmalloc_socket(name, + tx_queues_local = rte_zmalloc_socket(name, sizeof(void *) * nb_tx_queues, 0, numa_node); - if (data->tx_queues == NULL) { + if (tx_queues_local == NULL) { rte_errno = ENOMEM; goto error; } @@ -319,6 +333,10 @@ do_eth_dev_ring_create(const char *name, /* NOTE: we'll replace the data element, of originally allocated eth_dev * so the rings are local per-process */ + rte_memcpy(data, eth_dev->data, sizeof(*data)); + data->rx_queues = rx_queues_local; + data->tx_queues = tx_queues_local; + internals->action = action; internals->max_rx_queues = nb_rx_queues; internals->max_tx_queues = nb_tx_queues; @@ -332,8 +350,6 @@ do_eth_dev_ring_create(const char *name, } data->dev_private = internals; - data->port_id = eth_dev->data->port_id; - memmove(data->name, eth_dev->data->name, sizeof(data->name)); data->nb_rx_queues = (uint16_t)nb_rx_queues; data->nb_tx_queues = (uint16_t)nb_tx_queues; data->dev_link = pmd_link; @@ -341,9 +357,7 @@ do_eth_dev_ring_create(const char *name, eth_dev->data = data; eth_dev->dev_ops = &ops; - data->dev_flags = RTE_ETH_DEV_DETACHABLE; data->kdrv = RTE_KDRV_NONE; - data->drv_name = pmd_ring_drv.driver.name; data->numa_node = numa_node; /* finally assign rx and tx ops */ @@ -355,10 +369,8 @@ do_eth_dev_ring_create(const char *name, return data->port_id; error: - if (data) { - rte_free(data->rx_queues); - rte_free(data->tx_queues); - } + rte_free(rx_queues_local); + rte_free(tx_queues_local); rte_free(data); rte_free(internals); @@ -372,7 +384,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 }; + uint16_t port_id = RTE_MAX_ETHPORTS; + int ret; /* do some parameter checking */ if (rx_queues == NULL && nb_rx_queues > 0) { @@ -388,9 +411,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 @@ -456,13 +488,14 @@ static int parse_kvlist (const char *key __rte_unused, const char *value, void * ret = -EINVAL; if (!name) { - RTE_LOG(WARNING, PMD, "command line paramter is empty for ring pmd!\n"); + RTE_LOG(WARNING, PMD, "command line parameter is empty for ring pmd!\n"); goto out; } node = strchr(name, ':'); if (!node) { - RTE_LOG(WARNING, PMD, "could not parse node value from %s", name); + RTE_LOG(WARNING, PMD, "could not parse node value from %s\n", + name); goto out; } @@ -471,7 +504,8 @@ static int parse_kvlist (const char *key __rte_unused, const char *value, void * action = strchr(node, ':'); if (!action) { - RTE_LOG(WARNING, PMD, "could not action value from %s", node); + RTE_LOG(WARNING, PMD, "could not parse action value from %s\n", + node); goto out; } @@ -507,6 +541,23 @@ out: return ret; } +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) { @@ -515,6 +566,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 +582,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 +597,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",