• Paul E. McKenney's avatar
    rcu: Handle unbalanced rcu_node configurations with few CPUs · 4dbd6bb3
    Paul E. McKenney authored
    If CONFIG_RCU_FANOUT_EXACT=y, if there are not enough CPUs (according
    to nr_cpu_ids) to require more than a single rcu_node structure, but if
    NR_CPUS is larger than would fit into a single rcu_node structure, then
    the current rcu_init_levelspread() code is subject to integer overflow
    in the eight-bit ->levelspread[] array in the rcu_state structure.
    
    In this case, the solution is -not- to increase the size of the
    elements in this array because the values in that array should be
    constrained to the number of bits in an unsigned long.  Instead, this
    commit replaces NR_CPUS with nr_cpu_ids in the rcu_init_levelspread()
    function's initialization of the cprv local variable.  This results in
    all of the arithmetic being consistently based off of the nr_cpu_ids
    value, thus avoiding the overflow, which was caused by the mixing of
    nr_cpu_ids and NR_CPUS.
    Reported-by: default avatarMike Galbraith <efault@gmx.de>
    Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
    4dbd6bb3
rcutree.c 88.9 KB