首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在独立的cpu核心上运行内核线程。

在独立的cpu核心上运行内核线程。
EN

Stack Overflow用户
提问于 2017-03-29 00:40:30
回答 1查看 1.1K关注 0票数 2

我启动我的内核

代码语言:javascript
运行
复制
with isolcpus=3-7

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

基于这个idea,我做:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
static void my_work(struct work_struct *w) {
    printk("CPU is: %d\n", get_cpu());
    put_cpu();

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-29 08:17:37

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

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

代码语言:javascript
运行
复制
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。所以你得试试下面的一条:

代码语言:javascript
运行
复制
schedule_work_on(cpu_nr, &ctx->work);  //cpu_nr will the CPU no to be used.
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43082310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档