X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fmemif%2Frte_eth_memif.c;h=980150293e86fd34d189b39f950dc5c4429d28e5;hb=7483341ae5533c5d5fa080a5d229e6f2daf03ea5;hp=de6becd45e3eba47ae52267acdd5562671e66584;hpb=663191e2d64d8f0229ec553f63a78470bdc81af1;p=dpdk.git diff --git a/drivers/net/memif/rte_eth_memif.c b/drivers/net/memif/rte_eth_memif.c index de6becd45e..980150293e 100644 --- a/drivers/net/memif/rte_eth_memif.c +++ b/drivers/net/memif/rte_eth_memif.c @@ -199,6 +199,7 @@ memif_dev_info(struct rte_eth_dev *dev __rte_unused, struct rte_eth_dev_info *de dev_info->max_rx_queues = ETH_MEMIF_MAX_NUM_Q_PAIRS; dev_info->max_tx_queues = ETH_MEMIF_MAX_NUM_Q_PAIRS; dev_info->min_rx_bufsize = 0; + dev_info->tx_offload_capa = DEV_TX_OFFLOAD_MULTI_SEGS; return 0; } @@ -567,7 +568,7 @@ eth_memif_tx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts) rte_eth_devices[mq->in_port].process_private; memif_ring_t *ring = memif_get_ring_from_queue(proc_private, mq); uint16_t slot, saved_slot, n_free, ring_size, mask, n_tx_pkts = 0; - uint16_t src_len, src_off, dst_len, dst_off, cp_len; + uint16_t src_len, src_off, dst_len, dst_off, cp_len, nb_segs; memif_ring_type_t type = mq->type; memif_desc_t *d0; struct rte_mbuf *mbuf; @@ -615,6 +616,7 @@ eth_memif_tx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts) while (n_tx_pkts < nb_pkts && n_free) { mbuf_head = *bufs++; + nb_segs = mbuf_head->nb_segs; mbuf = mbuf_head; saved_slot = slot; @@ -659,7 +661,7 @@ next_in_chain: d0->length = dst_off; } - if (rte_pktmbuf_is_contiguous(mbuf) == 0) { + if (--nb_segs > 0) { mbuf = mbuf->next; goto next_in_chain; } @@ -696,6 +698,7 @@ memif_tx_one_zc(struct pmd_process_private *proc_private, struct memif_queue *mq uint16_t slot, uint16_t n_free) { memif_desc_t *d0; + uint16_t nb_segs = mbuf->nb_segs; int used_slots = 1; next_in_chain: @@ -716,7 +719,7 @@ next_in_chain: d0->flags = 0; /* check if buffer is chained */ - if (rte_pktmbuf_is_contiguous(mbuf) == 0) { + if (--nb_segs > 0) { if (n_free < 2) return 0; /* mark buffer as chained */ @@ -1255,9 +1258,9 @@ memif_dev_close(struct rte_eth_dev *dev) memif_disconnect(dev); for (i = 0; i < dev->data->nb_rx_queues; i++) - (*dev->dev_ops->rx_queue_release)(dev->data->rx_queues[i]); + (*dev->dev_ops->rx_queue_release)(dev, i); for (i = 0; i < dev->data->nb_tx_queues; i++) - (*dev->dev_ops->tx_queue_release)(dev->data->tx_queues[i]); + (*dev->dev_ops->tx_queue_release)(dev, i); memif_socket_remove_device(dev); } else { @@ -1349,9 +1352,20 @@ memif_rx_queue_setup(struct rte_eth_dev *dev, } static void -memif_queue_release(void *queue) +memif_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) +{ + struct memif_queue *mq = dev->data->rx_queues[qid]; + + if (!mq) + return; + + rte_free(mq); +} + +static void +memif_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) { - struct memif_queue *mq = (struct memif_queue *)queue; + struct memif_queue *mq = dev->data->tx_queues[qid]; if (!mq) return; @@ -1468,8 +1482,8 @@ static const struct eth_dev_ops ops = { .dev_configure = memif_dev_configure, .tx_queue_setup = memif_tx_queue_setup, .rx_queue_setup = memif_rx_queue_setup, - .rx_queue_release = memif_queue_release, - .tx_queue_release = memif_queue_release, + .rx_queue_release = memif_rx_queue_release, + .tx_queue_release = memif_tx_queue_release, .rx_queue_intr_enable = memif_rx_queue_intr_enable, .rx_queue_intr_disable = memif_rx_queue_intr_disable, .link_update = memif_link_update,