2017-03-29 31 views
2

運行內核線程我啓動我的內核在一個偏僻的CPU核心

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(); 

我該如何在特定內核上運行此工作隊列線程(如果可能的話是隔離的)?

回答

2

已經有一個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. 
+0

我使用了queue_work_on但這是相同的想法。 – gregoiregentil