Commit ea78f201 authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

Merge branch 'bug-fixes-from-xdp-patch-series'

Meghana Malladi says:

====================
Bug fixes from XDP patch series

This patch series fixes the bugs introduced while adding
xdp support in the icssg driver, and were reproduced while
running xdp-trafficgen to generate xdp traffic on icssg interfaces.

v1: https://lore.kernel.org/all/20250428120459.244525-1-m-malladi@ti.com/
====================

Link: https://patch.msgid.link/20250506110546.4065715-1-m-malladi@ti.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents f5c79ffd 1884fc85
Loading
Loading
Loading
Loading
+13 −2
Original line number Diff line number Diff line
@@ -187,7 +187,6 @@ int emac_tx_complete_packets(struct prueth_emac *emac, int chn,
			xdp_return_frame(xdpf);
			break;
		default:
			netdev_err(ndev, "tx_complete: invalid swdata type %d\n", swdata->type);
			prueth_xmit_free(tx_chn, desc_tx);
			ndev->stats.tx_dropped++;
			continue;
@@ -567,6 +566,7 @@ u32 emac_xmit_xdp_frame(struct prueth_emac *emac,
{
	struct cppi5_host_desc_t *first_desc;
	struct net_device *ndev = emac->ndev;
	struct netdev_queue *netif_txq;
	struct prueth_tx_chn *tx_chn;
	dma_addr_t desc_dma, buf_dma;
	struct prueth_swdata *swdata;
@@ -620,12 +620,17 @@ u32 emac_xmit_xdp_frame(struct prueth_emac *emac,
		swdata->data.xdpf = xdpf;
	}

	/* Report BQL before sending the packet */
	netif_txq = netdev_get_tx_queue(ndev, tx_chn->id);
	netdev_tx_sent_queue(netif_txq, xdpf->len);

	cppi5_hdesc_set_pktlen(first_desc, xdpf->len);
	desc_dma = k3_cppi_desc_pool_virt2dma(tx_chn->desc_pool, first_desc);

	ret = k3_udma_glue_push_tx_chn(tx_chn->tx_chn, first_desc, desc_dma);
	if (ret) {
		netdev_err(ndev, "xdp tx: push failed: %d\n", ret);
		netdev_tx_completed_queue(netif_txq, 1, xdpf->len);
		goto drop_free_descs;
	}

@@ -650,6 +655,8 @@ static u32 emac_run_xdp(struct prueth_emac *emac, struct xdp_buff *xdp,
			struct page *page, u32 *len)
{
	struct net_device *ndev = emac->ndev;
	struct netdev_queue *netif_txq;
	int cpu = smp_processor_id();
	struct bpf_prog *xdp_prog;
	struct xdp_frame *xdpf;
	u32 pkt_len = *len;
@@ -669,8 +676,11 @@ static u32 emac_run_xdp(struct prueth_emac *emac, struct xdp_buff *xdp,
			goto drop;
		}

		q_idx = smp_processor_id() % emac->tx_ch_num;
		q_idx = cpu % emac->tx_ch_num;
		netif_txq = netdev_get_tx_queue(ndev, q_idx);
		__netif_tx_lock(netif_txq, cpu);
		result = emac_xmit_xdp_frame(emac, xdpf, page, q_idx);
		__netif_tx_unlock(netif_txq);
		if (result == ICSSG_XDP_CONSUMED) {
			ndev->stats.tx_dropped++;
			goto drop;
@@ -979,6 +989,7 @@ enum netdev_tx icssg_ndo_start_xmit(struct sk_buff *skb, struct net_device *ndev
	ret = k3_udma_glue_push_tx_chn(tx_chn->tx_chn, first_desc, desc_dma);
	if (ret) {
		netdev_err(ndev, "tx: push failed: %d\n", ret);
		netdev_tx_completed_queue(netif_txq, 1, pkt_len);
		goto drop_free_descs;
	}

+10 −6
Original line number Diff line number Diff line
@@ -1075,17 +1075,21 @@ static int emac_xdp_xmit(struct net_device *dev, int n, struct xdp_frame **frame
{
	struct prueth_emac *emac = netdev_priv(dev);
	struct net_device *ndev = emac->ndev;
	struct netdev_queue *netif_txq;
	int cpu = smp_processor_id();
	struct xdp_frame *xdpf;
	unsigned int q_idx;
	int nxmit = 0;
	u32 err;
	int i;

	q_idx = smp_processor_id() % emac->tx_ch_num;
	q_idx = cpu % emac->tx_ch_num;
	netif_txq = netdev_get_tx_queue(ndev, q_idx);

	if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK))
		return -EINVAL;

	__netif_tx_lock(netif_txq, cpu);
	for (i = 0; i < n; i++) {
		xdpf = frames[i];
		err = emac_xmit_xdp_frame(emac, xdpf, NULL, q_idx);
@@ -1095,6 +1099,7 @@ static int emac_xdp_xmit(struct net_device *dev, int n, struct xdp_frame **frame
		}
		nxmit++;
	}
	__netif_tx_unlock(netif_txq);

	return nxmit;
}
@@ -1109,11 +1114,6 @@ static int emac_xdp_xmit(struct net_device *dev, int n, struct xdp_frame **frame
static int emac_xdp_setup(struct prueth_emac *emac, struct netdev_bpf *bpf)
{
	struct bpf_prog *prog = bpf->prog;
	xdp_features_t val;

	val = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
	      NETDEV_XDP_ACT_NDO_XMIT;
	xdp_set_features_flag(emac->ndev, val);

	if (!emac->xdpi.prog && !prog)
		return 0;
@@ -1291,6 +1291,10 @@ static int prueth_netdev_init(struct prueth *prueth,
	ndev->hw_features = NETIF_F_SG;
	ndev->features = ndev->hw_features | NETIF_F_HW_VLAN_CTAG_FILTER;
	ndev->hw_features |= NETIF_PRUETH_HSR_OFFLOAD_FEATURES;
	xdp_set_features_flag(ndev,
			      NETDEV_XDP_ACT_BASIC |
			      NETDEV_XDP_ACT_REDIRECT |
			      NETDEV_XDP_ACT_NDO_XMIT);

	netif_napi_add(ndev, &emac->napi_rx, icssg_napi_rx_poll);
	hrtimer_setup(&emac->rx_hrtimer, &emac_rx_timer_callback, CLOCK_MONOTONIC,