• Sabrina Dubroca's avatar
    net: fix XPS static_key accounting · 867d0ad4
    Sabrina Dubroca authored
    Commit 04157469 ("net: Use static_key for XPS maps") introduced a
    static key for XPS, but the increments/decrements don't match.
    
    First, the static key's counter is incremented once for each queue, but
    only decremented once for a whole batch of queues, leading to large
    unbalances.
    
    Second, the xps_rxqs_needed key is decremented whenever we reset a batch
    of queues, whether they had any rxqs mapping or not, so that if we setup
    cpu-XPS on em1 and RXQS-XPS on em2, resetting the queues on em1 would
    decrement the xps_rxqs_needed key.
    
    This reworks the accounting scheme so that the xps_needed key is
    incremented only once for each type of XPS for all the queues on a
    device, and the xps_rxqs_needed key is incremented only once for all
    queues. This is sufficient to let us retrieve queues via
    get_xps_queue().
    
    This patch introduces a new reset_xps_maps(), which reinitializes and
    frees the appropriate map (xps_rxqs_map or xps_cpus_map), and drops a
    reference to the needed keys:
     - both xps_needed and xps_rxqs_needed, in case of rxqs maps,
     - only xps_needed, in case of CPU maps.
    
    Now, we also need to call reset_xps_maps() at the end of
    __netif_set_xps_queue() when there's no active map left, for example
    when writing '00000000,00000000' to all queues' xps_rxqs setting.
    
    Fixes: 04157469 ("net: Use static_key for XPS maps")
    Signed-off-by: default avatarSabrina Dubroca <sd@queasysnail.net>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    867d0ad4
dev.c 242 KB