如何在每个CPU上运行代码

时间:2013-07-03 19:43:58

标签: android linux linux-kernel multicore cpu-registers

我正在尝试在运行mako内核的Nexus 4上的所有cpus上设置性能监视器用户模式启用寄存器。

现在我在可加载模块中设置寄存器:

    void enable_registers(void* info)
    {
        unsigned int set = 1;
        /* enable user-mode access to the performance counter*/
        asm volatile ("mcr p15,  0, %0, c9,  c14, 0\n\t" : : "r" (set));
    }

    int init_module(void)
    {
       online = num_online_cpus();
       possible = num_possible_cpus();
       present = num_present_cpus();
       printk (KERN_INFO "Online Cpus=%d\nPossible Cpus=%d\nPresent Cpus=%d\n", online, possible, present);
       on_each_cpu(enable_registers , NULL, 1);
       return 0;
    }

问题是on_each_cpu只运行在线cpu上的功能,如printk声明所示:

Online Cpus=1
Possible Cpus=4
Present Cpus=4

当我调用on_each_cpu时,四个中只有一个在线。所以我的问题是,如何强制cpu联机,或者如何强制某个cpu执行代码? 感谢

1 个答案:

答案 0 :(得分:3)

您不需要立即在每个cpu 上运行代码。您需要做的是安排,以便当离线cpu恢复联机时,您的代码能够执行并启用对PMU的访问。

实现这一目标的一种方法是使用cpu hotplug通知程序。