Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d7a0ecab authored by Saeed Mahameed's avatar Saeed Mahameed Committed by David S. Miller
Browse files

net/mlx5e: Re-arrange XDP SQ/CQ creation



In mlx5e_open_channel CQs must be created before napi is enabled.
Here we move the XDP CQ creation to satisfy that fact.

mlx5e_close_channel is already working according to the right order.

Fixes: b5503b99 ("net/mlx5e: XDP TX forwarding support")
Signed-off-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
Reported-by: default avatarJesper Dangaard Brouer <brouer@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 87dc0255
Loading
Loading
Loading
Loading
+15 −17
Original line number Original line Diff line number Diff line
@@ -1445,6 +1445,7 @@ static int mlx5e_open_channel(struct mlx5e_priv *priv, int ix,
	c->netdev   = priv->netdev;
	c->netdev   = priv->netdev;
	c->mkey_be  = cpu_to_be32(priv->mdev->mlx5e_res.mkey.key);
	c->mkey_be  = cpu_to_be32(priv->mdev->mlx5e_res.mkey.key);
	c->num_tc   = priv->params.num_tc;
	c->num_tc   = priv->params.num_tc;
	c->xdp      = !!priv->xdp_prog;


	if (priv->params.rx_am_enabled)
	if (priv->params.rx_am_enabled)
		rx_cq_profile = mlx5e_am_get_def_profile(priv->params.rx_cq_period_mode);
		rx_cq_profile = mlx5e_am_get_def_profile(priv->params.rx_cq_period_mode);
@@ -1468,6 +1469,12 @@ static int mlx5e_open_channel(struct mlx5e_priv *priv, int ix,
	if (err)
	if (err)
		goto err_close_tx_cqs;
		goto err_close_tx_cqs;


	/* XDP SQ CQ params are same as normal TXQ sq CQ params */
	err = c->xdp ? mlx5e_open_cq(c, &cparam->tx_cq, &c->xdp_sq.cq,
				     priv->params.tx_cq_moderation) : 0;
	if (err)
		goto err_close_rx_cq;

	napi_enable(&c->napi);
	napi_enable(&c->napi);


	err = mlx5e_open_sq(c, 0, &cparam->icosq, &c->icosq);
	err = mlx5e_open_sq(c, 0, &cparam->icosq, &c->icosq);
@@ -1488,21 +1495,10 @@ static int mlx5e_open_channel(struct mlx5e_priv *priv, int ix,
		}
		}
	}
	}


	if (priv->xdp_prog) {
	err = c->xdp ? mlx5e_open_sq(c, 0, &cparam->xdp_sq, &c->xdp_sq) : 0;
		/* XDP SQ CQ params are same as normal TXQ sq CQ params */
		err = mlx5e_open_cq(c, &cparam->tx_cq, &c->xdp_sq.cq,
				    priv->params.tx_cq_moderation);
	if (err)
	if (err)
		goto err_close_sqs;
		goto err_close_sqs;


		err = mlx5e_open_sq(c, 0, &cparam->xdp_sq, &c->xdp_sq);
		if (err) {
			mlx5e_close_cq(&c->xdp_sq.cq);
			goto err_close_sqs;
		}
	}

	c->xdp = !!priv->xdp_prog;
	err = mlx5e_open_rq(c, &cparam->rq, &c->rq);
	err = mlx5e_open_rq(c, &cparam->rq, &c->rq);
	if (err)
	if (err)
		goto err_close_xdp_sq;
		goto err_close_xdp_sq;
@@ -1512,10 +1508,8 @@ static int mlx5e_open_channel(struct mlx5e_priv *priv, int ix,


	return 0;
	return 0;
err_close_xdp_sq:
err_close_xdp_sq:
	if (priv->xdp_prog) {
	if (c->xdp)
		mlx5e_close_sq(&c->xdp_sq);
		mlx5e_close_sq(&c->xdp_sq);
		mlx5e_close_cq(&c->xdp_sq.cq);
	}


err_close_sqs:
err_close_sqs:
	mlx5e_close_sqs(c);
	mlx5e_close_sqs(c);
@@ -1525,6 +1519,10 @@ static int mlx5e_open_channel(struct mlx5e_priv *priv, int ix,


err_disable_napi:
err_disable_napi:
	napi_disable(&c->napi);
	napi_disable(&c->napi);
	if (c->xdp)
		mlx5e_close_cq(&c->xdp_sq.cq);

err_close_rx_cq:
	mlx5e_close_cq(&c->rq.cq);
	mlx5e_close_cq(&c->rq.cq);


err_close_tx_cqs:
err_close_tx_cqs: