Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'bnxt_en-msix-improvements'

Michael Chan says:

====================
bnxt_en: MSIX improvements

This patchset makes some improvements related to MSIX. The first
patch adjusts the default MSIX vectors assigned for RoCE. On the
PF, the number of MSIX is increased to 64 from the current 9. The
second patch allocates additional MSIX vectors ahead of time when
changing ethtool channels if dynamic MSIX is supported. The 3rd
patch makes sure that the IRQ name is not truncated.
====================

Link: https://patch.msgid.link/20240909202737.93852-1-michael.chan@broadcom.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+42 -13
+18 -1
drivers/net/ethernet/broadcom/bnxt/bnxt.c
··· 13803 13803 int max_rx, max_tx, max_cp, tx_sets = 1, tx_cp; 13804 13804 struct bnxt_hw_rings hwr = {0}; 13805 13805 int rx_rings = rx; 13806 + int rc; 13806 13807 13807 13808 if (tcs) 13808 13809 tx_sets = tcs; ··· 13836 13835 } 13837 13836 if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) 13838 13837 hwr.cp_p5 = hwr.tx + rx; 13839 - return bnxt_hwrm_check_rings(bp, &hwr); 13838 + rc = bnxt_hwrm_check_rings(bp, &hwr); 13839 + if (!rc && pci_msix_can_alloc_dyn(bp->pdev)) { 13840 + if (!bnxt_ulp_registered(bp->edev)) { 13841 + hwr.cp += bnxt_get_ulp_msix_num(bp); 13842 + hwr.cp = min_t(int, hwr.cp, bnxt_get_max_func_irqs(bp)); 13843 + } 13844 + if (hwr.cp > bp->total_irqs) { 13845 + int total_msix = bnxt_change_msix(bp, hwr.cp); 13846 + 13847 + if (total_msix < hwr.cp) { 13848 + netdev_warn(bp->dev, "Unable to allocate %d MSIX vectors, maximum available %d\n", 13849 + hwr.cp, total_msix); 13850 + rc = -ENOSPC; 13851 + } 13852 + } 13853 + } 13854 + return rc; 13840 13855 } 13841 13856 13842 13857 static void bnxt_unmap_bars(struct bnxt *bp, struct pci_dev *pdev)
+4 -1
drivers/net/ethernet/broadcom/bnxt/bnxt.h
··· 1217 1217 bool in_reset; 1218 1218 }; 1219 1219 1220 + /* "TxRx", 2 hypens, plus maximum integer */ 1221 + #define BNXT_IRQ_NAME_EXTRA 17 1222 + 1220 1223 struct bnxt_irq { 1221 1224 irq_handler_t handler; 1222 1225 unsigned int vector; 1223 1226 u8 requested:1; 1224 1227 u8 have_cpumask:1; 1225 - char name[IFNAMSIZ + 2]; 1228 + char name[IFNAMSIZ + BNXT_IRQ_NAME_EXTRA]; 1226 1229 cpumask_var_t cpu_mask; 1227 1230 }; 1228 1231
+6 -5
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
··· 955 955 } 956 956 tx_xdp = req_rx_rings; 957 957 } 958 - rc = bnxt_check_rings(bp, req_tx_rings, req_rx_rings, sh, tcs, tx_xdp); 959 - if (rc) { 960 - netdev_warn(dev, "Unable to allocate the requested rings\n"); 961 - return rc; 962 - } 963 958 964 959 if (bnxt_get_nr_rss_ctxs(bp, req_rx_rings) != 965 960 bnxt_get_nr_rss_ctxs(bp, bp->rx_nr_rings) && 966 961 netif_is_rxfh_configured(dev)) { 967 962 netdev_warn(dev, "RSS table size change required, RSS table entries must be default to proceed\n"); 968 963 return -EINVAL; 964 + } 965 + 966 + rc = bnxt_check_rings(bp, req_tx_rings, req_rx_rings, sh, tcs, tx_xdp); 967 + if (rc) { 968 + netdev_warn(dev, "Unable to allocate the requested rings\n"); 969 + return rc; 969 970 } 970 971 971 972 if (netif_running(dev)) {
+10 -4
drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c
··· 176 176 177 177 static int bnxt_set_dflt_ulp_msix(struct bnxt *bp) 178 178 { 179 - u32 roce_msix = BNXT_VF(bp) ? 180 - BNXT_MAX_VF_ROCE_MSIX : BNXT_MAX_ROCE_MSIX; 179 + int roce_msix = BNXT_MAX_ROCE_MSIX; 181 180 182 - return ((bp->flags & BNXT_FLAG_ROCE_CAP) ? 183 - min_t(u32, roce_msix, num_online_cpus()) : 0); 181 + if (BNXT_VF(bp)) 182 + roce_msix = BNXT_MAX_ROCE_MSIX_VF; 183 + else if (bp->port_partition_type) 184 + roce_msix = BNXT_MAX_ROCE_MSIX_NPAR_PF; 185 + 186 + /* NQ MSIX vectors should match the number of CPUs plus 1 more for 187 + * the CREQ MSIX, up to the default. 188 + */ 189 + return min_t(int, roce_msix, num_online_cpus() + 1); 184 190 } 185 191 186 192 int bnxt_send_msg(struct bnxt_en_dev *edev,
+4 -2
drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h
··· 15 15 16 16 #define BNXT_MIN_ROCE_CP_RINGS 2 17 17 #define BNXT_MIN_ROCE_STAT_CTXS 1 18 - #define BNXT_MAX_ROCE_MSIX 9 19 - #define BNXT_MAX_VF_ROCE_MSIX 2 18 + 19 + #define BNXT_MAX_ROCE_MSIX_VF 2 20 + #define BNXT_MAX_ROCE_MSIX_NPAR_PF 5 21 + #define BNXT_MAX_ROCE_MSIX 64 20 22 21 23 struct hwrm_async_event_cmpl; 22 24 struct bnxt;