【问题标题】:How to run code on every CPU如何在每个 CPU 上运行代码
【发布时间】:2013-07-01 15:55:49
【问题描述】:

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

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

    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 只在 Online cpus 上运行该函数,如 printk 语句所示:

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

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

【问题讨论】:

  • 您应该从“多线程编程”或称为“并发”开始,具体取决于您的目标,但核心始终相同,在 Android 下,您可以使用 posix 线程库来完成所有工作低级例程,就像任何其他 GNU/Linux 发行版一样。
  • "所以我的问题是,如何强制某个cpu在线,或者如何强制某个cpu执行代码?" -- 我不知道这是可能的,因为芯片组可以并且会在它认为合适的时候关闭内核。

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


【解决方案1】:

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

实现这一目标的一种方法是使用 cpu 热插拔通知器。

【讨论】:

  • 对于任何尝试这样做的人来说,您需要知道的几乎所有内容都在这里:“kernel.org/doc/Documentation/cpu-hotplug.txt”。我必须将 init_module 的声明更改为“int __cpuinit init_module(void)”才能编译模块。
  • 埃里克,那个链接现在失效了。
  • 万一它死了,我要做的就是:#include <linux/cpu.h> static int foobar_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) { unsigned int cpu = (unsigned long)hcpu; switch (action) { case CPU_ONLINE: smp_call_function_single(cpu, &enable_registers, NULL, false) } return NOTIFY_OK; } static struct notifier_block foobar_cpu_notifier = { .notifier_call = foobar_cpu_callback, };
  • 还初始化 cpu 通知器:您需要从您的 init 函数调用 register_cpu_notifier()。初始化函数可以有两种类型: 1. 早期初始化(只有引导处理器在线时调用的初始化函数)。 2. 后期初始化(在所有 CPU 都在线后调用的初始化函数)。对于第一种情况,您应该将以下内容添加到您的初始化函数 register_cpu_notifier(&foobar_cpu_notifier);对于第二种情况,您应该将以下内容添加到您的初始化函数 register_hotcpu_notifier(&foobar_cpu_notifier);
猜你喜欢
  • 1970-01-01
  • 2016-12-19
  • 1970-01-01
  • 2020-11-21
  • 2020-07-18
  • 1970-01-01
  • 1970-01-01
  • 2015-02-25
  • 2019-01-14
相关资源
最近更新 更多