我启动我的内核
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();
如何在特定的核心上运行这个工作队列线程(如果可能的话,是孤立的)?
发布于 2017-03-29 08:17:37
在主线内核中已经有一个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.
https://stackoverflow.com/questions/43082310
复制相似问题