Commit 225480f0 authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'dpaa2-eth-AF_XDP-zc'



Ioana Ciornei says:

====================
net: dpaa2-eth: AF_XDP zero-copy support

This patch set adds support for AF_XDP zero-copy in the dpaa2-eth
driver. The support is available on the LX2160A SoC and its variants and
only on interfaces (DPNIs) with a maximum of 8 queues (HW limitations
are the root cause).

We are first implementing the .get_channels() callback since this a
dependency for further work.

Patches 2-3 are working on making the necessary changes for multiple
buffer pools on a single interface. By default, without an AF_XDP socket
attached, only a single buffer pool will be used and shared between all
the queues. The changes in the functions are made in this patch, but the
actual allocation and setup of a new BP is done in patch#10.

Patches 4-5 are improving the information exposed in debugfs. We are
exposing a new file to show which buffer pool is used by what channels
and how many buffers it currently has.

The 6th patch updates the dpni_set_pools() firmware API so that we are
capable of setting up a different buffer per queue in later patches.

In the 7th patch the generic dev_open/close APIs are used instead of the
dpaa2-eth internal ones.

Patches 8-9 are rearranging the existing code in dpaa2-eth.c in order to
create new functions which will be used in the XSK implementation in
dpaa2-xsk.c

Finally, the last 3 patches are adding the actual support for both the
Rx and Tx path of AF_XDP zero-copy and some associated tracepoints.
Details on the implementation can be found in the actual patch.

Changes in v2:
 - 3/12:  Export dpaa2_eth_allocate_dpbp/dpaa2_eth_free_dpbp in this
   patch to avoid a build warning. The functions will be used in next
   patches.
 - 6/12:  Use __le16 instead of u16 for the dpbp_id field.
 - 12/12: Use xdp_buff->data_hard_start when tracing the BP seeding.

Changes in v3:
 - 3/12: fix leaking of bp on error path
====================

Acked-by: default avatarBjörn Töpel <bjorn@kernel.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 3bd5549b 3817b2ac
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -6326,6 +6326,7 @@ F: drivers/net/ethernet/freescale/dpaa2/Kconfig
F:	drivers/net/ethernet/freescale/dpaa2/Makefile
F:	drivers/net/ethernet/freescale/dpaa2/dpaa2-eth*
F:	drivers/net/ethernet/freescale/dpaa2/dpaa2-mac*
F:	drivers/net/ethernet/freescale/dpaa2/dpaa2-xsk*
F:	drivers/net/ethernet/freescale/dpaa2/dpkg.h
F:	drivers/net/ethernet/freescale/dpaa2/dpmac*
F:	drivers/net/ethernet/freescale/dpaa2/dpni*
+1 −1
Original line number Diff line number Diff line
@@ -7,7 +7,7 @@ obj-$(CONFIG_FSL_DPAA2_ETH) += fsl-dpaa2-eth.o
obj-$(CONFIG_FSL_DPAA2_PTP_CLOCK)	+= fsl-dpaa2-ptp.o
obj-$(CONFIG_FSL_DPAA2_SWITCH)		+= fsl-dpaa2-switch.o

fsl-dpaa2-eth-objs	:= dpaa2-eth.o dpaa2-ethtool.o dpni.o dpaa2-mac.o dpmac.o dpaa2-eth-devlink.o
fsl-dpaa2-eth-objs	:= dpaa2-eth.o dpaa2-ethtool.o dpni.o dpaa2-mac.o dpmac.o dpaa2-eth-devlink.o dpaa2-xsk.o
fsl-dpaa2-eth-${CONFIG_FSL_DPAA2_ETH_DCB} += dpaa2-eth-dcb.o
fsl-dpaa2-eth-${CONFIG_DEBUG_FS} += dpaa2-eth-debugfs.o
fsl-dpaa2-ptp-objs	:= dpaa2-ptp.o dprtc.o
+53 −4
Original line number Diff line number Diff line
@@ -98,14 +98,14 @@ static int dpaa2_dbg_ch_show(struct seq_file *file, void *offset)
	int i;

	seq_printf(file, "Channel stats for %s:\n", priv->net_dev->name);
	seq_printf(file, "%s%16s%16s%16s%16s%16s%16s\n",
		   "CHID", "CPU", "Deq busy", "Frames", "CDANs",
	seq_printf(file, "%s  %5s%16s%16s%16s%16s%16s%16s\n",
		   "IDX", "CHID", "CPU", "Deq busy", "Frames", "CDANs",
		   "Avg Frm/CDAN", "Buf count");

	for (i = 0; i < priv->num_channels; i++) {
		ch = priv->channel[i];
		seq_printf(file, "%4d%16d%16llu%16llu%16llu%16llu%16d\n",
			   ch->ch_id,
		seq_printf(file, "%3s%d%6d%16d%16llu%16llu%16llu%16llu%16d\n",
			   "CH#", i, ch->ch_id,
			   ch->nctx.desired_cpu,
			   ch->stats.dequeue_portal_busy,
			   ch->stats.frames,
@@ -119,6 +119,51 @@ static int dpaa2_dbg_ch_show(struct seq_file *file, void *offset)

DEFINE_SHOW_ATTRIBUTE(dpaa2_dbg_ch);

static int dpaa2_dbg_bp_show(struct seq_file *file, void *offset)
{
	struct dpaa2_eth_priv *priv = (struct dpaa2_eth_priv *)file->private;
	int i, j, num_queues, buf_cnt;
	struct dpaa2_eth_bp *bp;
	char ch_name[10];
	int err;

	/* Print out the header */
	seq_printf(file, "Buffer pool info for %s:\n", priv->net_dev->name);
	seq_printf(file, "%s  %10s%15s", "IDX", "BPID", "Buf count");
	num_queues = dpaa2_eth_queue_count(priv);
	for (i = 0; i < num_queues; i++) {
		snprintf(ch_name, sizeof(ch_name), "CH#%d", i);
		seq_printf(file, "%10s", ch_name);
	}
	seq_printf(file, "\n");

	/* For each buffer pool, print out its BPID, the number of buffers in
	 * that buffer pool and the channels which are using it.
	 */
	for (i = 0; i < priv->num_bps; i++) {
		bp = priv->bp[i];

		err = dpaa2_io_query_bp_count(NULL, bp->bpid, &buf_cnt);
		if (err) {
			netdev_warn(priv->net_dev, "Buffer count query error %d\n", err);
			return err;
		}

		seq_printf(file, "%3s%d%10d%15d", "BP#", i, bp->bpid, buf_cnt);
		for (j = 0; j < num_queues; j++) {
			if (priv->channel[j]->bp == bp)
				seq_printf(file, "%10s", "x");
			else
				seq_printf(file, "%10s", "");
		}
		seq_printf(file, "\n");
	}

	return 0;
}

DEFINE_SHOW_ATTRIBUTE(dpaa2_dbg_bp);

void dpaa2_dbg_add(struct dpaa2_eth_priv *priv)
{
	struct fsl_mc_device *dpni_dev;
@@ -139,6 +184,10 @@ void dpaa2_dbg_add(struct dpaa2_eth_priv *priv)

	/* per-fq stats file */
	debugfs_create_file("ch_stats", 0444, dir, priv, &dpaa2_dbg_ch_fops);

	/* per buffer pool stats file */
	debugfs_create_file("bp_stats", 0444, dir, priv, &dpaa2_dbg_bp_fops);

}

void dpaa2_dbg_remove(struct dpaa2_eth_priv *priv)
+91 −51
Original line number Diff line number Diff line
@@ -73,6 +73,14 @@ DEFINE_EVENT(dpaa2_eth_fd, dpaa2_tx_fd,
	     TP_ARGS(netdev, fd)
);

/* Tx (egress) XSK fd */
DEFINE_EVENT(dpaa2_eth_fd, dpaa2_tx_xsk_fd,
	     TP_PROTO(struct net_device *netdev,
		      const struct dpaa2_fd *fd),

	     TP_ARGS(netdev, fd)
);

/* Rx fd */
DEFINE_EVENT(dpaa2_eth_fd, dpaa2_rx_fd,
	     TP_PROTO(struct net_device *netdev,
@@ -81,6 +89,14 @@ DEFINE_EVENT(dpaa2_eth_fd, dpaa2_rx_fd,
	     TP_ARGS(netdev, fd)
);

/* Rx XSK fd */
DEFINE_EVENT(dpaa2_eth_fd, dpaa2_rx_xsk_fd,
	     TP_PROTO(struct net_device *netdev,
		      const struct dpaa2_fd *fd),

	     TP_ARGS(netdev, fd)
);

/* Tx confirmation fd */
DEFINE_EVENT(dpaa2_eth_fd, dpaa2_tx_conf_fd,
	     TP_PROTO(struct net_device *netdev,
@@ -90,7 +106,7 @@ DEFINE_EVENT(dpaa2_eth_fd, dpaa2_tx_conf_fd,
);

/* Log data about raw buffers. Useful for tracing DPBP content. */
TRACE_EVENT(dpaa2_eth_buf_seed,
DECLARE_EVENT_CLASS(dpaa2_eth_buf,
		    /* Trace function prototype */
		    TP_PROTO(struct net_device *netdev,
			     /* virtual address and size */
@@ -143,6 +159,30 @@ TRACE_EVENT(dpaa2_eth_buf_seed,
			      __entry->bpid)
);

/* Main memory buff seeding */
DEFINE_EVENT(dpaa2_eth_buf, dpaa2_eth_buf_seed,
	     TP_PROTO(struct net_device *netdev,
		      void *vaddr,
		      size_t size,
		      dma_addr_t dma_addr,
		      size_t map_size,
		      u16 bpid),

	     TP_ARGS(netdev, vaddr, size, dma_addr, map_size, bpid)
);

/* UMEM buff seeding on AF_XDP fast path */
DEFINE_EVENT(dpaa2_eth_buf, dpaa2_xsk_buf_seed,
	     TP_PROTO(struct net_device *netdev,
		      void *vaddr,
		      size_t size,
		      dma_addr_t dma_addr,
		      size_t map_size,
		      u16 bpid),

	     TP_ARGS(netdev, vaddr, size, dma_addr, map_size, bpid)
);

/* If only one event of a certain type needs to be declared, use TRACE_EVENT().
 * The syntax is the same as for DECLARE_EVENT_CLASS().
 */
+333 −154

File changed.

Preview size limit exceeded, changes collapsed.

Loading