[v2,07/13] net/txgbe: add Tx descriptor error statistics

Message ID 20241028023147.60157-8-jiawenwu@trustnetic.com (mailing list archive)
State Changes Requested, archived
Delegated to: Ferruh Yigit
Headers
Series Wangxun fixes |

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Jiawen Wu Oct. 28, 2024, 2:31 a.m. UTC
Count the number of packets not sent due to Tx descriptor error.

Signed-off-by: Jiawen Wu <jiawenwu@trustnetic.com>
---
 drivers/net/txgbe/txgbe_ethdev.c | 6 ++++++
 drivers/net/txgbe/txgbe_rxtx.c   | 3 +++
 drivers/net/txgbe/txgbe_rxtx.h   | 1 +
 3 files changed, 10 insertions(+)
  

Comments

Ferruh Yigit Nov. 1, 2024, 1:33 a.m. UTC | #1
On 10/28/2024 2:31 AM, Jiawen Wu wrote:
> Count the number of packets not sent due to Tx descriptor error.
> 
> Signed-off-by: Jiawen Wu <jiawenwu@trustnetic.com>
> ---
>  drivers/net/txgbe/txgbe_ethdev.c | 6 ++++++
>  drivers/net/txgbe/txgbe_rxtx.c   | 3 +++
>  drivers/net/txgbe/txgbe_rxtx.h   | 1 +
>  3 files changed, 10 insertions(+)
> 
> diff --git a/drivers/net/txgbe/txgbe_ethdev.c b/drivers/net/txgbe/txgbe_ethdev.c
> index bafa9cf829..0c76e986f4 100644
> --- a/drivers/net/txgbe/txgbe_ethdev.c
> +++ b/drivers/net/txgbe/txgbe_ethdev.c
> @@ -2344,6 +2344,7 @@ txgbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
>  	struct txgbe_hw_stats *hw_stats = TXGBE_DEV_STATS(dev);
>  	struct txgbe_stat_mappings *stat_mappings =
>  			TXGBE_DEV_STAT_MAPPINGS(dev);
> +	struct txgbe_tx_queue *txq;
>  	uint32_t i, j;
>  
>  	txgbe_read_stats_registers(hw, hw_stats);
> @@ -2398,6 +2399,11 @@ txgbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
>  
>  	/* Tx Errors */
>  	stats->oerrors  = 0;
> +	for (i = 0; i < dev->data->nb_tx_queues; i++) {
> +		txq = dev->data->tx_queues[i];
> +		stats->oerrors += txq->desc_error;
> +	}
> +

stats_get is implemented, but stats_reset also needs to be implemented
for this stat.

>  	return 0;
>  }
>  
> diff --git a/drivers/net/txgbe/txgbe_rxtx.c b/drivers/net/txgbe/txgbe_rxtx.c
> index 06acbd0881..fc9e7b14f5 100644
> --- a/drivers/net/txgbe/txgbe_rxtx.c
> +++ b/drivers/net/txgbe/txgbe_rxtx.c
> @@ -894,6 +894,7 @@ txgbe_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
>  		tx_pkt = *tx_pkts++;
>  		if (txgbe_check_pkt_err(tx_pkt)) {
>  			rte_pktmbuf_free(tx_pkt);
> +			txq->desc_error++;
>  			continue;
>  		}
>  
> @@ -2523,6 +2524,7 @@ txgbe_dev_tx_queue_setup(struct rte_eth_dev *dev,
>  	txgbe_set_tx_function(dev, txq);
>  
>  	txq->ops->reset(txq);
> +	txq->desc_error = 0;
>  
>  	dev->data->tx_queues[queue_idx] = txq;
>  
> @@ -4980,6 +4982,7 @@ txgbe_tx_queue_clear_error(void *param)
>  		if (!txq->resetting)
>  			continue;
>  
> +		txq->desc_error++;
>

Why error value is increased in this function, which resets the Tx queue?
Is the intention to reset the error value here?

>  		txgbe_dev_save_tx_queue(hw, i);
>  
>  		/* tx ring reset */
> diff --git a/drivers/net/txgbe/txgbe_rxtx.h b/drivers/net/txgbe/txgbe_rxtx.h
> index e668b60b1e..622a0d3981 100644
> --- a/drivers/net/txgbe/txgbe_rxtx.h
> +++ b/drivers/net/txgbe/txgbe_rxtx.h
> @@ -412,6 +412,7 @@ struct txgbe_tx_queue {
>  	/**< indicates that IPsec TX feature is in use */
>  #endif
>  	const struct rte_memzone *mz;
> +	uint64_t	    desc_error;
>  	bool		    resetting;
>  };
>
  
Jiawen Wu Nov. 1, 2024, 2:06 a.m. UTC | #2
> > @@ -4980,6 +4982,7 @@ txgbe_tx_queue_clear_error(void *param)
> >  		if (!txq->resetting)
> >  			continue;
> >
> > +		txq->desc_error++;
> >
> 
> Why error value is increased in this function, which resets the Tx queue?
> Is the intention to reset the error value here?

When there is a desc error to cause Tx ring hang,  the interrupt directs to
reset of the queue. So we increase the error count in the specific queue
reset function. The queue is reset, but the error that led to the resetting
is recorded. The error count is only reset at the setup function.
  
Ferruh Yigit Nov. 1, 2024, 2:45 a.m. UTC | #3
On 11/1/2024 2:06 AM, Jiawen Wu wrote:
>>> @@ -4980,6 +4982,7 @@ txgbe_tx_queue_clear_error(void *param)
>>>  		if (!txq->resetting)
>>>  			continue;
>>>
>>> +		txq->desc_error++;
>>>
>>
>> Why error value is increased in this function, which resets the Tx queue?
>> Is the intention to reset the error value here?
> 
> When there is a desc error to cause Tx ring hang,  the interrupt directs to
> reset of the queue. So we increase the error count in the specific queue
> reset function. The queue is reset, but the error that led to the resetting
> is recorded. The error count is only reset at the setup function.
> 

Got it. But this variable counts number of bad packets. Increasing it
when Tx ring hang too may be confusing as there are two different
reasons to increase the counter.

Btw, .stats_reset() needs to reset this error stat.
  
Jiawen Wu Nov. 1, 2024, 3:05 a.m. UTC | #4
> -----Original Message-----
> From: Ferruh Yigit <ferruh.yigit@amd.com>
> Sent: Friday, November 1, 2024 10:46 AM
> To: Jiawen Wu <jiawenwu@trustnetic.com>; dev@dpdk.org
> Subject: Re: [PATCH v2 07/13] net/txgbe: add Tx descriptor error statistics
> 
> On 11/1/2024 2:06 AM, Jiawen Wu wrote:
> >>> @@ -4980,6 +4982,7 @@ txgbe_tx_queue_clear_error(void *param)
> >>>  		if (!txq->resetting)
> >>>  			continue;
> >>>
> >>> +		txq->desc_error++;
> >>>
> >>
> >> Why error value is increased in this function, which resets the Tx queue?
> >> Is the intention to reset the error value here?
> >
> > When there is a desc error to cause Tx ring hang,  the interrupt directs to
> > reset of the queue. So we increase the error count in the specific queue
> > reset function. The queue is reset, but the error that led to the resetting
> > is recorded. The error count is only reset at the setup function.
> >
> 
> Got it. But this variable counts number of bad packets. Increasing it
> when Tx ring hang too may be confusing as there are two different
> reasons to increase the counter.

I think I should add a comment here:
/* Increase the count of Tx desc error since it causes the queue reset. */

> Btw, .stats_reset() needs to reset this error stat.

I'll add it into .stats_reset() in patch set v3.
  

Patch

diff --git a/drivers/net/txgbe/txgbe_ethdev.c b/drivers/net/txgbe/txgbe_ethdev.c
index bafa9cf829..0c76e986f4 100644
--- a/drivers/net/txgbe/txgbe_ethdev.c
+++ b/drivers/net/txgbe/txgbe_ethdev.c
@@ -2344,6 +2344,7 @@  txgbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 	struct txgbe_hw_stats *hw_stats = TXGBE_DEV_STATS(dev);
 	struct txgbe_stat_mappings *stat_mappings =
 			TXGBE_DEV_STAT_MAPPINGS(dev);
+	struct txgbe_tx_queue *txq;
 	uint32_t i, j;
 
 	txgbe_read_stats_registers(hw, hw_stats);
@@ -2398,6 +2399,11 @@  txgbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 
 	/* Tx Errors */
 	stats->oerrors  = 0;
+	for (i = 0; i < dev->data->nb_tx_queues; i++) {
+		txq = dev->data->tx_queues[i];
+		stats->oerrors += txq->desc_error;
+	}
+
 	return 0;
 }
 
diff --git a/drivers/net/txgbe/txgbe_rxtx.c b/drivers/net/txgbe/txgbe_rxtx.c
index 06acbd0881..fc9e7b14f5 100644
--- a/drivers/net/txgbe/txgbe_rxtx.c
+++ b/drivers/net/txgbe/txgbe_rxtx.c
@@ -894,6 +894,7 @@  txgbe_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
 		tx_pkt = *tx_pkts++;
 		if (txgbe_check_pkt_err(tx_pkt)) {
 			rte_pktmbuf_free(tx_pkt);
+			txq->desc_error++;
 			continue;
 		}
 
@@ -2523,6 +2524,7 @@  txgbe_dev_tx_queue_setup(struct rte_eth_dev *dev,
 	txgbe_set_tx_function(dev, txq);
 
 	txq->ops->reset(txq);
+	txq->desc_error = 0;
 
 	dev->data->tx_queues[queue_idx] = txq;
 
@@ -4980,6 +4982,7 @@  txgbe_tx_queue_clear_error(void *param)
 		if (!txq->resetting)
 			continue;
 
+		txq->desc_error++;
 		txgbe_dev_save_tx_queue(hw, i);
 
 		/* tx ring reset */
diff --git a/drivers/net/txgbe/txgbe_rxtx.h b/drivers/net/txgbe/txgbe_rxtx.h
index e668b60b1e..622a0d3981 100644
--- a/drivers/net/txgbe/txgbe_rxtx.h
+++ b/drivers/net/txgbe/txgbe_rxtx.h
@@ -412,6 +412,7 @@  struct txgbe_tx_queue {
 	/**< indicates that IPsec TX feature is in use */
 #endif
 	const struct rte_memzone *mz;
+	uint64_t	    desc_error;
 	bool		    resetting;
 };