X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Faf_packet%2Frte_eth_af_packet.c;h=25876224f898f03a0e5609c8edd8e80fa6bc0de7;hb=42c40f8902f7d9cf5a51c1ec0e1bfff515b50561;hp=db5de8e45e90e0859494d07ca9e126f2db9a117f;hpb=c6d1a552a8798df02bf85627c5d47a28ccdc62f8;p=dpdk.git diff --git a/drivers/net/af_packet/rte_eth_af_packet.c b/drivers/net/af_packet/rte_eth_af_packet.c index db5de8e45e..25876224f8 100644 --- a/drivers/net/af_packet/rte_eth_af_packet.c +++ b/drivers/net/af_packet/rte_eth_af_packet.c @@ -376,9 +376,34 @@ eth_stats_reset(struct rte_eth_dev *dev) return 0; } -static void -eth_dev_close(struct rte_eth_dev *dev __rte_unused) +static int +eth_dev_close(struct rte_eth_dev *dev) { + struct pmd_internals *internals; + struct tpacket_req *req; + unsigned int q; + + if (rte_eal_process_type() != RTE_PROC_PRIMARY) + return 0; + + PMD_LOG(INFO, "Closing AF_PACKET ethdev on NUMA socket %u", + rte_socket_id()); + + internals = dev->data->dev_private; + req = &internals->req; + for (q = 0; q < internals->nb_queues; q++) { + munmap(internals->rx_queue[q].map, + 2 * req->tp_block_size * req->tp_block_nr); + rte_free(internals->rx_queue[q].rd); + rte_free(internals->tx_queue[q].rd); + } + free(internals->if_name); + rte_free(internals->rx_queue); + rte_free(internals->tx_queue); + + /* mac_addrs must not be freed alone because part of dev_private */ + dev->data->mac_addrs = NULL; + return 0; } static void @@ -637,9 +662,7 @@ rte_pmd_init_internals(struct rte_vdev_device *dev, sizeof(struct pkt_tx_queue), 0, numa_node); if (!(*internals)->rx_queue || !(*internals)->tx_queue) { - rte_free((*internals)->rx_queue); - rte_free((*internals)->tx_queue); - return -1; + goto free_internals; } for (q = 0; q < nb_queues; q++) { @@ -664,20 +687,20 @@ rte_pmd_init_internals(struct rte_vdev_device *dev, PMD_LOG(ERR, "%s: I/F name too long (%s)", name, pair->value); - return -1; + goto free_internals; } if (ioctl(sockfd, SIOCGIFINDEX, &ifr) == -1) { PMD_LOG_ERRNO(ERR, "%s: ioctl failed (SIOCGIFINDEX)", name); - return -1; + goto free_internals; } (*internals)->if_name = strdup(pair->value); if ((*internals)->if_name == NULL) - return -1; + goto free_internals; (*internals)->if_index = ifr.ifr_ifindex; if (ioctl(sockfd, SIOCGIFHWADDR, &ifr) == -1) { PMD_LOG_ERRNO(ERR, "%s: ioctl failed (SIOCGIFHWADDR)", name); - return -1; + goto free_internals; } memcpy(&(*internals)->eth_addr, ifr.ifr_hwaddr.sa_data, ETH_ALEN); @@ -701,7 +724,7 @@ rte_pmd_init_internals(struct rte_vdev_device *dev, PMD_LOG_ERRNO(ERR, "%s: could not open AF_PACKET socket", name); - return -1; + goto error; } tpver = TPACKET_V2; @@ -845,8 +868,9 @@ error: if (qsockfd != -1) close(qsockfd); for (q = 0; q < nb_queues; q++) { - munmap((*internals)->rx_queue[q].map, - 2 * req->tp_block_size * req->tp_block_nr); + if ((*internals)->rx_queue[q].map != MAP_FAILED) + munmap((*internals)->rx_queue[q].map, + 2 * req->tp_block_size * req->tp_block_nr); rte_free((*internals)->rx_queue[q].rd); rte_free((*internals)->tx_queue[q].rd); @@ -854,6 +878,9 @@ error: ((*internals)->rx_queue[q].sockfd != qsockfd)) close((*internals)->rx_queue[q].sockfd); } +free_internals: + rte_free((*internals)->rx_queue); + rte_free((*internals)->tx_queue); free((*internals)->if_name); rte_free(*internals); return -1; @@ -1030,13 +1057,7 @@ exit: static int rte_pmd_af_packet_remove(struct rte_vdev_device *dev) { - struct rte_eth_dev *eth_dev = NULL; - struct pmd_internals *internals; - struct tpacket_req *req; - unsigned q; - - PMD_LOG(INFO, "Closing AF_PACKET ethdev on numa socket %u", - rte_socket_id()); + struct rte_eth_dev *eth_dev; if (dev == NULL) return -1; @@ -1044,26 +1065,9 @@ rte_pmd_af_packet_remove(struct rte_vdev_device *dev) /* find the ethdev entry */ eth_dev = rte_eth_dev_allocated(rte_vdev_device_name(dev)); if (eth_dev == NULL) - return -1; - - /* mac_addrs must not be freed alone because part of dev_private */ - eth_dev->data->mac_addrs = NULL; - - if (rte_eal_process_type() != RTE_PROC_PRIMARY) - return rte_eth_dev_release_port(eth_dev); - - internals = eth_dev->data->dev_private; - req = &internals->req; - for (q = 0; q < internals->nb_queues; q++) { - munmap(internals->rx_queue[q].map, - 2 * req->tp_block_size * req->tp_block_nr); - rte_free(internals->rx_queue[q].rd); - rte_free(internals->tx_queue[q].rd); - } - free(internals->if_name); - rte_free(internals->rx_queue); - rte_free(internals->tx_queue); + return 0; /* port already released */ + eth_dev_close(eth_dev); rte_eth_dev_release_port(eth_dev); return 0;