On Mon, Sep 16, 2024 at 03:51:02PM -0500, Wei Huang wrote: > From: Manoj Panicker <manoj.panicker2@xxxxxxx> > > Implement TPH support in Broadcom BNXT device driver. The driver uses TPH > functions to retrieve and configure the device's Steering Tags when its > interrupt affinity is being changed. With appropriate firmware, we see > sustancial memory bandwidth savings and other benefits using real network > benchmarks. > > Co-developed-by: Somnath Kotur <somnath.kotur@xxxxxxxxxxxx> > Signed-off-by: Somnath Kotur <somnath.kotur@xxxxxxxxxxxx> > Co-developed-by: Wei Huang <wei.huang2@xxxxxxx> > Signed-off-by: Wei Huang <wei.huang2@xxxxxxx> > Signed-off-by: Manoj Panicker <manoj.panicker2@xxxxxxx> > Reviewed-by: Ajit Khaparde <ajit.khaparde@xxxxxxxxxxxx> > Reviewed-by: Andy Gospodarek <andrew.gospodarek@xxxxxxxxxxxx> > --- > drivers/net/ethernet/broadcom/bnxt/bnxt.c | 85 +++++++++++++++++++++++ > drivers/net/ethernet/broadcom/bnxt/bnxt.h | 7 ++ > net/core/netdev_rx_queue.c | 1 + > 3 files changed, 93 insertions(+) > > diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c ... > @@ -10865,6 +10867,63 @@ int bnxt_reserve_rings(struct bnxt *bp, bool irq_re_init) > return 0; > } > > +static void __bnxt_irq_affinity_notify(struct irq_affinity_notify *notify, > + const cpumask_t *mask) > +{ > + struct bnxt_rx_ring_info *rxr; Hi Wei Huang, A minor nit from my side: rxr is set but otherwise unused in this function. Flagged by x86_64 W=1 builds with gcc-14 and clang-18. > + struct bnxt_irq *irq; > + u16 tag; > + int err; > + > + irq = container_of(notify, struct bnxt_irq, affinity_notify); > + cpumask_copy(irq->cpu_mask, mask); > + > + if (pcie_tph_get_cpu_st(irq->bp->pdev, TPH_MEM_TYPE_VM, > + cpumask_first(irq->cpu_mask), &tag)) > + return; > + > + if (pcie_tph_set_st_entry(irq->bp->pdev, irq->msix_nr, tag)) > + return; > + > + if (netif_running(irq->bp->dev)) { > + rxr = &irq->bp->rx_ring[irq->ring_nr]; > + rtnl_lock(); > + err = netdev_rx_queue_restart(irq->bp->dev, irq->ring_nr); > + if (err) > + netdev_err(irq->bp->dev, > + "rx queue restart failed: err=%d\n", err); > + rtnl_unlock(); > + } > +} ...