[dpdk-dev] [PATCH v1 1/6] net/af_xdp: introduce AF_XDP PMD driver
David Marchand
david.marchand at redhat.com
Tue Mar 5 09:25:34 CET 2019
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.
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 ?
+
> + 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.
+
> + 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;
>
> + stats->obytes += stats->q_obytes[i];
> + }
> +
> + return 0;
> +}
>
>
--
David Marchand
More information about the dev
mailing list