无法将内核线程绑定到 CPU
Not able to bind kernel threads to CPU
我编写了这段代码来将 2 个内核线程绑定到不同的 CPUs :
#include<linux/kthread.h>
#include<linux/sched.h>
#include<linux/delay.h>
#include<linux/slab.h>
struct task_struct *task1;
struct task_struct *task2;
int cpu, data;
int thread_function_one(void *data)
{
int ret = 10;
printk(KERN_INFO "IN THREAD FUNCTION 1 \n");
while(!kthread_should_stop()){
cpu = get_cpu();
put_cpu();
printk("t1 cpu = %d\n",cpu);
msleep(5000);
}
printk(KERN_INFO "EXIT from thread function 1\n");
return ret;
}
int thread_function_two(void *data)
{
int ret = 10;
printk(KERN_INFO "IN THREAD FUNCTION 2 \n");
while(!kthread_should_stop()){
cpu = get_cpu();
put_cpu();
printk("t2 cpu = %d\n",cpu);
msleep(6000);
}
printk(KERN_INFO "EXIT from thread function 2\n");
return ret;
}
static int kernel_init(void)
{
printk(KERN_INFO "module_init\n");
cpu = get_cpu();
put_cpu();
printk("main thread cpu = %d \n",cpu);
task1 = kthread_create(&thread_function_one,(void *)&data,"one");
kthread_bind(task1, cpu);
wake_up_process(task1);
cpu = 5;
task2 = kthread_create(&thread_function_two,(void *)&data,"two");
kthread_bind(task2, cpu);
wake_up_process(task2);
return 0;
}
static void kernel_exit(void)
{
kthread_stop(task1);
kthread_stop(task2);
printk(KERN_INFO "module_exit\n");
}
module_init(kernel_init);
module_exit(kernel_exit);
MODULE_AUTHOR("K_K");
MODULE_LICENSE("GPL");
但是当我在 thread_function_one 和 thread_function_two 中打印 cpu id 时,它们都打印与主线程相同的 CPU。
我是不是做错了什么?
这个程序的输出:
kernel: [ 956.816510] module_init
kernel: [ 956.816515] main thread cpu = 8
kernel: [ 956.816743] IN THREAD FUNCTION 1
kernel: [ 956.816748] t1 cpu = 8
kernel: [ 956.817057] IN THREAD FUNCTION 2
kernel: [ 956.817062] t2 cpu = 8
kernel: [ 961.815160] t1 cpu = 8
kernel: [ 962.814649] t2 cpu = 8
kernel: [ 966.816760] t1 cpu = 8
kernel: [ 968.815711] t2 cpu = 8
kernel: [ 971.818307] EXIT from thread function 1
kernel: [ 974.816813] EXIT from thread function 2
kernel: [ 974.816872] module_exit
如果 "int cpu" 变量不是全局变量,模块工作正常。线程一修改这个全局,线程二将自己绑定到同一个 CPU。这是主线程、线程一和线程二之间的竞争条件。
我编写了这段代码来将 2 个内核线程绑定到不同的 CPUs :
#include<linux/kthread.h>
#include<linux/sched.h>
#include<linux/delay.h>
#include<linux/slab.h>
struct task_struct *task1;
struct task_struct *task2;
int cpu, data;
int thread_function_one(void *data)
{
int ret = 10;
printk(KERN_INFO "IN THREAD FUNCTION 1 \n");
while(!kthread_should_stop()){
cpu = get_cpu();
put_cpu();
printk("t1 cpu = %d\n",cpu);
msleep(5000);
}
printk(KERN_INFO "EXIT from thread function 1\n");
return ret;
}
int thread_function_two(void *data)
{
int ret = 10;
printk(KERN_INFO "IN THREAD FUNCTION 2 \n");
while(!kthread_should_stop()){
cpu = get_cpu();
put_cpu();
printk("t2 cpu = %d\n",cpu);
msleep(6000);
}
printk(KERN_INFO "EXIT from thread function 2\n");
return ret;
}
static int kernel_init(void)
{
printk(KERN_INFO "module_init\n");
cpu = get_cpu();
put_cpu();
printk("main thread cpu = %d \n",cpu);
task1 = kthread_create(&thread_function_one,(void *)&data,"one");
kthread_bind(task1, cpu);
wake_up_process(task1);
cpu = 5;
task2 = kthread_create(&thread_function_two,(void *)&data,"two");
kthread_bind(task2, cpu);
wake_up_process(task2);
return 0;
}
static void kernel_exit(void)
{
kthread_stop(task1);
kthread_stop(task2);
printk(KERN_INFO "module_exit\n");
}
module_init(kernel_init);
module_exit(kernel_exit);
MODULE_AUTHOR("K_K");
MODULE_LICENSE("GPL");
但是当我在 thread_function_one 和 thread_function_two 中打印 cpu id 时,它们都打印与主线程相同的 CPU。
我是不是做错了什么?
这个程序的输出:
kernel: [ 956.816510] module_init
kernel: [ 956.816515] main thread cpu = 8
kernel: [ 956.816743] IN THREAD FUNCTION 1
kernel: [ 956.816748] t1 cpu = 8
kernel: [ 956.817057] IN THREAD FUNCTION 2
kernel: [ 956.817062] t2 cpu = 8
kernel: [ 961.815160] t1 cpu = 8
kernel: [ 962.814649] t2 cpu = 8
kernel: [ 966.816760] t1 cpu = 8
kernel: [ 968.815711] t2 cpu = 8
kernel: [ 971.818307] EXIT from thread function 1
kernel: [ 974.816813] EXIT from thread function 2
kernel: [ 974.816872] module_exit
如果 "int cpu" 变量不是全局变量,模块工作正常。线程一修改这个全局,线程二将自己绑定到同一个 CPU。这是主线程、线程一和线程二之间的竞争条件。