cpumask

cpumask

 

struct cpumask __cpu_possible_mask

struct cpumask __cpu_possible_mask在一个4core的SOC上面低4bit分别表示cpu0-cpu3,表示一个系统上配置了多少个cpu(core),不管它的状态是active还是inactive的,其它数量的cpu core类似

4.19/arch/arm64/kernel/smp.c

void __init smp_init_cpus(void)
{
    int i;

    if (acpi_disabled)
        of_parse_and_init_cpus();
    else
        acpi_parse_and_init_cpus();

    if (cpu_count > nr_cpu_ids)
        pr_warn("Number of cores (%d) exceeds configured maximum of %u - clipping\n",
            cpu_count, nr_cpu_ids);

    if (!bootcpu_valid) {
        pr_err("missing boot CPU MPIDR, not enabling secondaries\n");
        return;
    }

    /*
     * We need to set the cpu_logical_map entries before enabling
     * the cpus so that cpu processor description entries (DT cpu nodes
     * and ACPI MADT entries) can be retrieved by matching the cpu hwid
     * with entries in cpu_logical_map while initializing the cpus.
     * If the cpu set-up fails, invalidate the cpu_logical_map entry.
     */
    for (i = 1; i < nr_cpu_ids; i++) {
        if (cpu_logical_map(i) != INVALID_HWID) {
            if (smp_cpu_setup(i))
                cpu_logical_map(i) = INVALID_HWID;
        }
    }
}

 

 

4.19/arch/arm64/kernel/smp.c

static void __init of_parse_and_init_cpus(void)
{
    struct device_node *dn;

    for_each_node_by_type(dn, "cpu") {
        u64 hwid = of_get_cpu_mpidr(dn);

        if (hwid == INVALID_HWID)
            goto next;

        if (is_mpidr_duplicate(cpu_count, hwid)) {
            pr_err("%pOF: duplicate cpu reg properties in the DT\n",
                dn);
            goto next;
        }

        /*
         * The numbering scheme requires that the boot CPU
         * must be assigned logical id 0. Record it so that
         * the logical map built from DT is validated and can
         * be used.
         */
        if (hwid == cpu_logical_map(0)) {
            if (bootcpu_valid) {
                pr_err("%pOF: duplicate boot cpu reg property in DT\n",
                    dn);
                goto next;
            }

            bootcpu_valid = true;
            early_map_cpu_to_node(0, of_node_to_nid(dn));

            /*
             * cpu_logical_map has already been
             * initialized and the boot cpu doesn't need
             * the enable-method so continue without
             * incrementing cpu.
             */
            continue;
        }

        if (cpu_count >= NR_CPUS)
            goto next;

        pr_debug("cpu logical map 0x%llx\n", hwid);
        cpu_logical_map(cpu_count) = hwid;

        early_map_cpu_to_node(cpu_count, of_node_to_nid(dn));
next:
        cpu_count++;
    }
}

 

上面的hwid即是cpu id,比如一个SOC有4个core,这4个core的hw id依次为0、1、2、4,这个hwid是在dts文件里配置(cpu node里的reg成员)

 

include/linux/cpumask.h

set_cpu_possible(unsigned int cpu, bool possible)
{
    if (possible)
        cpumask_set_cpu(cpu, &__cpu_possible_mask);
    else
        cpumask_clear_cpu(cpu, &__cpu_possible_mask);
}

上面是设置cpu1-cpu3的__cpu_possible_mask bit,cpu0(boot cpu)的这个bit是在如下函数里设置的:

4.19/kernel/cpu.c

void __init boot_cpu_init(void)
{
    int cpu = smp_processor_id();

    /* Mark the boot cpu "present", "online" etc for SMP and UP case */
    set_cpu_online(cpu, true);
    set_cpu_active(cpu, true);
    set_cpu_present(cpu, true);
    set_cpu_possible(cpu, true);

#ifdef CONFIG_SMP
    __boot_cpu_id = cpu;
#endif
}

 

 

所以struct cpumask __cpu_possible_mask在一个4core的SOC上面低4bit分别表示cpu0-cpu3,表示一个系统上配置了多少个cpu(core),不管它的状态是active还是inactive的

 

posted @ 2021-12-06 17:09  aspirs  阅读(359)  评论(0编辑  收藏  举报