zoukankan      html  css  js  c++  java
  • 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的

  • 相关阅读:
    SQL 启动服务方法
    SQL 2012 连接失败
    数据库 基本操作有哪些
    windows 计算机 管理 命令
    windows下编译使用NDK,调用SO文件
    windows 注册表命令
    spring @Transactional 声明式事务
    Set List Map
    bean 的各个属性
    util:
  • 原文地址:https://www.cnblogs.com/aspirs/p/15650752.html
Copyright © 2011-2022 走看看