[dpdk-dev,v3] pcap: add support for rx and tx byte counters
Commit Message
add support for rx and tx byte counters in addition to existing rx and tx packet counters, updated with new dpdk master branch
---
drivers/net/pcap/rte_eth_pcap.c | 22 ++++++++++++++++++++--
1 file changed, 20 insertions(+), 2 deletions(-)
Comments
> -----Original Message-----
> From: Klaus Degner [mailto:kd@allegro-packets.com]
> Sent: Friday, July 10, 2015 8:13 PM
> To: dev@dpdk.org
> Cc: Mcnamara, John; Klaus Degner
> Subject: [PATCH v3] pcap: add support for rx and tx byte counters
>
> add support for rx and tx byte counters in addition to existing rx and tx
> packet counters, updated with new dpdk master branch
> ---
> drivers/net/pcap/rte_eth_pcap.c | 22 ++++++++++++++++++++--
> 1 file changed, 20 insertions(+), 2 deletions(-)
Hi Klaus,
Thanks, getting better.
Patches need to be signed off by doing --signoff/-s when committing. See the contributing guidelines here:
http://dpdk.org/dev
This and other issues could be picked up using Linux checkpatch utility:
$ checkpatch.pl --ignore PREFER_KERNEL_TYPES,SPLIT_STRING,VOLATILE -q *.patch
WARNING: Possible unwrapped commit description (prefer a maximum 75 chars per line)
#11:
add support for rx and tx byte counters in addition to existing rx and tx packet counters, updated with new dpdk master branch
(Cut 2 warnings that don't apply to the patch.)
ERROR: Missing Signed-off-by: line(s)
total: 1 errors, 3 warnings, 0 checks, 103 lines checked
>
> diff --git a/drivers/net/pcap/rte_eth_pcap.c
> b/drivers/net/pcap/rte_eth_pcap.c index 682628f..0fd04b5 100644
> --- a/drivers/net/pcap/rte_eth_pcap.c
> +++ b/drivers/net/pcap/rte_eth_pcap.c
> ...
> if (unlikely(pcap_q->pcap == NULL || nb_pkts == 0))
> return 0;
> @@ -222,6 +225,7 @@ eth_pcap_rx(void *queue,
> rte_memcpy(rte_pktmbuf_mtod(mbuf, void *), packet,
> header.len);
> mbuf->data_len = (uint16_t)header.len;
> + bytes_rx += header.len;
This looks like it should be outside the if() statement to calculate the RX bytes for both normal and (non-error) jumbo frames.
> } else {
> /* Try read jumbo frame into multi mbufs. */
> if (unlikely(eth_pcap_rx_jumbo(pcap_q->mb_pool,
> @@ -237,6 +241,7 @@ eth_pcap_rx(void *queue,
> num_rx++;
> }
> pcap_q->rx_pkts += num_rx;
> + pcap_q->rx_bytes += bytes_rx;
Rename bytes_rx to rx_bytes for consistency with the existing member name.
> /*
> @@ -306,6 +313,7 @@ eth_pcap_tx_dumper(void *queue,
> */
> pcap_dump_flush(dumper_q->dumper);
> dumper_q->tx_pkts += num_tx;
> + dumper_q->tx_bytes += bytes_tx;
Rename bytes_tx, same as previous comment.
Also, this code needs to be added to eth_pcap_tx() as well. The is one RX code path but there are two TX code paths (for writing to a file and to an interface).
> dumper_q->err_pkts += nb_pkts - num_tx;
> return num_tx;
> }
> @@ -499,25 +507,32 @@ eth_stats_get(struct rte_eth_dev *dev,
> struct rte_eth_stats *igb_stats)
> {
> unsigned i;
> - unsigned long rx_total = 0, tx_total = 0, tx_err_total = 0;
> + unsigned long rx_total = 0, rx_b_total = 0;
> + unsigned long tx_total = 0, tx_err_total = 0, tx_b_total = 0;
The rx_b_total and tx_b_total variable names aren't very clear. Call them rx_bytes_total and tx_bytes_total. In general try to keep the variable names consistent with the existing code.
Also, this would be better to align the rx and tx variables:
unsigned long rx_total = 0, rx_bytes_total = 0;
unsigned long tx_total = 0, tx_bytes_total = 0, tx_err_total = 0;
Also, it would probably be best to rename rx/tx_total to rx/tx_packets_total (and the tx_err_total) in this function since there are now two types of totals. That would make code like this clearer:
- igb_stats->opackets = tx_total;
- igb_stats->obytes = tx_b_total;
+ igb_stats->opackets = tx_packets_total;
+ igb_stats->obytes = tx_bytes_total;
John.
--
Hi John,
Thank you again for your review. I will work on a v4 with your input.
Klaus
Am 13.07.15 um 14:56 schrieb Mcnamara, John:
>> -----Original Message-----
>> From: Klaus Degner [mailto:kd@allegro-packets.com]
>> Sent: Friday, July 10, 2015 8:13 PM
>> To: dev@dpdk.org
>> Cc: Mcnamara, John; Klaus Degner
>> Subject: [PATCH v3] pcap: add support for rx and tx byte counters
>>
>> add support for rx and tx byte counters in addition to existing rx and tx
>> packet counters, updated with new dpdk master branch
>> ---
>> drivers/net/pcap/rte_eth_pcap.c | 22 ++++++++++++++++++++--
>> 1 file changed, 20 insertions(+), 2 deletions(-)
> Hi Klaus,
>
> Thanks, getting better.
>
> Patches need to be signed off by doing --signoff/-s when committing. See the contributing guidelines here:
>
> http://dpdk.org/dev
>
> This and other issues could be picked up using Linux checkpatch utility:
>
> $ checkpatch.pl --ignore PREFER_KERNEL_TYPES,SPLIT_STRING,VOLATILE -q *.patch
>
> WARNING: Possible unwrapped commit description (prefer a maximum 75 chars per line)
> #11:
> add support for rx and tx byte counters in addition to existing rx and tx packet counters, updated with new dpdk master branch
>
> (Cut 2 warnings that don't apply to the patch.)
>
> ERROR: Missing Signed-off-by: line(s)
>
> total: 1 errors, 3 warnings, 0 checks, 103 lines checked
>
>
>> diff --git a/drivers/net/pcap/rte_eth_pcap.c
>> b/drivers/net/pcap/rte_eth_pcap.c index 682628f..0fd04b5 100644
>> --- a/drivers/net/pcap/rte_eth_pcap.c
>> +++ b/drivers/net/pcap/rte_eth_pcap.c
>> ...
>> if (unlikely(pcap_q->pcap == NULL || nb_pkts == 0))
>> return 0;
>> @@ -222,6 +225,7 @@ eth_pcap_rx(void *queue,
>> rte_memcpy(rte_pktmbuf_mtod(mbuf, void *), packet,
>> header.len);
>> mbuf->data_len = (uint16_t)header.len;
>> + bytes_rx += header.len;
> This looks like it should be outside the if() statement to calculate the RX bytes for both normal and (non-error) jumbo frames.
>
>
>> } else {
>> /* Try read jumbo frame into multi mbufs. */
>> if (unlikely(eth_pcap_rx_jumbo(pcap_q->mb_pool,
>> @@ -237,6 +241,7 @@ eth_pcap_rx(void *queue,
>> num_rx++;
>> }
>> pcap_q->rx_pkts += num_rx;
>> + pcap_q->rx_bytes += bytes_rx;
> Rename bytes_rx to rx_bytes for consistency with the existing member name.
>
>
>> /*
>> @@ -306,6 +313,7 @@ eth_pcap_tx_dumper(void *queue,
>> */
>> pcap_dump_flush(dumper_q->dumper);
>> dumper_q->tx_pkts += num_tx;
>> + dumper_q->tx_bytes += bytes_tx;
> Rename bytes_tx, same as previous comment.
>
> Also, this code needs to be added to eth_pcap_tx() as well. The is one RX code path but there are two TX code paths (for writing to a file and to an interface).
>
>
>> dumper_q->err_pkts += nb_pkts - num_tx;
>> return num_tx;
>> }
>> @@ -499,25 +507,32 @@ eth_stats_get(struct rte_eth_dev *dev,
>> struct rte_eth_stats *igb_stats)
>> {
>> unsigned i;
>> - unsigned long rx_total = 0, tx_total = 0, tx_err_total = 0;
>> + unsigned long rx_total = 0, rx_b_total = 0;
>> + unsigned long tx_total = 0, tx_err_total = 0, tx_b_total = 0;
> The rx_b_total and tx_b_total variable names aren't very clear. Call them rx_bytes_total and tx_bytes_total. In general try to keep the variable names consistent with the existing code.
>
> Also, this would be better to align the rx and tx variables:
>
> unsigned long rx_total = 0, rx_bytes_total = 0;
> unsigned long tx_total = 0, tx_bytes_total = 0, tx_err_total = 0;
>
> Also, it would probably be best to rename rx/tx_total to rx/tx_packets_total (and the tx_err_total) in this function since there are now two types of totals. That would make code like this clearer:
>
> - igb_stats->opackets = tx_total;
> - igb_stats->obytes = tx_b_total;
>
> + igb_stats->opackets = tx_packets_total;
> + igb_stats->obytes = tx_bytes_total;
>
> John.
> --
>
>
@@ -69,6 +69,7 @@ struct pcap_rx_queue {
uint8_t in_port;
struct rte_mempool *mb_pool;
volatile unsigned long rx_pkts;
+ volatile unsigned long rx_bytes;
volatile unsigned long err_pkts;
char name[PATH_MAX];
char type[ETH_PCAP_ARG_MAXLEN];
@@ -78,6 +79,7 @@ struct pcap_tx_queue {
pcap_dumper_t *dumper;
pcap_t *pcap;
volatile unsigned long tx_pkts;
+ volatile unsigned long tx_bytes;
volatile unsigned long err_pkts;
char name[PATH_MAX];
char type[ETH_PCAP_ARG_MAXLEN];
@@ -196,6 +198,7 @@ eth_pcap_rx(void *queue,
struct pcap_rx_queue *pcap_q = queue;
uint16_t num_rx = 0;
uint16_t buf_size;
+ uint32_t bytes_rx = 0;
if (unlikely(pcap_q->pcap == NULL || nb_pkts == 0))
return 0;
@@ -222,6 +225,7 @@ eth_pcap_rx(void *queue,
rte_memcpy(rte_pktmbuf_mtod(mbuf, void *), packet,
header.len);
mbuf->data_len = (uint16_t)header.len;
+ bytes_rx += header.len;
} else {
/* Try read jumbo frame into multi mbufs. */
if (unlikely(eth_pcap_rx_jumbo(pcap_q->mb_pool,
@@ -237,6 +241,7 @@ eth_pcap_rx(void *queue,
num_rx++;
}
pcap_q->rx_pkts += num_rx;
+ pcap_q->rx_bytes += bytes_rx;
return num_rx;
}
@@ -263,6 +268,7 @@ eth_pcap_tx_dumper(void *queue,
struct rte_mbuf *mbuf;
struct pcap_tx_queue *dumper_q = queue;
uint16_t num_tx = 0;
+ uint32_t bytes_tx = 0;
struct pcap_pkthdr header;
if (dumper_q->dumper == NULL || nb_pkts == 0)
@@ -297,6 +303,7 @@ eth_pcap_tx_dumper(void *queue,
rte_pktmbuf_free(mbuf);
num_tx++;
+ bytes_tx += header.len;
}
/*
@@ -306,6 +313,7 @@ eth_pcap_tx_dumper(void *queue,
*/
pcap_dump_flush(dumper_q->dumper);
dumper_q->tx_pkts += num_tx;
+ dumper_q->tx_bytes += bytes_tx;
dumper_q->err_pkts += nb_pkts - num_tx;
return num_tx;
}
@@ -499,25 +507,32 @@ eth_stats_get(struct rte_eth_dev *dev,
struct rte_eth_stats *igb_stats)
{
unsigned i;
- unsigned long rx_total = 0, tx_total = 0, tx_err_total = 0;
+ unsigned long rx_total = 0, rx_b_total = 0;
+ unsigned long tx_total = 0, tx_err_total = 0, tx_b_total = 0;
const struct pmd_internals *internal = dev->data->dev_private;
for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS && i < internal->nb_rx_queues;
i++) {
igb_stats->q_ipackets[i] = internal->rx_queue[i].rx_pkts;
+ igb_stats->q_ibytes[i] = internal->rx_queue[i].rx_bytes;
rx_total += igb_stats->q_ipackets[i];
+ rx_b_total += igb_stats->q_ibytes[i];
}
for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS && i < internal->nb_tx_queues;
i++) {
igb_stats->q_opackets[i] = internal->tx_queue[i].tx_pkts;
+ igb_stats->q_obytes[i] = internal->tx_queue[i].tx_bytes;
igb_stats->q_errors[i] = internal->tx_queue[i].err_pkts;
tx_total += igb_stats->q_opackets[i];
+ tx_b_total += igb_stats->q_obytes[i];
tx_err_total += igb_stats->q_errors[i];
}
igb_stats->ipackets = rx_total;
+ igb_stats->ibytes = rx_b_total;
igb_stats->opackets = tx_total;
+ igb_stats->obytes = tx_b_total;
igb_stats->oerrors = tx_err_total;
}
@@ -526,10 +541,13 @@ eth_stats_reset(struct rte_eth_dev *dev)
{
unsigned i;
struct pmd_internals *internal = dev->data->dev_private;
- for (i = 0; i < internal->nb_rx_queues; i++)
+ for (i = 0; i < internal->nb_rx_queues; i++) {
internal->rx_queue[i].rx_pkts = 0;
+ internal->rx_queue[i].rx_bytes = 0;
+ }
for (i = 0; i < internal->nb_tx_queues; i++) {
internal->tx_queue[i].tx_pkts = 0;
+ internal->tx_queue[i].tx_bytes = 0;
internal->tx_queue[i].err_pkts = 0;
}
}