• Guilherme G. Piccoli's avatar
    i40e: use valid online CPU on q_vector initialization · 7f6c5539
    Guilherme G. Piccoli authored
    Currently, the q_vector initialization routine sets the affinity_mask
    of a q_vector based on v_idx value. 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
    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.
    
    This patch changes the way q_vector's affinity_mask is created: it iterates
    on v_idx, but consumes the CPU index from the cpu_online_mask instead of
    just using the v_idx incremental value.
    
    No functional changes were introduced.
    Signed-off-by: default avatarGuilherme G Piccoli <gpiccoli@linux.vnet.ibm.com>
    Tested-by: default avatarAndrew Bowers <andrewx.bowers@intel.com>
    Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
    7f6c5539
i40e_main.c 319 KB