multithreading - 在隔离的 cpu 核心上运行内核线程

标签 multithreading linux-kernel kernel

我启动我的内核

with isolcpus=3-7

我想在其中一个独立的 CPU 核心上运行一个线程。

基于此idea ,我愿意:

ctx->workq = create_singlethread_workqueue("my_work");
struct workqueue_attrs *attr = alloc_workqueue_attrs(GFP_KERNEL);
alloc_cpumask_var(&attr->cpumask, GFP_KERNEL);
cpumask_clear(attr->cpumask);
cpumask_set_cpu(5, attr->cpumask);
apply_workqueue_attrs(ctx->workq, attr);
INIT_WORK(&ctx->work, my_work);

但是它不起作用。以下代码报告 0:

static void my_work(struct work_struct *w) {
    printk("CPU is: %d\n", get_cpu());
    put_cpu();

如何在特定核心(如果可能的话是独立核心)上运行此工作队列线程?

最佳答案

主线内核中已经有一个 API schedule_work_on,您可以使用它在特定内核上运行工作队列线程。

几年前,我出于相同的目的使用了相同的 API。 查看示例代码。

static void
 myworkmod_work_handler(struct work_struct *w)
{
    printk(KERN_ERR "CPU is: %d\n", get_cpu());
    pr_info("work %u jiffies\n", (unsigned)onesec);
    put_cpu();
 }


 static int myworkmod_init(void)
 {
    onesec = msecs_to_jiffies(1000);
    pr_info("module loaded: %u jiffies\n", (unsigned)onesec);

    if (!wq)
            wq = create_singlethread_workqueue("myworkmod");
    if (wq)
            queue_delayed_work_on(2,wq, &myworkmod_work, onesec); //2 CPU no

    return 0;
  }

就您的情况而言,我认为您正在使用 schedule_work API,它始终保留默认的 CPU 编号。这就是您获得CPU 0 的原因。所以你必须尝试以下一个:

schedule_work_on(cpu_nr, &ctx->work);  //cpu_nr will the CPU no to be used.

关于multithreading - 在隔离的 cpu 核心上运行内核线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43082310/

相关文章:

c - 运行时可加载内核模块如何知道核心内核函数的地址?

C++:bool 是 1 位变量吗?

Linux内核结构文件指针

java - 线程代码演练,Thread.Sleep() 的机制

Android 服务和线程

java - 使用 AtomicReference 带有参数的单例

linux-kernel - Linux伪目录触发错误 "no such file or directory"

c - 整个一个核心专用于单个进程

c - 使用线程的单词总和

linux - udevadm 与 linux 热插拔