3

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 cpu でのみ関数を実行し、printk ステートメントで示されているように、次のようになることです。

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

on_each_cpu を呼び出すと、4 つのうち 1 つだけがオンラインになります。私の質問は、CPU を強制的にオンラインにする方法、または特定の CPU に強制的にコードを実行させる方法です。ありがとう

4

1 に答える 1