Thread (2 messages) flat view 2 messages, 2 authors, 6d ago

Re: [PATCH net-next] net/ionic: avoid OOB TX partner lookup for hwstamp RXQ

From: Dave Kleikamp <hidden>
Date: 2026-08-12 15:16:58
Also in: lkml

On 8/12/26 6:52AM, Anand Khoje wrote:
The dedicated hardware timestamp RX queue is allocated with q->index
equal to lif->ionic->nrxqs_per_lif. The normal txqcqs array only
contains the regular queue pairs, so using that index to set rxq->partner
can read one entry past txqcqs[] and then write through the derived
pointer.
Only link RX/TX partners for normal queue-pair indexes. Leave the hwstamp
RX queue unpaired, and make the XDP_TX path abort cleanly if an RX queue
has no TX partner.

Fixes: e1615dda41144 ("net/ethernet/pensando: Add out-of-tree network drivers")
The above commit is local to UEK. It needs to either be removed or 
replaced with the relevant mainline commit.
quoted hunk ↗ jump to hunk
Signed-off-by: Anand Khoje <redacted>
Reviewed-by: Si-Wei Liu <redacted>
---
  drivers/net/ethernet/pensando/ionic/ionic_lif.c  | 14 ++++++++++++++
  drivers/net/ethernet/pensando/ionic/ionic_txrx.c |  7 ++++++-
  2 files changed, 20 insertions(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_lif.c b/drivers/net/ethernet/pensando/ionic/ionic_lif.c
index fd3ee9820531..1822361e1070 100644
--- a/drivers/net/ethernet/pensando/ionic/ionic_lif.c
+++ b/drivers/net/ethernet/pensando/ionic/ionic_lif.c
@@ -920,9 +920,23 @@ static int ionic_lif_rxq_init(struct ionic_lif *lif, struct ionic_qcq *qcq)
  	};
  	int err;
  
+	q->partner = NULL;
+
+	/* Only normal RX queues have matching TX queue partners,
+	 * skip partner pairing for hwstamp RX queue.
+	 */
+	if (q->index >= lif->nxqs)
+		goto skip_partner;
+
+	if (WARN_ON_ONCE(!lif->txqcqs ||
+	    q->index >= lif->ionic->ntxqs_per_lif ||
+	    !lif->txqcqs[q->index]))
+		return -EINVAL;
+
  	q->partner = &lif->txqcqs[q->index]->q;
  	q->partner->partner = q;
  
+skip_partner:
  	if (!lif->xdp_prog ||
  	    (lif->xdp_prog->aux && lif->xdp_prog->aux->xdp_has_frags))
  		ctx.cmd.q_init.flags |= cpu_to_le16(IONIC_QINIT_F_SG);
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_txrx.c b/drivers/net/ethernet/pensando/ionic/ionic_txrx.c
index 301ebee2fdc5..73998d61593a 100644
--- a/drivers/net/ethernet/pensando/ionic/ionic_txrx.c
+++ b/drivers/net/ethernet/pensando/ionic/ionic_txrx.c
@@ -545,13 +545,18 @@ static bool ionic_run_xdp(struct ionic_rx_stats *stats,
  		break;
  
  	case XDP_TX:
+		txq = rxq->partner;
+		if (unlikely(!txq)) {
+			err = -EIO;
+			break;
+		}
+
  		xdpf = xdp_convert_buff_to_frame(&xdp_buf);
  		if (!xdpf) {
  			err = -ENOSPC;
  			break;
  		}
  
-		txq = rxq->partner;
  		nq = netdev_get_tx_queue(netdev, txq->index);
  		__netif_tx_lock(nq, smp_processor_id());
  		txq_trans_cond_update(nq);
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help