All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ferruh Yigit <ferruh.yigit@intel.com>
To: Chenxu Di <chenxux.di@intel.com>, dev@dpdk.org
Cc: Yang Qiming <qiming.yang@intel.com>
Subject: Re: [dpdk-dev] [PATCH v9 3/4] net/ixgbe: cleanup Tx buffers
Date: Thu, 16 Jan 2020 15:23:58 +0000	[thread overview]
Message-ID: <0c0fb231-0119-0fa1-53cc-64088b9f58c1@intel.com> (raw)
In-Reply-To: <23907f55-d456-69ae-9ee8-02751fda8a11@intel.com>

On 1/16/2020 2:47 PM, Ferruh Yigit wrote:
> On 1/13/2020 9:57 AM, Chenxu Di wrote:
>> Add support to the ixgbe driver for the API rte_eth_tx_done_cleanup
>> to force free consumed buffers on Tx ring.
>>
>> Signed-off-by: Chenxu Di <chenxux.di@intel.com>
>> ---
>>  drivers/net/ixgbe/ixgbe_ethdev.c |   2 +
>>  drivers/net/ixgbe/ixgbe_rxtx.c   | 109 +++++++++++++++++++++++++++++++
>>  drivers/net/ixgbe/ixgbe_rxtx.h   |   2 +-
>>  3 files changed, 112 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
>> index 2c6fd0f13..75bdd391a 100644
>> --- a/drivers/net/ixgbe/ixgbe_ethdev.c
>> +++ b/drivers/net/ixgbe/ixgbe_ethdev.c
>> @@ -601,6 +601,7 @@ static const struct eth_dev_ops ixgbe_eth_dev_ops = {
>>  	.udp_tunnel_port_add  = ixgbe_dev_udp_tunnel_port_add,
>>  	.udp_tunnel_port_del  = ixgbe_dev_udp_tunnel_port_del,
>>  	.tm_ops_get           = ixgbe_tm_ops_get,
>> +	.tx_done_cleanup      = ixgbe_dev_tx_done_cleanup,
>>  };
>>  
>>  /*
>> @@ -649,6 +650,7 @@ static const struct eth_dev_ops ixgbevf_eth_dev_ops = {
>>  	.reta_query           = ixgbe_dev_rss_reta_query,
>>  	.rss_hash_update      = ixgbe_dev_rss_hash_update,
>>  	.rss_hash_conf_get    = ixgbe_dev_rss_hash_conf_get,
>> +	.tx_done_cleanup      = ixgbe_dev_tx_done_cleanup,
>>  };
>>  
>>  /* store statistics names and its offset in stats structure */
>> diff --git a/drivers/net/ixgbe/ixgbe_rxtx.c b/drivers/net/ixgbe/ixgbe_rxtx.c
>> index fa572d184..a2e85ed5b 100644
>> --- a/drivers/net/ixgbe/ixgbe_rxtx.c
>> +++ b/drivers/net/ixgbe/ixgbe_rxtx.c
>> @@ -2306,6 +2306,115 @@ ixgbe_tx_queue_release_mbufs(struct ixgbe_tx_queue *txq)
>>  	}
>>  }
>>  
>> +static int
>> +ixgbe_tx_done_cleanup_full(struct ixgbe_tx_queue *txq, uint32_t free_cnt)
>> +{
>> +	struct ixgbe_tx_entry *swr_ring = txq->sw_ring;
>> +	uint16_t i, tx_last, tx_id;
>> +	uint16_t nb_tx_free_last;
>> +	uint16_t nb_tx_to_clean;
>> +	uint32_t pkt_cnt;
>> +
>> +	/* Start free mbuf from the next of tx_tail */
>> +	tx_last = txq->tx_tail;
>> +	tx_id  = swr_ring[tx_last].next_id;
>> +
>> +	if (txq->nb_tx_free == 0 && ixgbe_xmit_cleanup(txq))
>> +		return 0;
>> +
>> +	nb_tx_to_clean = txq->nb_tx_free;
>> +	nb_tx_free_last = txq->nb_tx_free;
>> +	if (!free_cnt)
>> +		free_cnt = txq->nb_tx_desc;
>> +
>> +	/* Loop through swr_ring to count the amount of
>> +	 * freeable mubfs and packets.
>> +	 */
>> +	for (pkt_cnt = 0; pkt_cnt < free_cnt; ) {
>> +		for (i = 0; i < nb_tx_to_clean &&
>> +			pkt_cnt < free_cnt &&
>> +			tx_id != tx_last; i++) {
>> +			if (swr_ring[tx_id].mbuf != NULL) {
>> +				rte_pktmbuf_free_seg(swr_ring[tx_id].mbuf);
>> +				swr_ring[tx_id].mbuf = NULL;
>> +
>> +				/*
>> +				 * last segment in the packet,
>> +				 * increment packet count
>> +				 */
>> +				pkt_cnt += (swr_ring[tx_id].last_id == tx_id);
>> +			}
>> +
>> +			tx_id = swr_ring[tx_id].next_id;
>> +		}
>> +
>> +		if (txq->tx_rs_thresh > txq->nb_tx_desc -
>> +			txq->nb_tx_free || tx_id == tx_last)
>> +			break;
>> +
>> +		if (pkt_cnt < free_cnt) {
>> +			if (ixgbe_xmit_cleanup(txq))
>> +				break;
>> +
>> +			nb_tx_to_clean = txq->nb_tx_free - nb_tx_free_last;
>> +			nb_tx_free_last = txq->nb_tx_free;
>> +		}
>> +	}
>> +
>> +	return (int)pkt_cnt;
>> +}
>> +
>> +static int
>> +ixgbe_tx_done_cleanup_simple(struct ixgbe_tx_queue *txq,
>> +			uint32_t free_cnt)
>> +{
>> +	int i, n, cnt;
>> +
>> +	if (free_cnt == 0 || free_cnt > txq->nb_tx_desc)
>> +		free_cnt = txq->nb_tx_desc;
>> +
>> +	cnt = free_cnt - free_cnt % txq->tx_rs_thresh;
>> +
>> +	for (i = 0; i < cnt; i += n) {
>> +		if (txq->nb_tx_desc - txq->nb_tx_free < txq->tx_rs_thresh)
>> +			break;
>> +
>> +		n = ixgbe_tx_free_bufs(txq);
>> +
>> +		if (n == 0)
>> +			break;
>> +	}
>> +
>> +	return i;
>> +}
>> +
>> +static int
>> +ixgbe_tx_done_cleanup_vec(struct ixgbe_tx_queue *txq __rte_unused,
>> +			uint32_t free_cnt __rte_unused)
>> +{
>> +	return -ENOTSUP;
>> +}
>> +
>> +int
>> +ixgbe_dev_tx_done_cleanup(void *tx_queue, uint32_t free_cnt)
>> +{
>> +	struct ixgbe_tx_queue *txq = (struct ixgbe_tx_queue *)tx_queue;
>> +	if (txq->offloads == 0 &&
>> +#ifdef RTE_LIBRTE_SECURITY
>> +			!(txq->using_ipsec) &&
>> +#endif
>> +			txq->tx_rs_thresh >= RTE_PMD_IXGBE_TX_MAX_BURST)
>> +#ifdef RTE_IXGBE_INC_VECTOR
>> +		if (txq->tx_rs_thresh <= RTE_IXGBE_TX_MAX_FREE_BUF_SZ &&
>> +				(rte_eal_process_type() != RTE_PROC_PRIMARY ||
>> +					txq->sw_ring_v != NULL))
>> +			return ixgbe_tx_done_cleanup_vec(txq, free_cnt);
>> +#endif
>> +		return ixgbe_tx_done_cleanup_simple(txq, free_cnt);
>> +
>> +	return ixgbe_tx_done_cleanup_full(txq, free_cnt);
>> +}
>> +
> 
> Missing curly parantheses in the 'if' blocks are causing confusion on which
> return patch to take.
> 
> the above code is like this:
> if (txq->offloads == 0 && ...)
>   if (txq->tx_rs_thresh <= RTE_IXGBE_TX_MAX_FREE_BUF_SZ && ...)
>     return ixgbe_tx_done_cleanup_vec(txq, free_cnt);
>   return ixgbe_tx_done_cleanup_simple(txq, free_cnt); <----- [*]
> return ixgbe_tx_done_cleanup_full(txq, free_cnt);
> 
> It is not clear, and looks like wrong based on indentation, when to get the [*]
> path above.
> 
> I will add curly parantheses while merging.
> 
> Btw, why we need "#ifdef RTE_IXGBE_INC_VECTOR" here, can't we remove it?
> 

Since 'ixgbe_tx_done_cleanup_vec()' already implemented in this file, instead of
vector specific files, I am removing the ifdef.

So making changes [1] and function becomes [2]. Please validate it in next-net.

[1]
 diff --git a/drivers/net/ixgbe/ixgbe_rxtx.c b/drivers/net/ixgbe/ixgbe_rxtx.c
 index a2e85ed5b..f41dc13d5 100644
 --- a/drivers/net/ixgbe/ixgbe_rxtx.c
 +++ b/drivers/net/ixgbe/ixgbe_rxtx.c
 @@ -2403,14 +2403,15 @@ ixgbe_dev_tx_done_cleanup(void *tx_queue, uint32_t
free_cnt)
  #ifdef RTE_LIBRTE_SECURITY
                         !(txq->using_ipsec) &&
  #endif
 -                       txq->tx_rs_thresh >= RTE_PMD_IXGBE_TX_MAX_BURST)
 -#ifdef RTE_IXGBE_INC_VECTOR
 +                       txq->tx_rs_thresh >= RTE_PMD_IXGBE_TX_MAX_BURST) {
                 if (txq->tx_rs_thresh <= RTE_IXGBE_TX_MAX_FREE_BUF_SZ &&
                                 (rte_eal_process_type() != RTE_PROC_PRIMARY ||
 -                                       txq->sw_ring_v != NULL))
 +                                       txq->sw_ring_v != NULL)) {
                         return ixgbe_tx_done_cleanup_vec(txq, free_cnt);
 -#endif
 -               return ixgbe_tx_done_cleanup_simple(txq, free_cnt);
 +               } else {
 +                       return ixgbe_tx_done_cleanup_simple(txq, free_cnt);
 +               }
 +       }

         return ixgbe_tx_done_cleanup_full(txq, free_cnt);
  }


[2]
 int
 ixgbe_dev_tx_done_cleanup(void *tx_queue, uint32_t free_cnt)
 {
         struct ixgbe_tx_queue *txq = (struct ixgbe_tx_queue *)tx_queue;
         if (txq->offloads == 0 &&
 #ifdef RTE_LIBRTE_SECURITY
                         !(txq->using_ipsec) &&
 #endif
                         txq->tx_rs_thresh >= RTE_PMD_IXGBE_TX_MAX_BURST) {
                 if (txq->tx_rs_thresh <= RTE_IXGBE_TX_MAX_FREE_BUF_SZ &&
                                 (rte_eal_process_type() != RTE_PROC_PRIMARY ||
                                         txq->sw_ring_v != NULL)) {
                         return ixgbe_tx_done_cleanup_vec(txq, free_cnt);
                 } else {
                         return ixgbe_tx_done_cleanup_simple(txq, free_cnt);
                 }
         }

         return ixgbe_tx_done_cleanup_full(txq, free_cnt);
 }

  reply	other threads:[~2020-01-16 15:24 UTC|newest]

Thread overview: 74+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-12-03  5:51 [dpdk-dev] [PATCH 0/4] drivers/net: cleanup Tx buffers Chenxu Di
2019-12-03  5:51 ` [dpdk-dev] [PATCH 1/4] net/fm10k: " Chenxu Di
2019-12-03  5:51 ` [dpdk-dev] [PATCH 2/4] net/i40e: " Chenxu Di
2019-12-03  5:51 ` [dpdk-dev] [PATCH 3/4] net/ice: " Chenxu Di
2019-12-03  5:51 ` [dpdk-dev] [PATCH 4/4] net/ixgbe: " Chenxu Di
2019-12-20  3:02 ` [dpdk-dev] [PATCH v2 0/5] drivers/net: " Chenxu Di
2019-12-20  3:02   ` [dpdk-dev] [PATCH v2 1/5] net/fm10k: " Chenxu Di
2019-12-20  3:02   ` [dpdk-dev] [PATCH v2 2/5] net/i40e: " Chenxu Di
2019-12-20  3:02   ` [dpdk-dev] [PATCH v2 3/5] net/ice: " Chenxu Di
2019-12-20  3:02   ` [dpdk-dev] [PATCH v2 4/5] net/ixgbe: " Chenxu Di
2019-12-20  3:02   ` [dpdk-dev] [PATCH v2 5/5] net/e1000: " Chenxu Di
2019-12-20  3:15 ` [dpdk-dev] [PATCH v3 0/5] drivers/net: " Chenxu Di
2019-12-20  3:15   ` [dpdk-dev] [PATCH v3 1/5] net/fm10k: " Chenxu Di
2019-12-20  3:15   ` [dpdk-dev] [PATCH v3 2/5] net/i40e: " Chenxu Di
2019-12-20  3:15   ` [dpdk-dev] [PATCH v3 3/5] net/ice: " Chenxu Di
2019-12-20  3:15   ` [dpdk-dev] [PATCH v3 4/5] net/ixgbe: " Chenxu Di
2019-12-20  3:15   ` [dpdk-dev] [PATCH v3 5/5] net/e1000: " Chenxu Di
2019-12-24  2:39 ` [dpdk-dev] [PATCH v4 0/5] drivers/net: " Chenxu Di
2019-12-24  2:39   ` [dpdk-dev] [PATCH v4 1/5] net/fm10k: " Chenxu Di
2019-12-24  2:39   ` [dpdk-dev] [PATCH v4 2/5] net/i40e: " Chenxu Di
2019-12-26  8:24     ` Xing, Beilei
2019-12-24  2:39   ` [dpdk-dev] [PATCH v4 3/5] net/ice: " Chenxu Di
2019-12-24  2:39   ` [dpdk-dev] [PATCH v4 4/5] net/ixgbe: " Chenxu Di
2019-12-24  2:39   ` [dpdk-dev] [PATCH v4 5/5] net/e1000: " Chenxu Di
2019-12-30  9:38 ` [dpdk-dev] [PATCH v6 0/4] drivers/net: " Chenxu Di
2019-12-30  9:38   ` [dpdk-dev] [PATCH v6 1/4] net/i40e: " Chenxu Di
2019-12-30 13:01     ` Ananyev, Konstantin
2019-12-30  9:38   ` [dpdk-dev] [PATCH v6 2/4] net/ice: " Chenxu Di
2019-12-30  9:38   ` [dpdk-dev] [PATCH v6 3/4] net/ixgbe: " Chenxu Di
2019-12-30 12:53     ` Ananyev, Konstantin
2020-01-03  9:01       ` Di, ChenxuX
2020-01-05 23:36         ` Ananyev, Konstantin
2020-01-06  9:03           ` Di, ChenxuX
2020-01-06 13:26             ` Ananyev, Konstantin
2020-01-07 10:46               ` Di, ChenxuX
2020-01-07 14:09                 ` Ananyev, Konstantin
2020-01-08 10:15                   ` Di, ChenxuX
2020-01-08 15:12                     ` Ananyev, Konstantin
2019-12-30  9:38   ` [dpdk-dev] [PATCH v6 4/4] net/e1000: " Chenxu Di
2020-01-09 10:38 ` [dpdk-dev] [PATCH v7 0/4] drivers/net: " Chenxu Di
2020-01-09 10:38   ` [dpdk-dev] [PATCH v7 1/4] net/i40e: " Chenxu Di
2020-01-09 10:38   ` [dpdk-dev] [PATCH v7 2/4] net/ice: " Chenxu Di
2020-01-09 10:38   ` [dpdk-dev] [PATCH v7 3/4] net/ixgbe: " Chenxu Di
2020-01-09 14:01     ` Ananyev, Konstantin
2020-01-10 10:08       ` Di, ChenxuX
2020-01-10 12:46         ` Ananyev, Konstantin
2020-01-09 10:38   ` [dpdk-dev] [PATCH v7 4/4] net/e1000: " Chenxu Di
2020-01-10  9:58 ` [dpdk-dev] [PATCH v8 0/4] drivers/net: " Chenxu Di
2020-01-10  9:58   ` [dpdk-dev] [PATCH v8 1/4] net/i40e: " Chenxu Di
2020-01-10  9:58   ` [dpdk-dev] [PATCH v8 2/4] net/ice: " Chenxu Di
2020-01-10  9:58   ` [dpdk-dev] [PATCH v8 3/4] net/ixgbe: " Chenxu Di
2020-01-10 13:49     ` Ananyev, Konstantin
2020-01-10  9:59   ` [dpdk-dev] [PATCH v8 4/4] net/e1000: " Chenxu Di
2020-01-13  9:57 ` [dpdk-dev] [PATCH v9 0/4] drivers/net: " Chenxu Di
2020-01-13  9:57   ` [dpdk-dev] [PATCH v9 1/4] net/i40e: " Chenxu Di
2020-01-13 11:08     ` Ananyev, Konstantin
2020-01-13  9:57   ` [dpdk-dev] [PATCH v9 2/4] net/ice: " Chenxu Di
2020-01-14  1:55     ` Yang, Qiming
2020-01-14 12:40     ` Ferruh Yigit
2020-01-15 14:34       ` Ferruh Yigit
2020-01-16  1:40         ` Di, ChenxuX
2020-01-16  7:09           ` [dpdk-dev] [PATCH] net/ice: cleanup for vec path check Xiaolong Ye
2020-01-16 10:19             ` Ferruh Yigit
2020-01-17  2:21             ` Yang, Qiming
2020-01-16  8:43     ` [dpdk-dev] [PATCH v9 2/4] net/ice: cleanup Tx buffers Ferruh Yigit
2020-01-13  9:57   ` [dpdk-dev] [PATCH v9 3/4] net/ixgbe: " Chenxu Di
2020-01-13 11:07     ` Ananyev, Konstantin
2020-01-16  8:44     ` Ferruh Yigit
2020-01-16 14:47     ` Ferruh Yigit
2020-01-16 15:23       ` Ferruh Yigit [this message]
2020-01-13  9:57   ` [dpdk-dev] [PATCH v9 4/4] net/e1000: " Chenxu Di
2020-01-13 11:08     ` Ananyev, Konstantin
2020-01-14  2:49     ` Ye Xiaolong
2020-01-14  2:22 ` [dpdk-dev] [PATCH 0/4] drivers/net: " Ye Xiaolong

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=0c0fb231-0119-0fa1-53cc-64088b9f58c1@intel.com \
    --to=ferruh.yigit@intel.com \
    --cc=chenxux.di@intel.com \
    --cc=dev@dpdk.org \
    --cc=qiming.yang@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.