• Rusty Russell's avatar
    cpumask_set_cpu_local_first => cpumask_local_spread, lament · 706470a2
    Rusty Russell authored
    commit f36963c9 upstream.
    
    da91309e (cpumask: Utility function to set n'th cpu...) created a
    genuinely weird function.  I never saw it before, it went through DaveM.
    (He only does this to make us other maintainers feel better about our own
    mistakes.)
    
    cpumask_set_cpu_local_first's purpose is say "I need to spread things
    across N online cpus, choose the ones on this numa node first"; you call
    it in a loop.
    
    It can fail.  One of the two callers ignores this, the other aborts and
    fails the device open.
    
    It can fail in two ways: allocating the off-stack cpumask, or through a
    convoluted codepath which AFAICT can only occur if cpu_online_mask
    changes.  Which shouldn't happen, because if cpu_online_mask can change
    while you call this, it could return a now-offline cpu anyway.
    
    It contains a nonsensical test "!cpumask_of_node(numa_node)".  This was
    drawn to my attention by Geert, who said this causes a warning on Sparc.
    It sets a single bit in a cpumask instead of returning a cpu number,
    because that's what the callers want.
    
    It could be made more efficient by passing the previous cpu rather than
    an index, but that would be more invasive to the callers.
    
    [backporting for 3.18: only two callers exist, otherwise no change.
     The same warning shows up for "!cpumask_of_node()", and I thought
     about just addressing the warning, but using the whole fix seemed
     better in the end as one of the two callers also lacks the error
     handling]
    
    Fixes: da91309e
    Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> (then rebased)
    Tested-by: default avatarAmir Vadai <amirv@mellanox.com>
    Acked-by: default avatarAmir Vadai <amirv@mellanox.com>
    Acked-by: default avatarDavid S. Miller <davem@davemloft.net>
    Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    706470a2
en_netdev.c 70.3 KB