Merge branch 'exec-update-lock-for-v5.11' of git://git.kernel.org/pub/scm/linux/kerne...
[linux-2.6-microblaze.git] / kernel / fork.c
index e8cb80b..41906a5 100644 (file)
@@ -385,7 +385,7 @@ static void account_kernel_stack(struct task_struct *tsk, int account)
                mod_lruvec_page_state(vm->pages[0], NR_KERNEL_STACK_KB,
                                      account * (THREAD_SIZE / 1024));
        else
-               mod_lruvec_slab_state(stack, NR_KERNEL_STACK_KB,
+               mod_lruvec_kmem_state(stack, NR_KERNEL_STACK_KB,
                                      account * (THREAD_SIZE / 1024));
 }
 
@@ -404,9 +404,10 @@ static int memcg_charge_kernel_stack(struct task_struct *tsk)
 
                for (i = 0; i < THREAD_SIZE / PAGE_SIZE; i++) {
                        /*
-                        * If memcg_kmem_charge_page() fails, page->mem_cgroup
-                        * pointer is NULL, and memcg_kmem_uncharge_page() in
-                        * free_thread_stack() will ignore this page.
+                        * If memcg_kmem_charge_page() fails, page's
+                        * memory cgroup pointer is NULL, and
+                        * memcg_kmem_uncharge_page() in free_thread_stack()
+                        * will ignore this page.
                         */
                        ret = memcg_kmem_charge_page(vm->pages[i], GFP_KERNEL,
                                                     0);
@@ -906,6 +907,7 @@ static struct task_struct *dup_task_struct(struct task_struct *orig, int node)
        clear_user_return_notifier(tsk);
        clear_tsk_need_resched(tsk);
        set_task_stack_end_magic(tsk);
+       clear_syscall_work_syscall_user_dispatch(tsk);
 
 #ifdef CONFIG_STACKPROTECTOR
        tsk->stack_canary = get_random_canary();
@@ -930,6 +932,7 @@ static struct task_struct *dup_task_struct(struct task_struct *orig, int node)
        account_kernel_stack(tsk, 1);
 
        kcov_task_init(tsk);
+       kmap_local_fork(tsk);
 
 #ifdef CONFIG_FAULT_INJECTION
        tsk->fail_nth = 0;
@@ -1007,6 +1010,7 @@ static struct mm_struct *mm_init(struct mm_struct *mm, struct task_struct *p,
        mm->vmacache_seqnum = 0;
        atomic_set(&mm->mm_users, 1);
        atomic_set(&mm->mm_count, 1);
+       seqcount_init(&mm->write_protect_seq);
        mmap_init_lock(mm);
        INIT_LIST_HEAD(&mm->mmlist);
        mm->core_state = NULL;
@@ -1625,7 +1629,7 @@ static void copy_seccomp(struct task_struct *p)
         * to manually enable the seccomp thread flag here.
         */
        if (p->seccomp.mode != SECCOMP_MODE_DISABLED)
-               set_tsk_thread_flag(p, TIF_SECCOMP);
+               set_task_syscall_work(p, SECCOMP);
 #endif
 }
 
@@ -2158,9 +2162,9 @@ static __latent_entropy struct task_struct *copy_process(
         * child regardless of CLONE_PTRACE.
         */
        user_disable_single_step(p);
-       clear_tsk_thread_flag(p, TIF_SYSCALL_TRACE);
-#ifdef TIF_SYSCALL_EMU
-       clear_tsk_thread_flag(p, TIF_SYSCALL_EMU);
+       clear_task_syscall_work(p, SYSCALL_TRACE);
+#if defined(CONFIG_GENERIC_ENTRY) || defined(TIF_SYSCALL_EMU)
+       clear_task_syscall_work(p, SYSCALL_EMU);
 #endif
        clear_tsk_latency_tracing(p);
 
@@ -2182,6 +2186,10 @@ static __latent_entropy struct task_struct *copy_process(
        INIT_LIST_HEAD(&p->thread_group);
        p->task_works = NULL;
 
+#ifdef CONFIG_KRETPROBES
+       p->kretprobe_instances.first = NULL;
+#endif
+
        /*
         * Ensure that the cgroup subsystem policies allow the new process to be
         * forked. It should be noted that the new process's css_set can be changed
@@ -3023,21 +3031,21 @@ SYSCALL_DEFINE1(unshare, unsigned long, unshare_flags)
  *     the exec layer of the kernel.
  */
 
-int unshare_files(struct files_struct **displaced)
+int unshare_files(void)
 {
        struct task_struct *task = current;
-       struct files_struct *copy = NULL;
+       struct files_struct *old, *copy = NULL;
        int error;
 
        error = unshare_fd(CLONE_FILES, NR_OPEN_MAX, &copy);
-       if (error || !copy) {
-               *displaced = NULL;
+       if (error || !copy)
                return error;
-       }
-       *displaced = task->files;
+
+       old = task->files;
        task_lock(task);
        task->files = copy;
        task_unlock(task);
+       put_files_struct(old);
        return 0;
 }