diff options
Diffstat (limited to 'kernel/fork.c')
-rw-r--r-- | kernel/fork.c | 30 |
1 files changed, 10 insertions, 20 deletions
diff --git a/kernel/fork.c b/kernel/fork.c index 1415dc4598ae..f88bd984df35 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
@@ -939,9 +939,9 @@ SYSCALL_DEFINE1(set_tid_address, int __user *, tidptr) | |||
939 | 939 | ||
940 | static void rt_mutex_init_task(struct task_struct *p) | 940 | static void rt_mutex_init_task(struct task_struct *p) |
941 | { | 941 | { |
942 | spin_lock_init(&p->pi_lock); | 942 | raw_spin_lock_init(&p->pi_lock); |
943 | #ifdef CONFIG_RT_MUTEXES | 943 | #ifdef CONFIG_RT_MUTEXES |
944 | plist_head_init(&p->pi_waiters, &p->pi_lock); | 944 | plist_head_init_raw(&p->pi_waiters, &p->pi_lock); |
945 | p->pi_blocked_on = NULL; | 945 | p->pi_blocked_on = NULL; |
946 | #endif | 946 | #endif |
947 | } | 947 | } |
@@ -1127,6 +1127,10 @@ static struct task_struct *copy_process(unsigned long clone_flags, | |||
1127 | #ifdef CONFIG_DEBUG_MUTEXES | 1127 | #ifdef CONFIG_DEBUG_MUTEXES |
1128 | p->blocked_on = NULL; /* not blocked yet */ | 1128 | p->blocked_on = NULL; /* not blocked yet */ |
1129 | #endif | 1129 | #endif |
1130 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR | ||
1131 | p->memcg_batch.do_batch = 0; | ||
1132 | p->memcg_batch.memcg = NULL; | ||
1133 | #endif | ||
1130 | 1134 | ||
1131 | p->bts = NULL; | 1135 | p->bts = NULL; |
1132 | 1136 | ||
@@ -1206,9 +1210,10 @@ static struct task_struct *copy_process(unsigned long clone_flags, | |||
1206 | p->sas_ss_sp = p->sas_ss_size = 0; | 1210 | p->sas_ss_sp = p->sas_ss_size = 0; |
1207 | 1211 | ||
1208 | /* | 1212 | /* |
1209 | * Syscall tracing should be turned off in the child regardless | 1213 | * Syscall tracing and stepping should be turned off in the |
1210 | * of CLONE_PTRACE. | 1214 | * child regardless of CLONE_PTRACE. |
1211 | */ | 1215 | */ |
1216 | user_disable_single_step(p); | ||
1212 | clear_tsk_thread_flag(p, TIF_SYSCALL_TRACE); | 1217 | clear_tsk_thread_flag(p, TIF_SYSCALL_TRACE); |
1213 | #ifdef TIF_SYSCALL_EMU | 1218 | #ifdef TIF_SYSCALL_EMU |
1214 | clear_tsk_thread_flag(p, TIF_SYSCALL_EMU); | 1219 | clear_tsk_thread_flag(p, TIF_SYSCALL_EMU); |
@@ -1236,21 +1241,6 @@ static struct task_struct *copy_process(unsigned long clone_flags, | |||
1236 | /* Need tasklist lock for parent etc handling! */ | 1241 | /* Need tasklist lock for parent etc handling! */ |
1237 | write_lock_irq(&tasklist_lock); | 1242 | write_lock_irq(&tasklist_lock); |
1238 | 1243 | ||
1239 | /* | ||
1240 | * The task hasn't been attached yet, so its cpus_allowed mask will | ||
1241 | * not be changed, nor will its assigned CPU. | ||
1242 | * | ||
1243 | * The cpus_allowed mask of the parent may have changed after it was | ||
1244 | * copied first time - so re-copy it here, then check the child's CPU | ||
1245 | * to ensure it is on a valid CPU (and if not, just force it back to | ||
1246 | * parent's CPU). This avoids alot of nasty races. | ||
1247 | */ | ||
1248 | p->cpus_allowed = current->cpus_allowed; | ||
1249 | p->rt.nr_cpus_allowed = current->rt.nr_cpus_allowed; | ||
1250 | if (unlikely(!cpu_isset(task_cpu(p), p->cpus_allowed) || | ||
1251 | !cpu_online(task_cpu(p)))) | ||
1252 | set_task_cpu(p, smp_processor_id()); | ||
1253 | |||
1254 | /* CLONE_PARENT re-uses the old parent */ | 1244 | /* CLONE_PARENT re-uses the old parent */ |
1255 | if (clone_flags & (CLONE_PARENT|CLONE_THREAD)) { | 1245 | if (clone_flags & (CLONE_PARENT|CLONE_THREAD)) { |
1256 | p->real_parent = current->real_parent; | 1246 | p->real_parent = current->real_parent; |
@@ -1286,7 +1276,6 @@ static struct task_struct *copy_process(unsigned long clone_flags, | |||
1286 | } | 1276 | } |
1287 | 1277 | ||
1288 | if (likely(p->pid)) { | 1278 | if (likely(p->pid)) { |
1289 | list_add_tail(&p->sibling, &p->real_parent->children); | ||
1290 | tracehook_finish_clone(p, clone_flags, trace); | 1279 | tracehook_finish_clone(p, clone_flags, trace); |
1291 | 1280 | ||
1292 | if (thread_group_leader(p)) { | 1281 | if (thread_group_leader(p)) { |
@@ -1298,6 +1287,7 @@ static struct task_struct *copy_process(unsigned long clone_flags, | |||
1298 | p->signal->tty = tty_kref_get(current->signal->tty); | 1287 | p->signal->tty = tty_kref_get(current->signal->tty); |
1299 | attach_pid(p, PIDTYPE_PGID, task_pgrp(current)); | 1288 | attach_pid(p, PIDTYPE_PGID, task_pgrp(current)); |
1300 | attach_pid(p, PIDTYPE_SID, task_session(current)); | 1289 | attach_pid(p, PIDTYPE_SID, task_session(current)); |
1290 | list_add_tail(&p->sibling, &p->real_parent->children); | ||
1301 | list_add_tail_rcu(&p->tasks, &init_task.tasks); | 1291 | list_add_tail_rcu(&p->tasks, &init_task.tasks); |
1302 | __get_cpu_var(process_counts)++; | 1292 | __get_cpu_var(process_counts)++; |
1303 | } | 1293 | } |