• Nick Child's avatar
    ibmvnic: Toggle between queue types in affinity mapping · 68315829
    Nick Child authored
    Previously, ibmvnic IRQs were assigned to CPU numbers by assigning all
    the IRQs for transmit queues then assigning all the IRQs for receive
    queues. With multi-threaded processors, in a heavy RX or TX environment,
    physical cores would either be overloaded or underutilized (due to the
    IRQ assignment algorithm). This approach is sub-optimal because IRQs for
    the same subprocess (RX or TX) would be bound to adjacent CPU numbers,
    meaning they were more likely to be contending for the same core.
    
    For example, in a system with 64 CPU's and 32 queues, the IRQs would
    be bound to CPU in the following pattern:
    
    IRQ type |  CPU number
    -----------------------
    TX0	 |	0-1
    TX1	 |	2-3
    <etc>
    RX0	 |	32-33
    RX1	 |	34-35
    <etc>
    
    Observe that in SMT-8, the first 4 tx queues would be sharing the
    same core.
    
    A more optimal algorithm would balance the number RX and TX IRQ's across
    the physical cores. Therefore, to increase performance, distribute RX and
    TX IRQs across cores by alternating between assigning IRQs for RX and TX
    queues to CPUs.
    With a system with 64 CPUs and 32 queues, this results in the following
    pattern:
    
    IRQ type |  CPU number
    -----------------------
    TX0	 |	0-1
    RX0	 |	2-3
    TX1	 |	4-5
    RX1	 |	6-7
    <etc>
    
    Observe that in SMT-8, there is equal distribution of RX and TX IRQs
    per core. In the above case, each core handles 2 TX and 2 RX IRQ's.
    Signed-off-by: default avatarNick Child <nnac123@linux.ibm.com>
    Reviewed-by: default avatarHaren Myneni <haren@linux.ibm.com>
    Link: https://lore.kernel.org/r/20230127214358.318152-1-nnac123@linux.ibm.comSigned-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
    68315829
ibmvnic.c 179 KB