[dpdk-dev] [PATCH v1 1/6] net/af_xdp: introduce AF_XDP PMD driver
Ye Xiaolong
xiaolong.ye at intel.com
Thu Mar 7 04:19:10 CET 2019
Hi, David
Thanks for your review.
On 03/05, David Marchand wrote:
>On Fri, Mar 1, 2019 at 9:13 AM Xiaolong Ye <xiaolong.ye at intel.com> wrote:
>
>> diff --git a/doc/guides/rel_notes/release_18_11.rst
>> b/doc/guides/rel_notes/release_18_11.rst
>> index 65bab557d..e0918441a 100644
>> --- a/doc/guides/rel_notes/release_18_11.rst
>> +++ b/doc/guides/rel_notes/release_18_11.rst
>> @@ -229,6 +229,13 @@ New Features
>> The AESNI MB PMD has been updated with additional support for the
>> AES-GCM
>> algorithm.
>>
>> +* **Added the AF_XDP PMD.**
>> +
>> + Added a Linux-specific PMD driver for AF_XDP, it can create the AF_XDP
>> socket
>> + and bind it to a specific netdev queue, it allows a DPDK application to
>> send
>> + and receive raw packets through the socket which would bypass the kernel
>> + network stack to achieve high performance packet processing.
>> +
>>
>
>Should be in 19.05 release notes.
Ooops, my bad, will swith to 19.05 in next version.
>
>
>diff --git a/drivers/net/af_xdp/rte_eth_af_xdp.c
>> b/drivers/net/af_xdp/rte_eth_af_xdp.c
>> new file mode 100644
>> index 000000000..6de769650
>> --- /dev/null
>> +++ b/drivers/net/af_xdp/rte_eth_af_xdp.c
>>
>> [snip]
>
>+struct pkt_rx_queue {
>> + struct xsk_ring_cons rx;
>> + struct xsk_umem_info *umem;
>> + struct xsk_socket *xsk;
>> + struct rte_mempool *mb_pool;
>> +
>> + unsigned long rx_pkts;
>> + unsigned long rx_bytes;
>> + unsigned long rx_dropped;
>>
>
>ethdev stats are uint64_t, why declare those internal stats as unsigned
>long ?
You are right, should use uint64_t instead.
>
>+
>> + struct pkt_tx_queue *pair;
>> + uint16_t queue_idx;
>> +};
>> +
>> +struct pkt_tx_queue {
>> + struct xsk_ring_prod tx;
>> +
>> + unsigned long tx_pkts;
>> + unsigned long err_pkts;
>> + unsigned long tx_bytes;
>>
>
>Idem.
Will change to uint64_t.
>
>+
>> + struct pkt_rx_queue *pair;
>> + uint16_t queue_idx;
>> +};
>>
>
>[snip]
>
>+static int
>> +eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
>> +{
>> + struct pmd_internals *internals = dev->data->dev_private;
>> + struct xdp_statistics xdp_stats;
>> + struct pkt_rx_queue *rxq;
>> + socklen_t optlen;
>> + int i;
>> +
>> + optlen = sizeof(struct xdp_statistics);
>> + for (i = 0; i < dev->data->nb_rx_queues; i++) {
>> + rxq = &internals->rx_queues[i];
>> + stats->q_ipackets[i] = internals->rx_queues[i].rx_pkts;
>> + stats->q_ibytes[i] = internals->rx_queues[i].rx_bytes;
>> +
>> + stats->q_opackets[i] = internals->tx_queues[i].tx_pkts;
>> + stats->q_errors[i] = internals->tx_queues[i].err_pkts;
>>
>
>q_errors[] are for reception errors, see the patchset I sent:
>http://mails.dpdk.org/archives/dev/2019-March/125703.html
>
>If you want per queue stats, use xstats.
>You can still account those errors in the global stats->oerrors below.
>
>+ stats->q_obytes[i] = internals->tx_queues[i].tx_bytes;
>> +
>> + stats->ipackets += stats->q_ipackets[i];
>> + stats->ibytes += stats->q_ibytes[i];
>> + stats->imissed += internals->rx_queues[i].rx_dropped;
>> + getsockopt(xsk_socket__fd(rxq->xsk), SOL_XDP,
>> XDP_STATISTICS,
>> + &xdp_stats, &optlen);
>> + stats->imissed += xdp_stats.rx_dropped;
>> +
>> + stats->opackets += stats->q_opackets[i];
>> + stats->oerrors += stats->q_errors[i];
>>
>
>- stats->oerrors += stats->q_errors[i];
>+ stats->oerrors += internals->tx_queues[i].err_pkts;
will correct according to your patch.
Thanks,
Xiaolong
>
>>
>> + stats->obytes += stats->q_obytes[i];
>> + }
>> +
>> + return 0;
>> +}
>>
>>
>
>--
>David Marchand
More information about the dev
mailing list