Add the RHEL 687.14.1..687.15.1 backports (1270-1284) from centos-stream-9 and
upstream stable, on top of 687.13.1. The dpll/zl3073x and ice RSS-queue series are
consolidated (they carry RHEL kABI wrapping and RHEL-only files). The mlx5 kabi
removal (RHEL-181822) is applied via updated Module.kabi_{aarch64,s390x,x86_64}.
Bump pkgrelease and specrelease to 687.15.1.
257 lines
8.2 KiB
Diff
257 lines
8.2 KiB
Diff
Subject: [PATCH] ice: default RSS queues series incl RHEL ice_rh (RHEL-174336/177526)
|
|
# AlmaLinux: reconstructed; includes RHEL-only ice_rh.c/.h
|
|
|
|
diff --git a/drivers/net/ethernet/intel/ice/Makefile b/drivers/net/ethernet/intel/ice/Makefile
|
|
index 0b8cf4e..3da38fc 100644
|
|
--- a/drivers/net/ethernet/intel/ice/Makefile
|
|
+++ b/drivers/net/ethernet/intel/ice/Makefile
|
|
@@ -43,7 +43,8 @@ ice-y := ice_main.o \
|
|
ice_repr.o \
|
|
ice_tc_lib.o \
|
|
ice_debugfs.o \
|
|
- ice_adapter.o
|
|
+ ice_adapter.o \
|
|
+ ice_rh.o
|
|
ice-$(CONFIG_PCI_IOV) += \
|
|
ice_sriov.o \
|
|
virt/allowlist.o \
|
|
diff --git a/drivers/net/ethernet/intel/ice/ice.h b/drivers/net/ethernet/intel/ice/ice.h
|
|
index a23ccd4..480db81 100644
|
|
--- a/drivers/net/ethernet/intel/ice/ice.h
|
|
+++ b/drivers/net/ethernet/intel/ice/ice.h
|
|
@@ -837,6 +837,28 @@ static inline void ice_tx_xsk_pool(struct ice_vsi *vsi, u16 qid)
|
|
WRITE_ONCE(ring->xsk_pool, ice_get_xp_from_qid(vsi, qid));
|
|
}
|
|
|
|
+/**
|
|
+ * ice_get_max_txq - return the maximum number of Tx queues for in a PF
|
|
+ * @pf: PF structure
|
|
+ *
|
|
+ * Return: maximum number of Tx queues
|
|
+ */
|
|
+static inline int ice_get_max_txq(struct ice_pf *pf)
|
|
+{
|
|
+ return min(num_online_cpus(), pf->hw.func_caps.common_cap.num_txq);
|
|
+}
|
|
+
|
|
+/**
|
|
+ * ice_get_max_rxq - return the maximum number of Rx queues for in a PF
|
|
+ * @pf: PF structure
|
|
+ *
|
|
+ * Return: maximum number of Rx queues
|
|
+ */
|
|
+static inline int ice_get_max_rxq(struct ice_pf *pf)
|
|
+{
|
|
+ return min(num_online_cpus(), pf->hw.func_caps.common_cap.num_rxq);
|
|
+}
|
|
+
|
|
/**
|
|
* ice_get_main_vsi - Get the PF VSI
|
|
* @pf: PF instance
|
|
diff --git a/drivers/net/ethernet/intel/ice/ice_ethtool.c b/drivers/net/ethernet/intel/ice/ice_ethtool.c
|
|
index 912d800..db6adaa 100644
|
|
--- a/drivers/net/ethernet/intel/ice/ice_ethtool.c
|
|
+++ b/drivers/net/ethernet/intel/ice/ice_ethtool.c
|
|
@@ -3744,24 +3744,6 @@ ice_get_ts_info(struct net_device *dev, struct kernel_ethtool_ts_info *info)
|
|
return 0;
|
|
}
|
|
|
|
-/**
|
|
- * ice_get_max_txq - return the maximum number of Tx queues for in a PF
|
|
- * @pf: PF structure
|
|
- */
|
|
-static int ice_get_max_txq(struct ice_pf *pf)
|
|
-{
|
|
- return min(num_online_cpus(), pf->hw.func_caps.common_cap.num_txq);
|
|
-}
|
|
-
|
|
-/**
|
|
- * ice_get_max_rxq - return the maximum number of Rx queues for in a PF
|
|
- * @pf: PF structure
|
|
- */
|
|
-static int ice_get_max_rxq(struct ice_pf *pf)
|
|
-{
|
|
- return min(num_online_cpus(), pf->hw.func_caps.common_cap.num_rxq);
|
|
-}
|
|
-
|
|
/**
|
|
* ice_get_combined_cnt - return the current number of combined channels
|
|
* @vsi: PF VSI pointer
|
|
diff --git a/drivers/net/ethernet/intel/ice/ice_irq.c b/drivers/net/ethernet/intel/ice/ice_irq.c
|
|
index 30801fd..4766951 100644
|
|
--- a/drivers/net/ethernet/intel/ice/ice_irq.c
|
|
+++ b/drivers/net/ethernet/intel/ice/ice_irq.c
|
|
@@ -4,6 +4,7 @@
|
|
#include "ice.h"
|
|
#include "ice_lib.h"
|
|
#include "ice_irq.h"
|
|
+#include "ice_rh.h"
|
|
|
|
/**
|
|
* ice_init_irq_tracker - initialize interrupt tracker
|
|
@@ -106,9 +107,10 @@ static struct ice_irq_entry *ice_get_irq_res(struct ice_pf *pf,
|
|
#define ICE_RDMA_AEQ_MSIX 1
|
|
static int ice_get_default_msix_amount(struct ice_pf *pf)
|
|
{
|
|
- return ICE_MIN_LAN_OICR_MSIX + num_online_cpus() +
|
|
+ return ICE_MIN_LAN_OICR_MSIX + ice_rh_get_num_default_rss_queues() +
|
|
(test_bit(ICE_FLAG_FD_ENA, pf->flags) ? ICE_FDIR_MSIX : 0) +
|
|
- (ice_is_rdma_ena(pf) ? num_online_cpus() + ICE_RDMA_AEQ_MSIX : 0);
|
|
+ (ice_is_rdma_ena(pf) ? ice_rh_get_num_default_rss_queues() +
|
|
+ ICE_RDMA_AEQ_MSIX : 0);
|
|
}
|
|
|
|
/**
|
|
diff --git a/drivers/net/ethernet/intel/ice/ice_lib.c b/drivers/net/ethernet/intel/ice/ice_lib.c
|
|
index d668806..72c91bd 100644
|
|
--- a/drivers/net/ethernet/intel/ice/ice_lib.c
|
|
+++ b/drivers/net/ethernet/intel/ice/ice_lib.c
|
|
@@ -9,6 +9,7 @@
|
|
#include "ice_dcb_lib.h"
|
|
#include "ice_type.h"
|
|
#include "ice_vsi_vlan_ops.h"
|
|
+#include "ice_rh.h"
|
|
|
|
/**
|
|
* ice_vsi_type_str - maps VSI type enum to string equivalents
|
|
@@ -159,12 +160,14 @@ static void ice_vsi_set_num_desc(struct ice_vsi *vsi)
|
|
|
|
static u16 ice_get_rxq_count(struct ice_pf *pf)
|
|
{
|
|
- return min(ice_get_avail_rxq_count(pf), num_online_cpus());
|
|
+ return min(ice_get_avail_rxq_count(pf),
|
|
+ ice_rh_get_num_default_rss_queues());
|
|
}
|
|
|
|
static u16 ice_get_txq_count(struct ice_pf *pf)
|
|
{
|
|
- return min(ice_get_avail_txq_count(pf), num_online_cpus());
|
|
+ return min(ice_get_avail_txq_count(pf),
|
|
+ ice_rh_get_num_default_rss_queues());
|
|
}
|
|
|
|
/**
|
|
@@ -911,13 +914,15 @@ static void ice_vsi_set_rss_params(struct ice_vsi *vsi)
|
|
if (vsi->type == ICE_VSI_CHNL)
|
|
vsi->rss_size = min_t(u16, vsi->num_rxq, max_rss_size);
|
|
else
|
|
- vsi->rss_size = min_t(u16, num_online_cpus(),
|
|
+ vsi->rss_size = min_t(u16,
|
|
+ ice_rh_get_num_default_rss_queues(),
|
|
max_rss_size);
|
|
vsi->rss_lut_type = ICE_LUT_PF;
|
|
break;
|
|
case ICE_VSI_SF:
|
|
vsi->rss_table_size = ICE_LUT_VSI_SIZE;
|
|
- vsi->rss_size = min_t(u16, num_online_cpus(), max_rss_size);
|
|
+ vsi->rss_size = min_t(u16, ice_rh_get_num_default_rss_queues(),
|
|
+ max_rss_size);
|
|
vsi->rss_lut_type = ICE_LUT_VSI;
|
|
break;
|
|
case ICE_VSI_VF:
|
|
@@ -3007,7 +3012,7 @@ ice_vsi_rebuild_set_coalesce(struct ice_vsi *vsi,
|
|
* ice_vsi_realloc_stat_arrays - Frees unused stat structures or alloc new ones
|
|
* @vsi: VSI pointer
|
|
*/
|
|
-static int
|
|
+int
|
|
ice_vsi_realloc_stat_arrays(struct ice_vsi *vsi)
|
|
{
|
|
u16 req_txq = vsi->req_txq ? vsi->req_txq : vsi->alloc_txq;
|
|
diff --git a/drivers/net/ethernet/intel/ice/ice_lib.h b/drivers/net/ethernet/intel/ice/ice_lib.h
|
|
index 2cb1eb9..fce6f63 100644
|
|
--- a/drivers/net/ethernet/intel/ice/ice_lib.h
|
|
+++ b/drivers/net/ethernet/intel/ice/ice_lib.h
|
|
@@ -66,6 +66,7 @@ int ice_ena_vsi(struct ice_vsi *vsi, bool locked);
|
|
void ice_vsi_decfg(struct ice_vsi *vsi);
|
|
void ice_dis_vsi(struct ice_vsi *vsi, bool locked);
|
|
|
|
+int ice_vsi_realloc_stat_arrays(struct ice_vsi *vsi);
|
|
int ice_vsi_rebuild(struct ice_vsi *vsi, u32 vsi_flags);
|
|
int ice_vsi_cfg(struct ice_vsi *vsi);
|
|
struct ice_vsi *ice_vsi_alloc(struct ice_pf *pf);
|
|
diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c
|
|
index 6b1e6ee..38356f6 100644
|
|
--- a/drivers/net/ethernet/intel/ice/ice_main.c
|
|
+++ b/drivers/net/ethernet/intel/ice/ice_main.c
|
|
@@ -4730,8 +4730,8 @@ static int ice_cfg_netdev(struct ice_vsi *vsi)
|
|
struct net_device *netdev;
|
|
u8 mac_addr[ETH_ALEN];
|
|
|
|
- netdev = alloc_etherdev_mqs(sizeof(*np), vsi->alloc_txq,
|
|
- vsi->alloc_rxq);
|
|
+ netdev = alloc_etherdev_mqs(sizeof(*np), ice_get_max_txq(vsi->back),
|
|
+ ice_get_max_rxq(vsi->back));
|
|
if (!netdev)
|
|
return -ENOMEM;
|
|
|
|
diff --git a/drivers/net/ethernet/intel/ice/ice_rh.c b/drivers/net/ethernet/intel/ice/ice_rh.c
|
|
new file mode 100644
|
|
index 0000000..7660eee
|
|
--- /dev/null
|
|
+++ b/drivers/net/ethernet/intel/ice/ice_rh.c
|
|
@@ -0,0 +1,33 @@
|
|
+#include <linux/cpumask.h>
|
|
+#include <linux/crash_dump.h>
|
|
+#include <linux/gfp_types.h>
|
|
+#include <linux/math.h>
|
|
+#include <linux/topology.h>
|
|
+
|
|
+#include "ice_rh.h"
|
|
+
|
|
+/**
|
|
+ * ice_rh_get_num_default_rss_queues - default number of RSS queues
|
|
+ *
|
|
+ * Default value is the number of physical cores if there are only 1 or 2, or
|
|
+ * divided by 2 if there are more.
|
|
+ *
|
|
+ * This is a renamed copy of netif_get_num_default_rss_queues() from upstream.
|
|
+ */
|
|
+int ice_rh_get_num_default_rss_queues(void)
|
|
+{
|
|
+ cpumask_var_t cpus;
|
|
+ int cpu, count = 0;
|
|
+
|
|
+ if (unlikely(is_kdump_kernel() || !zalloc_cpumask_var(&cpus, GFP_KERNEL)))
|
|
+ return 1;
|
|
+
|
|
+ cpumask_copy(cpus, cpu_online_mask);
|
|
+ for_each_cpu(cpu, cpus) {
|
|
+ ++count;
|
|
+ cpumask_andnot(cpus, cpus, topology_sibling_cpumask(cpu));
|
|
+ }
|
|
+ free_cpumask_var(cpus);
|
|
+
|
|
+ return count > 2 ? DIV_ROUND_UP(count, 2) : count;
|
|
+}
|
|
diff --git a/drivers/net/ethernet/intel/ice/ice_rh.h b/drivers/net/ethernet/intel/ice/ice_rh.h
|
|
new file mode 100644
|
|
index 0000000..d88e00a
|
|
--- /dev/null
|
|
+++ b/drivers/net/ethernet/intel/ice/ice_rh.h
|
|
@@ -0,0 +1,6 @@
|
|
+#ifndef __ICE_RH_H
|
|
+#define __ICE_RH_H
|
|
+
|
|
+int ice_rh_get_num_default_rss_queues(void);
|
|
+
|
|
+#endif
|
|
diff --git a/drivers/net/ethernet/intel/ice/ice_vf_lib.c b/drivers/net/ethernet/intel/ice/ice_vf_lib.c
|
|
index e53a1e4..08e3e26 100644
|
|
--- a/drivers/net/ethernet/intel/ice/ice_vf_lib.c
|
|
+++ b/drivers/net/ethernet/intel/ice/ice_vf_lib.c
|
|
@@ -268,6 +268,13 @@ static int ice_vf_reconfig_vsi(struct ice_vf *vf)
|
|
|
|
vsi->flags = ICE_VSI_FLAG_NO_INIT;
|
|
|
|
+ vsi->req_txq = vf->num_req_qs;
|
|
+ vsi->req_rxq = vf->num_req_qs;
|
|
+
|
|
+ err = ice_vsi_realloc_stat_arrays(vsi);
|
|
+ if (err)
|
|
+ return err;
|
|
+
|
|
ice_vsi_decfg(vsi);
|
|
ice_fltr_remove_all(vsi);
|
|
|