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: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user