• Huacai Chen's avatar
    LoongArch: Always enumerate MADT and setup logical-physical CPU mapping · 12d3b559
    Huacai Chen authored
    Some drivers want to use cpu_logical_map(), early_cpu_to_node() and some
    other CPU mapping APIs, even if we use "nr_cpus=1" to hard limit the CPU
    number. This is strongly required for the multi-bridges machines.
    
    Currently, we stop parsing the MADT if the nr_cpus limit is reached, but
    to achieve the above goal we should always enumerate the MADT table and
    setup logical-physical CPU mapping whether there is a nr_cpus limit.
    
    Rework the MADT enumeration:
    
    1. Define a flag "cpu_enumerated" to distinguish the first enumeration
       (cpu_enumerated=0) and the physical hotplug case (cpu_enumerated=1)
       for set_processor_mask().
    
    2. If cpu_enumerated=0, stop parsing only when NR_CPUS limit is reached,
       so we can setup logical-physical CPU mapping; if cpu_enumerated=1,
       stop parsing when nr_cpu_ids limit is reached, so we can avoid some
       runtime bugs. Once logical-physical CPU mapping is setup, we will let
       cpu_enumerated=1.
    
    3. Use find_first_zero_bit() instead of cpumask_next_zero() to find the
       next zero bit (free logical CPU id) in the cpu_present_mask, because
       cpumask_next_zero() will stop at nr_cpu_ids.
    
    4. Only touch cpu_possible_mask if cpu_enumerated=0, this is in order to
       avoid some potential crashes, because cpu_possible_mask is marked as
       __ro_after_init.
    
    5. In prefill_possible_map(), clear cpu_present_mask bits greater than
       nr_cpu_ids, in order to avoid a CPU be "present" but not "possible".
    Signed-off-by: default avatarHuacai Chen <chenhuacai@loongson.cn>
    12d3b559
setup.c 14.7 KB