linux/drivers/net/ethernet/intel/i40evf
Jacob Keller be664cbefc i40e/i40evf: spread CPU affinity hints across online CPUs only
Currently, when setting up the IRQ for a q_vector, we set an affinity
hint based on the v_idx of that q_vector. Meaning a loop iterates on
v_idx, which is an incremental value, and the cpumask is created based
on this value.

This is a problem in systems with multiple logical CPUs per core (like in
simultaneous multithreading (SMT) scenarios). If we disable some logical
CPUs, by turning SMT off for example, we will end up with a sparse
cpu_online_mask, i.e., only the first CPU in a core is online, and
incremental filling in q_vector cpumask might lead to multiple offline
CPUs being assigned to q_vectors.

Example: if we have a system with 8 cores each one containing 8 logical
CPUs (SMT == 8 in this case), we have 64 CPUs in total. But if SMT is
disabled, only the 1st CPU in each core remains online, so the
cpu_online_mask in this case would have only 8 bits set, in a sparse way.

In general case, when SMT is off the cpu_online_mask has only C bits set:
0, 1*N, 2*N, ..., C*(N-1)  where
C == # of cores;
N == # of logical CPUs per core.
In our example, only bits 0, 8, 16, 24, 32, 40, 48, 56 would be set.

Instead, we should only assign hints for CPUs which are online. Even
better, the kernel already provides a function, cpumask_local_spread()
which takes an index and returns a CPU, spreading the interrupts across
local NUMA nodes first, and then remote ones if necessary.

Since we generally have a 1:1 mapping between vectors and CPUs, there
is no real advantage to spreading vectors to local CPUs first. In order
to avoid mismatch of the default XPS hints, we'll pass -1 so that it
spreads across all CPUs without regard to the node locality.

Note that we don't need to change the q_vector->affinity_mask as this is
initialized to cpu_possible_mask, until an actual affinity is set and
then notified back to us.

Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
2017-10-06 08:11:31 -07:00
..
i40e_adminq_cmd.h i40e: Stop dropping 802.1ad tags - eth proto 0x88a8 2017-10-02 12:46:36 -07:00
i40e_adminq.c i40e: reduce wait time for adminq command completion 2017-04-19 17:38:25 -07:00
i40e_adminq.h i40e: reduce wait time for adminq command completion 2017-04-19 17:38:25 -07:00
i40e_alloc.h
i40e_common.c i40e: Add support for 'ethtool -m' 2017-10-02 12:46:35 -07:00
i40e_devids.h i40evf: Add support for Adaptive Virtual Function 2017-06-01 14:30:02 -07:00
i40e_hmc.h
i40e_lan_hmc.h
i40e_osdep.h i40evf: remove unnecessary __packed 2017-07-26 03:25:21 -07:00
i40e_prototype.h i40e: Add support for 'ethtool -m' 2017-10-02 12:46:35 -07:00
i40e_register.h
i40e_status.h
i40e_trace.h i40e/i40evf: Add tracepoints 2017-04-19 16:47:31 -07:00
i40e_txrx.c i40e/i40evf: rename bytes_per_int to bytes_per_usec 2017-09-29 12:50:58 -07:00
i40e_txrx.h i40e/i40evf: avoid dynamic ITR updates when polling or low packet rate 2017-08-27 16:15:24 -07:00
i40e_type.h i40e: Stop dropping 802.1ad tags - eth proto 0x88a8 2017-10-02 12:46:36 -07:00
i40evf_client.c virtchnl: rename i40e to generic virtchnl 2017-06-01 14:08:53 -07:00
i40evf_client.h i40evf: add client interface 2017-03-15 01:31:38 -07:00
i40evf_ethtool.c i40evf: Enable VF to request an alternate queue allocation 2017-10-02 12:46:35 -07:00
i40evf_main.c i40e/i40evf: spread CPU affinity hints across online CPUs only 2017-10-06 08:11:31 -07:00
i40evf_virtchnl.c i40evf: Enable VF to request an alternate queue allocation 2017-10-02 12:46:35 -07:00
i40evf.h i40evf: Enable VF to request an alternate queue allocation 2017-10-02 12:46:35 -07:00
Makefile i40e/i40evf: Add tracepoints 2017-04-19 16:47:31 -07:00