diff options
Diffstat (limited to 'kernel/fork.c')
-rw-r--r-- | kernel/fork.c | 51 |
1 files changed, 37 insertions, 14 deletions
diff --git a/kernel/fork.c b/kernel/fork.c index 9064bf9e131b..56e4e07e45f7 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
@@ -193,7 +193,10 @@ static inline int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm) | |||
193 | 193 | ||
194 | down_write(&oldmm->mmap_sem); | 194 | down_write(&oldmm->mmap_sem); |
195 | flush_cache_mm(oldmm); | 195 | flush_cache_mm(oldmm); |
196 | down_write(&mm->mmap_sem); | 196 | /* |
197 | * Not linked in yet - no deadlock potential: | ||
198 | */ | ||
199 | down_write_nested(&mm->mmap_sem, SINGLE_DEPTH_NESTING); | ||
197 | 200 | ||
198 | mm->locked_vm = 0; | 201 | mm->locked_vm = 0; |
199 | mm->mmap = NULL; | 202 | mm->mmap = NULL; |
@@ -919,10 +922,6 @@ static inline void rt_mutex_init_task(struct task_struct *p) | |||
919 | spin_lock_init(&p->pi_lock); | 922 | spin_lock_init(&p->pi_lock); |
920 | plist_head_init(&p->pi_waiters, &p->pi_lock); | 923 | plist_head_init(&p->pi_waiters, &p->pi_lock); |
921 | p->pi_blocked_on = NULL; | 924 | p->pi_blocked_on = NULL; |
922 | # ifdef CONFIG_DEBUG_RT_MUTEXES | ||
923 | spin_lock_init(&p->held_list_lock); | ||
924 | INIT_LIST_HEAD(&p->held_list_head); | ||
925 | # endif | ||
926 | #endif | 925 | #endif |
927 | } | 926 | } |
928 | 927 | ||
@@ -934,13 +933,13 @@ static inline void rt_mutex_init_task(struct task_struct *p) | |||
934 | * parts of the process environment (as per the clone | 933 | * parts of the process environment (as per the clone |
935 | * flags). The actual kick-off is left to the caller. | 934 | * flags). The actual kick-off is left to the caller. |
936 | */ | 935 | */ |
937 | static task_t *copy_process(unsigned long clone_flags, | 936 | static struct task_struct *copy_process(unsigned long clone_flags, |
938 | unsigned long stack_start, | 937 | unsigned long stack_start, |
939 | struct pt_regs *regs, | 938 | struct pt_regs *regs, |
940 | unsigned long stack_size, | 939 | unsigned long stack_size, |
941 | int __user *parent_tidptr, | 940 | int __user *parent_tidptr, |
942 | int __user *child_tidptr, | 941 | int __user *child_tidptr, |
943 | int pid) | 942 | int pid) |
944 | { | 943 | { |
945 | int retval; | 944 | int retval; |
946 | struct task_struct *p = NULL; | 945 | struct task_struct *p = NULL; |
@@ -972,6 +971,10 @@ static task_t *copy_process(unsigned long clone_flags, | |||
972 | if (!p) | 971 | if (!p) |
973 | goto fork_out; | 972 | goto fork_out; |
974 | 973 | ||
974 | #ifdef CONFIG_TRACE_IRQFLAGS | ||
975 | DEBUG_LOCKS_WARN_ON(!p->hardirqs_enabled); | ||
976 | DEBUG_LOCKS_WARN_ON(!p->softirqs_enabled); | ||
977 | #endif | ||
975 | retval = -EAGAIN; | 978 | retval = -EAGAIN; |
976 | if (atomic_read(&p->user->processes) >= | 979 | if (atomic_read(&p->user->processes) >= |
977 | p->signal->rlim[RLIMIT_NPROC].rlim_cur) { | 980 | p->signal->rlim[RLIMIT_NPROC].rlim_cur) { |
@@ -1046,6 +1049,26 @@ static task_t *copy_process(unsigned long clone_flags, | |||
1046 | } | 1049 | } |
1047 | mpol_fix_fork_child_flag(p); | 1050 | mpol_fix_fork_child_flag(p); |
1048 | #endif | 1051 | #endif |
1052 | #ifdef CONFIG_TRACE_IRQFLAGS | ||
1053 | p->irq_events = 0; | ||
1054 | p->hardirqs_enabled = 0; | ||
1055 | p->hardirq_enable_ip = 0; | ||
1056 | p->hardirq_enable_event = 0; | ||
1057 | p->hardirq_disable_ip = _THIS_IP_; | ||
1058 | p->hardirq_disable_event = 0; | ||
1059 | p->softirqs_enabled = 1; | ||
1060 | p->softirq_enable_ip = _THIS_IP_; | ||
1061 | p->softirq_enable_event = 0; | ||
1062 | p->softirq_disable_ip = 0; | ||
1063 | p->softirq_disable_event = 0; | ||
1064 | p->hardirq_context = 0; | ||
1065 | p->softirq_context = 0; | ||
1066 | #endif | ||
1067 | #ifdef CONFIG_LOCKDEP | ||
1068 | p->lockdep_depth = 0; /* no locks held yet */ | ||
1069 | p->curr_chain_key = 0; | ||
1070 | p->lockdep_recursion = 0; | ||
1071 | #endif | ||
1049 | 1072 | ||
1050 | rt_mutex_init_task(p); | 1073 | rt_mutex_init_task(p); |
1051 | 1074 | ||
@@ -1271,9 +1294,9 @@ struct pt_regs * __devinit __attribute__((weak)) idle_regs(struct pt_regs *regs) | |||
1271 | return regs; | 1294 | return regs; |
1272 | } | 1295 | } |
1273 | 1296 | ||
1274 | task_t * __devinit fork_idle(int cpu) | 1297 | struct task_struct * __devinit fork_idle(int cpu) |
1275 | { | 1298 | { |
1276 | task_t *task; | 1299 | struct task_struct *task; |
1277 | struct pt_regs regs; | 1300 | struct pt_regs regs; |
1278 | 1301 | ||
1279 | task = copy_process(CLONE_VM, 0, idle_regs(®s), 0, NULL, NULL, 0); | 1302 | task = copy_process(CLONE_VM, 0, idle_regs(®s), 0, NULL, NULL, 0); |