X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fring%2Frte_eth_ring.c;h=cc60008c9165bbab493b9760a178cea4a6cacb22;hb=32b12e75679230b1104b9e6547a1ff3c4a360e05;hp=ada025ffeb8d8e5f28d061417b70acc5a97c7d6f;hpb=9c6dfcb720806dbded289d9aecb26f02f001dd49;p=dpdk.git diff --git a/drivers/net/ring/rte_eth_ring.c b/drivers/net/ring/rte_eth_ring.c index ada025ffeb..cc60008c91 100644 --- a/drivers/net/ring/rte_eth_ring.c +++ b/drivers/net/ring/rte_eth_ring.c @@ -1,7 +1,7 @@ /*- * BSD LICENSE * - * Copyright(c) 2010-2014 Intel Corporation. All rights reserved. + * Copyright(c) 2010-2015 Intel Corporation. All rights reserved. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -36,16 +36,16 @@ #include #include #include +#include #include #include #include +#include #define ETH_RING_NUMA_NODE_ACTION_ARG "nodeaction" #define ETH_RING_ACTION_CREATE "CREATE" #define ETH_RING_ACTION_ATTACH "ATTACH" -static const char *ring_ethdev_driver_name = "Ring PMD"; - static const char *valid_arguments[] = { ETH_RING_NUMA_NODE_ACTION_ARG, NULL @@ -260,19 +260,24 @@ rte_eth_from_rings(const char *name, struct rte_ring *const rx_queues[], const unsigned numa_node) { struct rte_eth_dev_data *data = NULL; - struct rte_pci_device *pci_dev = NULL; struct pmd_internals *internals = NULL; struct rte_eth_dev *eth_dev = NULL; - struct eth_driver *eth_drv = NULL; - struct rte_pci_id *id_table = NULL; unsigned i; /* do some parameter checking */ - if (rx_queues == NULL && nb_rx_queues > 0) + if (rx_queues == NULL && nb_rx_queues > 0) { + rte_errno = EINVAL; goto error; - if (tx_queues == NULL && nb_tx_queues > 0) + } + if (tx_queues == NULL && nb_tx_queues > 0) { + rte_errno = EINVAL; goto error; + } + if (nb_rx_queues > RTE_PMD_RING_MAX_RX_RINGS) { + rte_errno = EINVAL; + goto error; + } RTE_LOG(INFO, PMD, "Creating rings-backed ethdev on numa socket %u\n", numa_node); @@ -281,34 +286,42 @@ rte_eth_from_rings(const char *name, struct rte_ring *const rx_queues[], * and internal (private) data */ data = rte_zmalloc_socket(name, sizeof(*data), 0, numa_node); - if (data == NULL) + if (data == NULL) { + rte_errno = ENOMEM; goto error; + } - pci_dev = rte_zmalloc_socket(name, sizeof(*pci_dev), 0, numa_node); - if (pci_dev == NULL) + data->rx_queues = rte_zmalloc_socket(name, sizeof(void *) * nb_rx_queues, + 0, numa_node); + if (data->rx_queues == NULL) { + rte_errno = ENOMEM; goto error; + } - id_table = rte_zmalloc_socket(name, sizeof(*id_table), 0, numa_node); - if (id_table == NULL) + data->tx_queues = rte_zmalloc_socket(name, sizeof(void *) * nb_tx_queues, + 0, numa_node); + if (data->tx_queues == NULL) { + rte_errno = ENOMEM; goto error; + } internals = rte_zmalloc_socket(name, sizeof(*internals), 0, numa_node); - if (internals == NULL) + if (internals == NULL) { + rte_errno = ENOMEM; goto error; + } /* reserve an ethdev entry */ eth_dev = rte_eth_dev_allocate(name, RTE_ETH_DEV_VIRTUAL); - if (eth_dev == NULL) - goto error; - - eth_drv = rte_zmalloc_socket(name, sizeof(*eth_drv), 0, numa_node); - if (eth_drv == NULL) + if (eth_dev == NULL) { + rte_errno = ENOSPC; goto error; + } /* now put it all together * - store queue data in internals, - * - store numa_node info in pci_driver - * - point eth_dev_data to internals and pci_driver + * - store numa_node info in eth_dev_data + * - point eth_dev_data to internals * - and point eth_dev structure to new eth_dev_data structure */ /* NOTE: we'll replace the data element, of originally allocated eth_dev @@ -318,28 +331,29 @@ rte_eth_from_rings(const char *name, struct rte_ring *const rx_queues[], internals->nb_tx_queues = nb_tx_queues; for (i = 0; i < nb_rx_queues; i++) { internals->rx_ring_queues[i].rng = rx_queues[i]; + data->rx_queues[i] = &internals->rx_ring_queues[i]; } for (i = 0; i < nb_tx_queues; i++) { internals->tx_ring_queues[i].rng = tx_queues[i]; + data->tx_queues[i] = &internals->tx_ring_queues[i]; } - eth_drv->pci_drv.name = ring_ethdev_driver_name; - eth_drv->pci_drv.id_table = id_table; - - pci_dev->numa_node = numa_node; - pci_dev->driver = ð_drv->pci_drv; - 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; data->mac_addrs = &internals->address; eth_dev->data = data; - eth_dev->driver = eth_drv; + eth_dev->driver = NULL; eth_dev->dev_ops = &ops; - eth_dev->pci_dev = pci_dev; + eth_dev->data->dev_flags = RTE_ETH_DEV_DETACHABLE; + eth_dev->data->kdrv = RTE_KDRV_NONE; + eth_dev->data->drv_name = drivername; + eth_dev->data->numa_node = numa_node; + TAILQ_INIT(&(eth_dev->link_intr_cbs)); /* finally assign rx and tx ops */ @@ -349,13 +363,21 @@ rte_eth_from_rings(const char *name, struct rte_ring *const rx_queues[], return data->port_id; error: + rte_free(data->rx_queues); + rte_free(data->tx_queues); rte_free(data); - rte_free(pci_dev); rte_free(internals); return -1; } +int +rte_eth_from_ring(struct rte_ring *r) +{ + return rte_eth_from_rings(r->name, &r, 1, &r, 1, + r->memzone ? r->memzone->socket_id : SOCKET_ID_ANY); +} + enum dev_action{ DEV_CREATE, DEV_ATTACH @@ -390,62 +412,6 @@ eth_dev_ring_create(const char *name, const unsigned numa_node, return 0; } - -static int -eth_dev_ring_pair_create(const char *name, const unsigned numa_node, - enum dev_action action) -{ - /* rx and tx are so-called from point of view of first port. - * They are inverted from the point of view of second port - */ - struct rte_ring *rx[RTE_PMD_RING_MAX_RX_RINGS]; - struct rte_ring *tx[RTE_PMD_RING_MAX_TX_RINGS]; - unsigned i; - char rx_rng_name[RTE_RING_NAMESIZE]; - char tx_rng_name[RTE_RING_NAMESIZE]; - unsigned num_rings = RTE_MIN(RTE_PMD_RING_MAX_RX_RINGS, - RTE_PMD_RING_MAX_TX_RINGS); - - for (i = 0; i < num_rings; i++) { - snprintf(rx_rng_name, sizeof(rx_rng_name), "ETH_RX%u_%s", i, name); - rx[i] = (action == DEV_CREATE) ? - rte_ring_create(rx_rng_name, 1024, numa_node, - RING_F_SP_ENQ|RING_F_SC_DEQ) : - rte_ring_lookup(rx_rng_name); - if (rx[i] == NULL) - return -1; - snprintf(tx_rng_name, sizeof(tx_rng_name), "ETH_TX%u_%s", i, name); - tx[i] = (action == DEV_CREATE) ? - rte_ring_create(tx_rng_name, 1024, numa_node, - RING_F_SP_ENQ|RING_F_SC_DEQ): - rte_ring_lookup(tx_rng_name); - if (tx[i] == NULL) - return -1; - } - - if (rte_eth_from_rings(rx_rng_name, rx, num_rings, tx, num_rings, - numa_node) < 0 || - rte_eth_from_rings(tx_rng_name, tx, num_rings, rx, - num_rings, numa_node) < 0) - return -1; - - return 0; -} - -int -rte_eth_ring_pair_create(const char *name, const unsigned numa_node) -{ - RTE_LOG(WARNING, PMD, "rte_eth_ring_pair_create is deprecated\n"); - return eth_dev_ring_pair_create(name, numa_node, DEV_CREATE); -} - -int -rte_eth_ring_pair_attach(const char *name, const unsigned numa_node) -{ - RTE_LOG(WARNING, PMD, "rte_eth_ring_pair_attach is deprecated\n"); - return eth_dev_ring_pair_create(name, numa_node, DEV_ATTACH); -} - struct node_action_pair { char name[PATH_MAX]; unsigned node; @@ -532,20 +498,37 @@ rte_pmd_ring_devinit(const char *name, const char *params) RTE_LOG(INFO, PMD, "Initializing pmd_ring for %s\n", name); - if (params == NULL || params[0] == '\0') - eth_dev_ring_create(name, rte_socket_id(), DEV_CREATE); + if (params == NULL || params[0] == '\0') { + ret = eth_dev_ring_create(name, rte_socket_id(), DEV_CREATE); + if (ret == -1) { + RTE_LOG(INFO, PMD, + "Attach to pmd_ring for %s\n", name); + ret = eth_dev_ring_create(name, rte_socket_id(), + DEV_ATTACH); + } + } else { kvlist = rte_kvargs_parse(params, valid_arguments); if (!kvlist) { RTE_LOG(INFO, PMD, "Ignoring unsupported parameters when creating" " rings-backed ethernet device\n"); - eth_dev_ring_create(name, rte_socket_id(), DEV_CREATE); - return 0; + ret = eth_dev_ring_create(name, rte_socket_id(), + DEV_CREATE); + if (ret == -1) { + RTE_LOG(INFO, PMD, + "Attach to pmd_ring for %s\n", + name); + ret = eth_dev_ring_create(name, rte_socket_id(), + DEV_ATTACH); + } + return ret; } else { ret = rte_kvargs_count(kvlist, ETH_RING_NUMA_NODE_ACTION_ARG); - info = rte_zmalloc("struct node_action_list", sizeof(struct node_action_list) + - (sizeof(struct node_action_pair) * ret), 0); + info = rte_zmalloc("struct node_action_list", + sizeof(struct node_action_list) + + (sizeof(struct node_action_pair) * ret), + 0); if (!info) goto out_free; @@ -559,8 +542,18 @@ rte_pmd_ring_devinit(const char *name, const char *params) goto out_free; for (info->count = 0; info->count < info->total; info->count++) { - eth_dev_ring_create(name, info->list[info->count].node, - info->list[info->count].action); + ret = eth_dev_ring_create(name, + info->list[info->count].node, + info->list[info->count].action); + if ((ret == -1) && + (info->list[info->count].action == DEV_CREATE)) { + RTE_LOG(INFO, PMD, + "Attach to pmd_ring for %s\n", + name); + ret = eth_dev_ring_create(name, + info->list[info->count].node, + DEV_ATTACH); + } } } } @@ -571,10 +564,34 @@ out_free: return ret; } +static int +rte_pmd_ring_devuninit(const char *name) +{ + struct rte_eth_dev *eth_dev = NULL; + + RTE_LOG(INFO, PMD, "Un-Initializing pmd_ring for %s\n", name); + + if (name == NULL) + return -EINVAL; + + /* find an ethdev entry */ + eth_dev = rte_eth_dev_allocated(name); + if (eth_dev == NULL) + return -ENODEV; + + eth_dev_stop(eth_dev); + rte_free(eth_dev->data->dev_private); + rte_free(eth_dev->data); + + rte_eth_dev_release_port(eth_dev); + return 0; +} + static struct rte_driver pmd_ring_drv = { .name = "eth_ring", .type = PMD_VDEV, .init = rte_pmd_ring_devinit, + .uninit = rte_pmd_ring_devuninit, }; PMD_REGISTER_DRIVER(pmd_ring_drv);