Commit 668e4239 authored by Shannon Nelson's avatar Shannon Nelson Committed by Jakub Kicinski
Browse files

ionic: always use rxq_info



Instead of setting up and tearing down the rxq_info only when the XDP
program is loaded or unloaded, we will build the rxq_info whether or not
XDP is in use.  This is the more common use pattern and better supports
future conversion to page_pool.  Since the rxq_info wants the napi_id
we re-order things slightly to tie this into the queue init and deinit
functions where we do the add and delete of napi.

Signed-off-by: default avatarShannon Nelson <shannon.nelson@amd.com>
Signed-off-by: default avatarBrett Creeley <brett.creeley@amd.com>
Link: https://patch.msgid.link/20240906232623.39651-5-brett.creeley@amd.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 7b4ec51f
Loading
Loading
Loading
Loading
+15 −36
Original line number Diff line number Diff line
@@ -46,8 +46,9 @@ static int ionic_start_queues(struct ionic_lif *lif);
static void ionic_stop_queues(struct ionic_lif *lif);
static void ionic_lif_queue_identify(struct ionic_lif *lif);

static int ionic_xdp_rxqs_update(struct ionic_lif *lif);
static void ionic_xdp_unregister_rxq_info(struct ionic_queue *q);
static void ionic_xdp_rxqs_prog_update(struct ionic_lif *lif);
static void ionic_unregister_rxq_info(struct ionic_queue *q);
static int ionic_register_rxq_info(struct ionic_queue *q, unsigned int napi_id);

static void ionic_dim_work(struct work_struct *work)
{
@@ -380,6 +381,7 @@ static void ionic_lif_qcq_deinit(struct ionic_lif *lif, struct ionic_qcq *qcq)
	if (!(qcq->flags & IONIC_QCQ_F_INITED))
		return;

	ionic_unregister_rxq_info(&qcq->q);
	if (qcq->flags & IONIC_QCQ_F_INTR) {
		ionic_intr_mask(idev->intr_ctrl, qcq->intr.index,
				IONIC_INTR_MASK_SET);
@@ -437,9 +439,7 @@ static void ionic_qcq_free(struct ionic_lif *lif, struct ionic_qcq *qcq)
		qcq->sg_base_pa = 0;
	}

	ionic_xdp_unregister_rxq_info(&qcq->q);
	ionic_qcq_intr_free(lif, qcq);

	vfree(qcq->q.info);
	qcq->q.info = NULL;
}
@@ -925,6 +925,11 @@ static int ionic_lif_rxq_init(struct ionic_lif *lif, struct ionic_qcq *qcq)
		netif_napi_add(lif->netdev, &qcq->napi, ionic_rx_napi);
	else
		netif_napi_add(lif->netdev, &qcq->napi, ionic_txrx_napi);
	err = ionic_register_rxq_info(q, qcq->napi.napi_id);
	if (err) {
		netif_napi_del(&qcq->napi);
		return err;
	}

	qcq->flags |= IONIC_QCQ_F_INITED;

@@ -2143,9 +2148,7 @@ static int ionic_txrx_enable(struct ionic_lif *lif)
	int derr = 0;
	int i, err;

	err = ionic_xdp_rxqs_update(lif);
	if (err)
		return err;
	ionic_xdp_rxqs_prog_update(lif);

	for (i = 0; i < lif->nxqs; i++) {
		if (!(lif->rxqcqs[i] && lif->txqcqs[i])) {
@@ -2192,7 +2195,7 @@ static int ionic_txrx_enable(struct ionic_lif *lif)
		derr = ionic_qcq_disable(lif, lif->rxqcqs[i], derr);
	}

	ionic_xdp_rxqs_update(lif);
	ionic_xdp_rxqs_prog_update(lif);

	return err;
}
@@ -2651,7 +2654,7 @@ static void ionic_vf_attr_replay(struct ionic_lif *lif)
	ionic_vf_start(ionic);
}

static void ionic_xdp_unregister_rxq_info(struct ionic_queue *q)
static void ionic_unregister_rxq_info(struct ionic_queue *q)
{
	struct xdp_rxq_info *xi;

@@ -2665,7 +2668,7 @@ static void ionic_xdp_unregister_rxq_info(struct ionic_queue *q)
	kfree(xi);
}

static int ionic_xdp_register_rxq_info(struct ionic_queue *q, unsigned int napi_id)
static int ionic_register_rxq_info(struct ionic_queue *q, unsigned int napi_id)
{
	struct xdp_rxq_info *rxq_info;
	int err;
@@ -2698,44 +2701,20 @@ static int ionic_xdp_register_rxq_info(struct ionic_queue *q, unsigned int napi_
	return err;
}

static int ionic_xdp_rxqs_update(struct ionic_lif *lif)
static void ionic_xdp_rxqs_prog_update(struct ionic_lif *lif)
{
	struct bpf_prog *xdp_prog;
	unsigned int i;
	int err;

	if (!lif->rxqcqs)
		return 0;
		return;

	xdp_prog = READ_ONCE(lif->xdp_prog);
	for (i = 0; i < lif->ionic->nrxqs_per_lif && lif->rxqcqs[i]; i++) {
		struct ionic_queue *q = &lif->rxqcqs[i]->q;

		if (q->xdp_prog) {
			ionic_xdp_unregister_rxq_info(q);
			q->xdp_prog = NULL;
		}

		if (xdp_prog) {
			unsigned int napi_id = lif->rxqcqs[i]->napi.napi_id;

			err = ionic_xdp_register_rxq_info(q, napi_id);
			if (err) {
				dev_err(lif->ionic->dev, "failed to register RX queue %d info for XDP, err %d\n",
					i, err);
				goto err_out;
			}
		}
		q->xdp_prog = xdp_prog;
	}

	return 0;

err_out:
	for (i = 0; i < lif->ionic->nrxqs_per_lif && lif->rxqcqs[i]; i++)
		ionic_xdp_unregister_rxq_info(&lif->rxqcqs[i]->q);

	return err;
}

static int ionic_xdp_config(struct net_device *netdev, struct netdev_bpf *bpf)