X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Faf_xdp%2Frte_eth_af_xdp.c;h=893c9ed9fb3fa14ab4ed23912eee10614056e465;hb=6d13ea8e8e49ab957deae2bba5ecf4a4bfe747d1;hp=6a0096523171000db834848fcb9aa04fdf9c0346;hpb=10edf857fde473d34d794883024e6330f397714d;p=dpdk.git diff --git a/drivers/net/af_xdp/rte_eth_af_xdp.c b/drivers/net/af_xdp/rte_eth_af_xdp.c index 6a00965231..893c9ed9fb 100644 --- a/drivers/net/af_xdp/rte_eth_af_xdp.c +++ b/drivers/net/af_xdp/rte_eth_af_xdp.c @@ -109,7 +109,7 @@ struct pmd_internals { int if_index; char if_name[IFNAMSIZ]; uint16_t queue_idx; - struct ether_addr eth_addr; + struct rte_ether_addr eth_addr; struct xsk_umem_info *umem; struct rte_mempool *mb_pool_share; @@ -175,12 +175,12 @@ eth_af_xdp_rx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts) struct xsk_ring_prod *fq = &umem->fq; uint32_t idx_rx = 0; uint32_t free_thresh = fq->size >> 1; - struct rte_mbuf *mbufs[ETH_AF_XDP_TX_BATCH_SIZE]; + struct rte_mbuf *mbufs[ETH_AF_XDP_RX_BATCH_SIZE]; unsigned long dropped = 0; unsigned long rx_bytes = 0; int rcvd, i; - nb_pkts = RTE_MIN(nb_pkts, ETH_AF_XDP_TX_BATCH_SIZE); + nb_pkts = RTE_MIN(nb_pkts, ETH_AF_XDP_RX_BATCH_SIZE); if (unlikely(rte_pktmbuf_alloc_bulk(rxq->mb_pool, mbufs, nb_pkts) != 0)) return 0; @@ -426,6 +426,19 @@ remove_xdp_program(struct pmd_internals *internals) XDP_FLAGS_UPDATE_IF_NOEXIST); } +static void +xdp_umem_destroy(struct xsk_umem_info *umem) +{ + rte_memzone_free(umem->mz); + umem->mz = NULL; + + rte_ring_free(umem->buf_ring); + umem->buf_ring = NULL; + + rte_free(umem); + umem = NULL; +} + static void eth_dev_close(struct rte_eth_dev *dev) { @@ -444,6 +457,15 @@ eth_dev_close(struct rte_eth_dev *dev) } (void)xsk_umem__delete(internals->umem->umem); + + /* + * MAC is not allocated dynamically, setting it to NULL would prevent + * from releasing it in rte_eth_dev_release_port. + */ + dev->data->mac_addrs = NULL; + + xdp_umem_destroy(internals->umem); + remove_xdp_program(internals); } @@ -459,21 +481,8 @@ eth_link_update(struct rte_eth_dev *dev __rte_unused, return 0; } -static void -xdp_umem_destroy(struct xsk_umem_info *umem) -{ - rte_memzone_free(umem->mz); - umem->mz = NULL; - - rte_ring_free(umem->buf_ring); - umem->buf_ring = NULL; - - rte_free(umem); - umem = NULL; -} - static struct -xsk_umem_info *xdp_umem_configure(void) +xsk_umem_info *xdp_umem_configure(struct pmd_internals *internals) { struct xsk_umem_info *umem; const struct rte_memzone *mz; @@ -482,6 +491,8 @@ xsk_umem_info *xdp_umem_configure(void) .comp_size = ETH_AF_XDP_DFLT_NUM_DESCS, .frame_size = ETH_AF_XDP_FRAME_SIZE, .frame_headroom = ETH_AF_XDP_DATA_HEADROOM }; + char ring_name[RTE_RING_NAMESIZE]; + char mz_name[RTE_MEMZONE_NAMESIZE]; int ret; uint64_t i; @@ -491,7 +502,9 @@ xsk_umem_info *xdp_umem_configure(void) return NULL; } - umem->buf_ring = rte_ring_create("af_xdp_ring", + snprintf(ring_name, sizeof(ring_name), "af_xdp_ring_%s_%u", + internals->if_name, internals->queue_idx); + umem->buf_ring = rte_ring_create(ring_name, ETH_AF_XDP_NUM_BUFFERS, rte_socket_id(), 0x0); @@ -505,7 +518,9 @@ xsk_umem_info *xdp_umem_configure(void) (void *)(i * ETH_AF_XDP_FRAME_SIZE + ETH_AF_XDP_DATA_HEADROOM)); - mz = rte_memzone_reserve_aligned("af_xdp uemem", + snprintf(mz_name, sizeof(mz_name), "af_xdp_umem_%s_%u", + internals->if_name, internals->queue_idx); + mz = rte_memzone_reserve_aligned(mz_name, ETH_AF_XDP_NUM_BUFFERS * ETH_AF_XDP_FRAME_SIZE, rte_socket_id(), RTE_MEMZONE_IOVA_CONTIG, getpagesize()); @@ -541,7 +556,7 @@ xsk_configure(struct pmd_internals *internals, struct pkt_rx_queue *rxq, int ret = 0; int reserve_size; - rxq->umem = xdp_umem_configure(); + rxq->umem = xdp_umem_configure(internals); if (rxq->umem == NULL) return -ENOMEM; @@ -783,7 +798,7 @@ free_kvlist: static int get_iface_info(const char *if_name, - struct ether_addr *eth_addr, + struct rte_ether_addr *eth_addr, int *if_index) { struct ifreq ifr; @@ -850,6 +865,8 @@ init_internals(struct rte_vdev_device *dev, eth_dev->dev_ops = &ops; eth_dev->rx_pkt_burst = eth_af_xdp_rx; eth_dev->tx_pkt_burst = eth_af_xdp_tx; + /* Let rte_eth_dev_close() release the port resources. */ + eth_dev->data->dev_flags |= RTE_ETH_DEV_CLOSE_REMOVE; return eth_dev; @@ -917,7 +934,6 @@ static int rte_pmd_af_xdp_remove(struct rte_vdev_device *dev) { struct rte_eth_dev *eth_dev = NULL; - struct pmd_internals *internals; AF_XDP_LOG(INFO, "Removing AF_XDP ethdev on numa socket %u\n", rte_socket_id()); @@ -930,12 +946,7 @@ rte_pmd_af_xdp_remove(struct rte_vdev_device *dev) if (eth_dev == NULL) return -1; - internals = eth_dev->data->dev_private; - - rte_ring_free(internals->umem->buf_ring); - rte_memzone_free(internals->umem->mz); - rte_free(internals->umem); - + eth_dev_close(eth_dev); rte_eth_dev_release_port(eth_dev);