我注意到可以使用workqueue_set_unbound_cpumask()
设置所有未绑定工作队列的cpumask,但是我没有看到任何针对特定工作队列的内容。在我这边真正的荆棘是在源文件中定义了struct workqueue_struct
,所以我无法访问它的任何成员。
我的一个解决方案是分配新的struct workqueue_attrs
并致电apply_workqueue_attrs()
。如果不是因为我无法访问上述工作队列的unbound_attrs
成员,那就没关系。似乎有一些复制功能,但它们都是内部的。所以现在我要重新选择nice
和no_numa
的值,这是令人恼火的,因为我必须注意工作队列是否有序以及是否分配了WQ_HIGHPRI
。< / p>
我知道有可能这样做是带有sysfs的用户空间,但我不希望用户必须跟踪每个创建的工作队列并手动将它们全部固定,也不必固定每个未绑定的工作队列。
希望我错过了一些东西,并且有一种更简单的方法。以下代码供参考。
struct workqueue_struct* wq = alloc_workqueue(name, WQ_UNBOUND | WQ_HIGHPRI);
struct workqueue_attrs* attrs = alloc_workqueue_attrs(GFP_KERNEL);
/* Yuck, setting WQ_HIGHPRI is just declaring intent */
attrs->nice = MIN_NICE;
attrs->no_numa = 0;
cpumask_parse(..., attrs->cpumask);
apply_workqueue_attrs(wq, attrs);