From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 39802A09E4; Thu, 28 Jan 2021 19:10:36 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id C80FD40682; Thu, 28 Jan 2021 19:10:35 +0100 (CET) Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by mails.dpdk.org (Postfix) with ESMTP id 818C94067A for ; Thu, 28 Jan 2021 19:10:33 +0100 (CET) IronPort-SDR: +5DpC+LQhhzRJ5GLHoTV51Cd5tD85036XhmMMFuxoF28rWXF9mKPt1fVOYWhxlRZgEtKLwUDef i41WKhYTIGHA== X-IronPort-AV: E=McAfee;i="6000,8403,9878"; a="176777364" X-IronPort-AV: E=Sophos;i="5.79,383,1602572400"; d="scan'208";a="176777364" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jan 2021 10:10:14 -0800 IronPort-SDR: NnXOG6mKiX5DqdF4SbMOWppuzejSyr019Km2WWk1RpDok7/Xmp8NappKqlWHegw/CI8y6yJxcg fEYUcaLNELRg== X-IronPort-AV: E=Sophos;i="5.79,383,1602572400"; d="scan'208";a="388932117" Received: from fyigit-mobl1.ger.corp.intel.com (HELO [10.213.197.127]) ([10.213.197.127]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jan 2021 10:10:13 -0800 To: Ido Goshen Cc: dev@dpdk.org References: <20210125175836.87200-1-ido@cgstowernetworks.com> From: Ferruh Yigit Message-ID: Date: Thu, 28 Jan 2021 18:10:10 +0000 MIME-Version: 1.0 In-Reply-To: <20210125175836.87200-1-ido@cgstowernetworks.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit Subject: Re: [dpdk-dev] [PATCH 1/1] net/pcap: imissed stats support X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" On 1/25/2021 5:58 PM, Ido Goshen wrote: > Signed-off-by: Ido Goshen > --- > drivers/net/pcap/rte_eth_pcap.c | 20 ++++++++++++++++++++ > 1 file changed, 20 insertions(+) > > diff --git a/drivers/net/pcap/rte_eth_pcap.c b/drivers/net/pcap/rte_eth_pcap.c > index a32b1f3f3..83e208514 100644 > --- a/drivers/net/pcap/rte_eth_pcap.c > +++ b/drivers/net/pcap/rte_eth_pcap.c > @@ -58,6 +58,7 @@ struct queue_stat { > volatile unsigned long pkts; > volatile unsigned long bytes; > volatile unsigned long err_pkts; > + volatile unsigned long missed_reset; > }; > > struct pcap_rx_queue { > @@ -680,11 +681,23 @@ eth_dev_info(struct rte_eth_dev *dev, > return 0; > } > > +static unsigned long > +eth_stats_get_pcap_missed(struct rte_eth_dev *dev, unsigned int qid) > +{ > + const struct pmd_process_private *pp = dev->process_private; > + pcap_t *pcap = pp->rx_pcap[qid]; > + struct pcap_stat stat; > + if (pcap_stats(pcap, &stat) != 0) If the stats requested after "port stop" this will crash, since "port stop" will close the pcap. Although unlikely that stats will be called after "port stop", still it may be and better to put a protection here. > + return 0; > + return stat.ps_drop; > +} > + > static int > eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) > { > unsigned int i; > unsigned long rx_packets_total = 0, rx_bytes_total = 0; > + unsigned long rx_missed_total = 0; > unsigned long tx_packets_total = 0, tx_bytes_total = 0; > unsigned long tx_packets_err_total = 0; > const struct pmd_internals *internal = dev->data->dev_private; > @@ -695,6 +708,10 @@ eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) > stats->q_ibytes[i] = internal->rx_queue[i].rx_stat.bytes; > rx_packets_total += stats->q_ipackets[i]; > rx_bytes_total += stats->q_ibytes[i]; > + unsigned long rx_missed = eth_stats_get_pcap_missed(dev, i); > + if (rx_missed) > + rx_missed_total = rx_missed - > + internal->rx_queue[i].rx_stat.missed_reset; rx_missed_total += After a "port stop" & "port start" the 'stat.ps_drop' will be reset, if stats cleared before, because of stored 'missed_reset', possible to see very big (and wrong) stat values. Better to clear the 'missed_reset' on port stop. > } > > for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS && > @@ -708,6 +725,7 @@ eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) > > stats->ipackets = rx_packets_total; > stats->ibytes = rx_bytes_total; > + stats->imissed = rx_missed_total; > stats->opackets = tx_packets_total; > stats->obytes = tx_bytes_total; > stats->oerrors = tx_packets_err_total; > @@ -724,6 +742,8 @@ eth_stats_reset(struct rte_eth_dev *dev) > for (i = 0; i < dev->data->nb_rx_queues; i++) { > internal->rx_queue[i].rx_stat.pkts = 0; > internal->rx_queue[i].rx_stat.bytes = 0; > + internal->rx_queue[i].rx_stat.missed_reset = > + eth_stats_get_pcap_missed(dev, i); > } > > for (i = 0; i < dev->data->nb_tx_queues; i++) { >