瀏覽代碼

sched: fix, always create kernel threads with normal priority

Ensure that the kernel threads are created with the usual nice level
and affinity even if kthreadd's properties were changed from the
default by root.

Signed-off-by: Michal Schmidt <mschmidt@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Michal Schmidt 17 年之前
父節點
當前提交
4f05b98d54
共有 1 個文件被更改,包括 11 次插入1 次删除
  1. 11 1
      kernel/kthread.c

+ 11 - 1
kernel/kthread.c

@@ -15,6 +15,8 @@
 #include <linux/mutex.h>
 #include <linux/mutex.h>
 #include <asm/semaphore.h>
 #include <asm/semaphore.h>
 
 
+#define KTHREAD_NICE_LEVEL (-5)
+
 static DEFINE_SPINLOCK(kthread_create_lock);
 static DEFINE_SPINLOCK(kthread_create_lock);
 static LIST_HEAD(kthread_create_list);
 static LIST_HEAD(kthread_create_list);
 struct task_struct *kthreadd_task;
 struct task_struct *kthreadd_task;
@@ -94,10 +96,18 @@ static void create_kthread(struct kthread_create_info *create)
 	if (pid < 0) {
 	if (pid < 0) {
 		create->result = ERR_PTR(pid);
 		create->result = ERR_PTR(pid);
 	} else {
 	} else {
+		struct sched_param param = { .sched_priority = 0 };
 		wait_for_completion(&create->started);
 		wait_for_completion(&create->started);
 		read_lock(&tasklist_lock);
 		read_lock(&tasklist_lock);
 		create->result = find_task_by_pid(pid);
 		create->result = find_task_by_pid(pid);
 		read_unlock(&tasklist_lock);
 		read_unlock(&tasklist_lock);
+		/*
+		 * root may have changed our (kthreadd's) priority or CPU mask.
+		 * The kernel thread should not inherit these properties.
+		 */
+		sched_setscheduler(create->result, SCHED_NORMAL, &param);
+		set_user_nice(create->result, KTHREAD_NICE_LEVEL);
+		set_cpus_allowed(create->result, CPU_MASK_ALL);
 	}
 	}
 	complete(&create->done);
 	complete(&create->done);
 }
 }
@@ -221,7 +231,7 @@ int kthreadd(void *unused)
 	/* Setup a clean context for our children to inherit. */
 	/* Setup a clean context for our children to inherit. */
 	set_task_comm(tsk, "kthreadd");
 	set_task_comm(tsk, "kthreadd");
 	ignore_signals(tsk);
 	ignore_signals(tsk);
-	set_user_nice(tsk, -5);
+	set_user_nice(tsk, KTHREAD_NICE_LEVEL);
 	set_cpus_allowed(tsk, CPU_MASK_ALL);
 	set_cpus_allowed(tsk, CPU_MASK_ALL);
 
 
 	current->flags |= PF_NOFREEZE;
 	current->flags |= PF_NOFREEZE;