Skip to content

Commit fadd5d8

Browse files
Fushuai Wanggregkh
authored andcommitted
dpaa2-eth: fix xdp_rxq_info leak
[ Upstream commit 2def09ead4ad5907988b655d1e1454003aaf8297 ] The driver registered xdp_rxq_info structures via xdp_rxq_info_reg() but failed to properly unregister them in error paths and during removal. Fixes: d678be1 ("dpaa2-eth: add XDP_REDIRECT support") Signed-off-by: Fushuai Wang <[email protected]> Reviewed-by: Simon Horman <[email protected]> Reviewed-by: Ioana Ciornei <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]> Signed-off-by: Sasha Levin <[email protected]>
1 parent 8c0be0b commit fadd5d8

File tree

1 file changed

+24
-2
lines changed

1 file changed

+24
-2
lines changed

drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3729,6 +3729,7 @@ static int dpaa2_eth_setup_rx_flow(struct dpaa2_eth_priv *priv,
37293729
MEM_TYPE_PAGE_ORDER0, NULL);
37303730
if (err) {
37313731
dev_err(dev, "xdp_rxq_info_reg_mem_model failed\n");
3732+
xdp_rxq_info_unreg(&fq->channel->xdp_rxq);
37323733
return err;
37333734
}
37343735

@@ -4221,17 +4222,25 @@ static int dpaa2_eth_bind_dpni(struct dpaa2_eth_priv *priv)
42214222
return -EINVAL;
42224223
}
42234224
if (err)
4224-
return err;
4225+
goto out;
42254226
}
42264227

42274228
err = dpni_get_qdid(priv->mc_io, 0, priv->mc_token,
42284229
DPNI_QUEUE_TX, &priv->tx_qdid);
42294230
if (err) {
42304231
dev_err(dev, "dpni_get_qdid() failed\n");
4231-
return err;
4232+
goto out;
42324233
}
42334234

42344235
return 0;
4236+
4237+
out:
4238+
while (i--) {
4239+
if (priv->fq[i].type == DPAA2_RX_FQ &&
4240+
xdp_rxq_info_is_reg(&priv->fq[i].channel->xdp_rxq))
4241+
xdp_rxq_info_unreg(&priv->fq[i].channel->xdp_rxq);
4242+
}
4243+
return err;
42354244
}
42364245

42374246
/* Allocate rings for storing incoming frame descriptors */
@@ -4588,6 +4597,17 @@ static void dpaa2_eth_del_ch_napi(struct dpaa2_eth_priv *priv)
45884597
}
45894598
}
45904599

4600+
static void dpaa2_eth_free_rx_xdp_rxq(struct dpaa2_eth_priv *priv)
4601+
{
4602+
int i;
4603+
4604+
for (i = 0; i < priv->num_fqs; i++) {
4605+
if (priv->fq[i].type == DPAA2_RX_FQ &&
4606+
xdp_rxq_info_is_reg(&priv->fq[i].channel->xdp_rxq))
4607+
xdp_rxq_info_unreg(&priv->fq[i].channel->xdp_rxq);
4608+
}
4609+
}
4610+
45914611
static int dpaa2_eth_probe(struct fsl_mc_device *dpni_dev)
45924612
{
45934613
struct device *dev;
@@ -4786,6 +4806,7 @@ static int dpaa2_eth_probe(struct fsl_mc_device *dpni_dev)
47864806
free_percpu(priv->percpu_stats);
47874807
err_alloc_percpu_stats:
47884808
dpaa2_eth_del_ch_napi(priv);
4809+
dpaa2_eth_free_rx_xdp_rxq(priv);
47894810
err_bind:
47904811
dpaa2_eth_free_dpbp(priv);
47914812
err_dpbp_setup:
@@ -4840,6 +4861,7 @@ static int dpaa2_eth_remove(struct fsl_mc_device *ls_dev)
48404861
free_percpu(priv->percpu_extras);
48414862

48424863
dpaa2_eth_del_ch_napi(priv);
4864+
dpaa2_eth_free_rx_xdp_rxq(priv);
48434865
dpaa2_eth_free_dpbp(priv);
48444866
dpaa2_eth_free_dpio(priv);
48454867
dpaa2_eth_free_dpni(priv);

0 commit comments

Comments
 (0)