fire_vr 发表于 2015-03-05 17:30

请教个kworker的问题

我的板子是单核的A5,自己写了个模块,如果用create_singlethread_workqueue新建的队列,发work到这个队列中,再通过top命令式看到在kworker/u:0上的。
但如果用create_workqueue建立队列,再发work到这个队列中,通过top命令看占用率时,发现是在kworker/0:1上的。这么说,create_workqueue不就是相当于没有新建队列了吗?

还有,大家在debug时,如何能从kworker/u:0或者kworker/0:1快读定位到是代码哪里启动的队列呢?

多谢!

镇水铁牛 发表于 2015-03-05 19:53

create_workqueue是在每个cpu上创建一个workqueue,create_singlethread_workqueue只创建一个内核线程。
kworker是3.x内核引入的,你是如何确定你的任务是在kworker/0:1上执行的呢?

fire_vr 发表于 2015-03-06 10:35

回复 2# 镇水铁牛

create_workqueue是在每个cpu上创建一个workqueue,create_singlethread_workqueue只创建一个内核线程。
这么说create_workqueue也应该创建了workqueue啊,怎么看不到呢。

我在work的处理函数里面加了个mdelay,看cpu占用率大概就看出是哪个kworker了。
   

镇水铁牛 发表于 2015-03-08 21:51

    if (pool->cpu >= 0)
      snprintf(id_buf, sizeof(id_buf), "%d:%d%s", pool->cpu, id,
             pool->attrs->nice < 0 ? "H" : "");
    else
      snprintf(id_buf, sizeof(id_buf), "u%d:%d", pool->id, id);

    worker->task = kthread_create_on_node(worker_thread, worker, pool->node,
                     "kworker/%s", id_buf);

    其中kworker/0:1中的0:1就来自这里,0表示cpu0,1表示pool worker的ID,单核环境中这个ID不清楚,有可能复用系统默认的worker了。
页: [1]
查看完整版本: 请教个kworker的问题