Re: [PATCH v3 1/2] Add CABA tree to task_struct

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Pavel,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on shuah-kselftest/next]
[also build test WARNING on kees/for-next/execve tip/sched/core linus/master v6.0-rc4 next-20220908]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Pavel-Tikhomirov/Introduce-CABA-helper-process-tree/20220908-220639
base:   https://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest.git next
config: s390-randconfig-s043-20220907 (https://download.01.org/0day-ci/archive/20220909/202209090529.EL54HX2U-lkp@xxxxxxxxx/config)
compiler: s390-linux-gcc (GCC) 12.1.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # apt-get install sparse
        # sparse version: v0.6.4-39-gce1a6720-dirty
        # https://github.com/intel-lab-lkp/linux/commit/17a897a33137d4f49f99c8be8d619f6f711fccdb
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review Pavel-Tikhomirov/Introduce-CABA-helper-process-tree/20220908-220639
        git checkout 17a897a33137d4f49f99c8be8d619f6f711fccdb
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=s390 SHELL=/bin/bash

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@xxxxxxxxx>

sparse warnings: (new ones prefixed by >>)
   kernel/fork.c:1307:22: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected struct file *[assigned] old_exe_file @@     got struct file [noderef] __rcu *[assigned] __ret @@
   kernel/fork.c:1307:22: sparse:     expected struct file *[assigned] old_exe_file
   kernel/fork.c:1307:22: sparse:     got struct file [noderef] __rcu *[assigned] __ret
   kernel/fork.c:1638:38: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct refcount_struct [usertype] *r @@     got struct refcount_struct [noderef] __rcu * @@
   kernel/fork.c:1638:38: sparse:     expected struct refcount_struct [usertype] *r
   kernel/fork.c:1638:38: sparse:     got struct refcount_struct [noderef] __rcu *
   kernel/fork.c:1647:31: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct spinlock [usertype] *lock @@     got struct spinlock [noderef] __rcu * @@
   kernel/fork.c:1647:31: sparse:     expected struct spinlock [usertype] *lock
   kernel/fork.c:1647:31: sparse:     got struct spinlock [noderef] __rcu *
   kernel/fork.c:1648:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void const * @@     got struct k_sigaction [noderef] __rcu * @@
   kernel/fork.c:1648:9: sparse:     expected void const *
   kernel/fork.c:1648:9: sparse:     got struct k_sigaction [noderef] __rcu *
   kernel/fork.c:1648:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void const * @@     got struct k_sigaction [noderef] __rcu * @@
   kernel/fork.c:1648:9: sparse:     expected void const *
   kernel/fork.c:1648:9: sparse:     got struct k_sigaction [noderef] __rcu *
   kernel/fork.c:1648:9: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void const * @@     got struct k_sigaction [noderef] __rcu * @@
   kernel/fork.c:1648:9: sparse:     expected void const *
   kernel/fork.c:1648:9: sparse:     got struct k_sigaction [noderef] __rcu *
   kernel/fork.c:1649:33: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct spinlock [usertype] *lock @@     got struct spinlock [noderef] __rcu * @@
   kernel/fork.c:1649:33: sparse:     expected struct spinlock [usertype] *lock
   kernel/fork.c:1649:33: sparse:     got struct spinlock [noderef] __rcu *
   kernel/fork.c:1742:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct arch_spinlock_t [usertype] *lp @@     got struct arch_spinlock_t [noderef] __rcu * @@
   kernel/fork.c:1742:9: sparse:     expected struct arch_spinlock_t [usertype] *lp
   kernel/fork.c:1742:9: sparse:     got struct arch_spinlock_t [noderef] __rcu *
   kernel/fork.c:2077:31: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct spinlock [usertype] *lock @@     got struct spinlock [noderef] __rcu * @@
   kernel/fork.c:2077:31: sparse:     expected struct spinlock [usertype] *lock
   kernel/fork.c:2077:31: sparse:     got struct spinlock [noderef] __rcu *
   kernel/fork.c:2081:33: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct spinlock [usertype] *lock @@     got struct spinlock [noderef] __rcu * @@
   kernel/fork.c:2081:33: sparse:     expected struct spinlock [usertype] *lock
   kernel/fork.c:2081:33: sparse:     got struct spinlock [noderef] __rcu *
   kernel/fork.c:2403:32: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected struct task_struct [noderef] __rcu *real_parent @@     got struct task_struct * @@
   kernel/fork.c:2403:32: sparse:     expected struct task_struct [noderef] __rcu *real_parent
   kernel/fork.c:2403:32: sparse:     got struct task_struct *
>> kernel/fork.c:2407:17: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected struct task_struct [noderef] __rcu *caba @@     got struct task_struct * @@
   kernel/fork.c:2407:17: sparse:     expected struct task_struct [noderef] __rcu *caba
   kernel/fork.c:2407:17: sparse:     got struct task_struct *
   kernel/fork.c:2413:27: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct spinlock [usertype] *lock @@     got struct spinlock [noderef] __rcu * @@
   kernel/fork.c:2413:27: sparse:     expected struct spinlock [usertype] *lock
   kernel/fork.c:2413:27: sparse:     got struct spinlock [noderef] __rcu *
   kernel/fork.c:2460:54: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected struct list_head *head @@     got struct list_head [noderef] __rcu * @@
   kernel/fork.c:2460:54: sparse:     expected struct list_head *head
   kernel/fork.c:2460:54: sparse:     got struct list_head [noderef] __rcu *
   kernel/fork.c:2461:51: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected struct list_head *head @@     got struct list_head [noderef] __rcu * @@
   kernel/fork.c:2461:51: sparse:     expected struct list_head *head
   kernel/fork.c:2461:51: sparse:     got struct list_head [noderef] __rcu *
   kernel/fork.c:2482:29: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct spinlock [usertype] *lock @@     got struct spinlock [noderef] __rcu * @@
   kernel/fork.c:2482:29: sparse:     expected struct spinlock [usertype] *lock
   kernel/fork.c:2482:29: sparse:     got struct spinlock [noderef] __rcu *
   kernel/fork.c:2503:29: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct spinlock [usertype] *lock @@     got struct spinlock [noderef] __rcu * @@
   kernel/fork.c:2503:29: sparse:     expected struct spinlock [usertype] *lock
   kernel/fork.c:2503:29: sparse:     got struct spinlock [noderef] __rcu *
   kernel/fork.c:2530:28: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct sighand_struct *sighand @@     got struct sighand_struct [noderef] __rcu *sighand @@
   kernel/fork.c:2530:28: sparse:     expected struct sighand_struct *sighand
   kernel/fork.c:2530:28: sparse:     got struct sighand_struct [noderef] __rcu *sighand
   kernel/fork.c:2559:31: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct spinlock [usertype] *lock @@     got struct spinlock [noderef] __rcu * @@
   kernel/fork.c:2559:31: sparse:     expected struct spinlock [usertype] *lock
   kernel/fork.c:2559:31: sparse:     got struct spinlock [noderef] __rcu *
   kernel/fork.c:2561:33: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct spinlock [usertype] *lock @@     got struct spinlock [noderef] __rcu * @@
   kernel/fork.c:2561:33: sparse:     expected struct spinlock [usertype] *lock
   kernel/fork.c:2561:33: sparse:     got struct spinlock [noderef] __rcu *
   kernel/fork.c:2997:24: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected struct task_struct *[assigned] parent @@     got struct task_struct [noderef] __rcu *real_parent @@
   kernel/fork.c:2997:24: sparse:     expected struct task_struct *[assigned] parent
   kernel/fork.c:2997:24: sparse:     got struct task_struct [noderef] __rcu *real_parent
   kernel/fork.c:3078:43: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct refcount_struct const [usertype] *r @@     got struct refcount_struct [noderef] __rcu * @@
   kernel/fork.c:3078:43: sparse:     expected struct refcount_struct const [usertype] *r
   kernel/fork.c:3078:43: sparse:     got struct refcount_struct [noderef] __rcu *
   kernel/fork.c:2122:22: sparse: sparse: dereference of noderef expression
   kernel/fork.c: note: in included file (through arch/s390/include/asm/stacktrace.h, arch/s390/include/asm/perf_event.h, include/linux/perf_event.h, ...):
   include/linux/ptrace.h:210:45: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected struct task_struct *new_parent @@     got struct task_struct [noderef] __rcu *parent @@
   include/linux/ptrace.h:210:45: sparse:     expected struct task_struct *new_parent
   include/linux/ptrace.h:210:45: sparse:     got struct task_struct [noderef] __rcu *parent
   include/linux/ptrace.h:210:62: sparse: sparse: incorrect type in argument 3 (different address spaces) @@     expected struct cred const *ptracer_cred @@     got struct cred const [noderef] __rcu *ptracer_cred @@
   include/linux/ptrace.h:210:62: sparse:     expected struct cred const *ptracer_cred
   include/linux/ptrace.h:210:62: sparse:     got struct cred const [noderef] __rcu *ptracer_cred
   kernel/fork.c:2458:59: sparse: sparse: dereference of noderef expression
   kernel/fork.c:2459:59: sparse: sparse: dereference of noderef expression
--
>> kernel/exit.c:84:26: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected struct task_struct *[assigned] new_caba @@     got struct task_struct [noderef] __rcu *caba @@
   kernel/exit.c:84:26: sparse:     expected struct task_struct *[assigned] new_caba
   kernel/exit.c:84:26: sparse:     got struct task_struct [noderef] __rcu *caba
   kernel/exit.c:302:37: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct task_struct *tsk @@     got struct task_struct [noderef] __rcu *real_parent @@
   kernel/exit.c:302:37: sparse:     expected struct task_struct *tsk
   kernel/exit.c:302:37: sparse:     got struct task_struct [noderef] __rcu *real_parent
   kernel/exit.c:305:32: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct task_struct *task @@     got struct task_struct [noderef] __rcu *real_parent @@
   kernel/exit.c:305:32: sparse:     expected struct task_struct *task
   kernel/exit.c:305:32: sparse:     got struct task_struct [noderef] __rcu *real_parent
   kernel/exit.c:306:35: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct task_struct *task @@     got struct task_struct [noderef] __rcu *real_parent @@
   kernel/exit.c:306:35: sparse:     expected struct task_struct *task
   kernel/exit.c:306:35: sparse:     got struct task_struct [noderef] __rcu *real_parent
   kernel/exit.c:351:24: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected struct task_struct *parent @@     got struct task_struct [noderef] __rcu *real_parent @@
   kernel/exit.c:351:24: sparse:     expected struct task_struct *parent
   kernel/exit.c:351:24: sparse:     got struct task_struct [noderef] __rcu *real_parent
   kernel/exit.c:378:27: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct spinlock [usertype] *lock @@     got struct spinlock [noderef] __rcu * @@
   kernel/exit.c:378:27: sparse:     expected struct spinlock [usertype] *lock
   kernel/exit.c:378:27: sparse:     got struct spinlock [noderef] __rcu *
   kernel/exit.c:381:29: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct spinlock [usertype] *lock @@     got struct spinlock [noderef] __rcu * @@
   kernel/exit.c:381:29: sparse:     expected struct spinlock [usertype] *lock
   kernel/exit.c:381:29: sparse:     got struct spinlock [noderef] __rcu *
   kernel/exit.c:604:29: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected struct task_struct *reaper @@     got struct task_struct [noderef] __rcu *real_parent @@
   kernel/exit.c:604:29: sparse:     expected struct task_struct *reaper
   kernel/exit.c:604:29: sparse:     got struct task_struct [noderef] __rcu *real_parent
   kernel/exit.c:606:29: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected struct task_struct *reaper @@     got struct task_struct [noderef] __rcu *real_parent @@
   kernel/exit.c:606:29: sparse:     expected struct task_struct *reaper
   kernel/exit.c:606:29: sparse:     got struct task_struct [noderef] __rcu *real_parent
   kernel/exit.c:930:63: sparse: sparse: incorrect type in initializer (different address spaces) @@     expected struct sighand_struct *const sighand @@     got struct sighand_struct [noderef] __rcu *sighand @@
   kernel/exit.c:930:63: sparse:     expected struct sighand_struct *const sighand
   kernel/exit.c:930:63: sparse:     got struct sighand_struct [noderef] __rcu *sighand
   kernel/exit.c:1085:39: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct spinlock [usertype] *lock @@     got struct spinlock [noderef] __rcu * @@
   kernel/exit.c:1085:39: sparse:     expected struct spinlock [usertype] *lock
   kernel/exit.c:1085:39: sparse:     got struct spinlock [noderef] __rcu *
   kernel/exit.c:1110:41: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct spinlock [usertype] *lock @@     got struct spinlock [noderef] __rcu * @@
   kernel/exit.c:1110:41: sparse:     expected struct spinlock [usertype] *lock
   kernel/exit.c:1110:41: sparse:     got struct spinlock [noderef] __rcu *
   kernel/exit.c:1199:25: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct spinlock [usertype] *lock @@     got struct spinlock [noderef] __rcu * @@
   kernel/exit.c:1199:25: sparse:     expected struct spinlock [usertype] *lock
   kernel/exit.c:1199:25: sparse:     got struct spinlock [noderef] __rcu *
   kernel/exit.c:1214:27: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct spinlock [usertype] *lock @@     got struct spinlock [noderef] __rcu * @@
   kernel/exit.c:1214:27: sparse:     expected struct spinlock [usertype] *lock
   kernel/exit.c:1214:27: sparse:     got struct spinlock [noderef] __rcu *
   kernel/exit.c:1265:25: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct spinlock [usertype] *lock @@     got struct spinlock [noderef] __rcu * @@
   kernel/exit.c:1265:25: sparse:     expected struct spinlock [usertype] *lock
   kernel/exit.c:1265:25: sparse:     got struct spinlock [noderef] __rcu *
   kernel/exit.c:1268:35: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct spinlock [usertype] *lock @@     got struct spinlock [noderef] __rcu * @@
   kernel/exit.c:1268:35: sparse:     expected struct spinlock [usertype] *lock
   kernel/exit.c:1268:35: sparse:     got struct spinlock [noderef] __rcu *
   kernel/exit.c:1274:27: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct spinlock [usertype] *lock @@     got struct spinlock [noderef] __rcu * @@
   kernel/exit.c:1274:27: sparse:     expected struct spinlock [usertype] *lock
   kernel/exit.c:1274:27: sparse:     got struct spinlock [noderef] __rcu *
   kernel/exit.c:1455:59: sparse: sparse: incompatible types in comparison expression (different base types):
   kernel/exit.c:1455:59: sparse:    void *
   kernel/exit.c:1455:59: sparse:    struct task_struct [noderef] __rcu *
   kernel/exit.c:1471:25: sparse: sparse: incorrect type in initializer (different address spaces) @@     expected struct task_struct *parent @@     got struct task_struct [noderef] __rcu * @@
   kernel/exit.c:1471:25: sparse:     expected struct task_struct *parent
   kernel/exit.c:1471:25: sparse:     got struct task_struct [noderef] __rcu *
   kernel/exit.c: note: in included file:
   include/linux/ptrace.h:92:40: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct task_struct *p1 @@     got struct task_struct [noderef] __rcu *real_parent @@
   include/linux/ptrace.h:92:40: sparse:     expected struct task_struct *p1
   include/linux/ptrace.h:92:40: sparse:     got struct task_struct [noderef] __rcu *real_parent
   include/linux/ptrace.h:92:60: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected struct task_struct *p2 @@     got struct task_struct [noderef] __rcu *parent @@
   include/linux/ptrace.h:92:60: sparse:     expected struct task_struct *p2
   include/linux/ptrace.h:92:60: sparse:     got struct task_struct [noderef] __rcu *parent
   include/linux/ptrace.h:92:40: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct task_struct *p1 @@     got struct task_struct [noderef] __rcu *real_parent @@
   include/linux/ptrace.h:92:40: sparse:     expected struct task_struct *p1
   include/linux/ptrace.h:92:40: sparse:     got struct task_struct [noderef] __rcu *real_parent
   include/linux/ptrace.h:92:60: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected struct task_struct *p2 @@     got struct task_struct [noderef] __rcu *parent @@
   include/linux/ptrace.h:92:60: sparse:     expected struct task_struct *p2
   include/linux/ptrace.h:92:60: sparse:     got struct task_struct [noderef] __rcu *parent
   kernel/exit.c: note: in included file (through include/linux/sched/signal.h, include/linux/rcuwait.h, include/linux/percpu-rwsem.h, ...):
   include/linux/sched/task.h:110:21: sparse: sparse: context imbalance in 'wait_task_zombie' - unexpected unlock
   include/linux/sched/task.h:110:21: sparse: sparse: context imbalance in 'wait_task_stopped' - unexpected unlock
   include/linux/sched/task.h:110:21: sparse: sparse: context imbalance in 'wait_task_continued' - unexpected unlock
   kernel/exit.c: note: in included file:
   include/linux/ptrace.h:92:40: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct task_struct *p1 @@     got struct task_struct [noderef] __rcu *real_parent @@
   include/linux/ptrace.h:92:40: sparse:     expected struct task_struct *p1
   include/linux/ptrace.h:92:40: sparse:     got struct task_struct [noderef] __rcu *real_parent
   include/linux/ptrace.h:92:60: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected struct task_struct *p2 @@     got struct task_struct [noderef] __rcu *parent @@
   include/linux/ptrace.h:92:60: sparse:     expected struct task_struct *p2
   include/linux/ptrace.h:92:60: sparse:     got struct task_struct [noderef] __rcu *parent
   kernel/exit.c:1563:9: sparse: sparse: context imbalance in 'do_wait' - wrong count at exit
--
   init/init_task.c:107:28: sparse: sparse: incorrect type in initializer (different address spaces) @@     expected struct task_struct [noderef] __rcu *real_parent @@     got struct task_struct * @@
   init/init_task.c:107:28: sparse:     expected struct task_struct [noderef] __rcu *real_parent
   init/init_task.c:107:28: sparse:     got struct task_struct *
   init/init_task.c:108:28: sparse: sparse: incorrect type in initializer (different address spaces) @@     expected struct task_struct [noderef] __rcu *parent @@     got struct task_struct * @@
   init/init_task.c:108:28: sparse:     expected struct task_struct [noderef] __rcu *parent
   init/init_task.c:108:28: sparse:     got struct task_struct *
>> init/init_task.c:112:28: sparse: sparse: incorrect type in initializer (different address spaces) @@     expected struct task_struct [noderef] __rcu *caba @@     got struct task_struct * @@
   init/init_task.c:112:28: sparse:     expected struct task_struct [noderef] __rcu *caba
   init/init_task.c:112:28: sparse:     got struct task_struct *
   init/init_task.c:125:28: sparse: sparse: incorrect type in initializer (different address spaces) @@     expected struct sighand_struct [noderef] __rcu *sighand @@     got struct sighand_struct * @@
   init/init_task.c:125:28: sparse:     expected struct sighand_struct [noderef] __rcu *sighand
   init/init_task.c:125:28: sparse:     got struct sighand_struct *

vim +2407 kernel/fork.c

  2355	
  2356		/*
  2357		 * Ensure that the cgroup subsystem policies allow the new process to be
  2358		 * forked. It should be noted that the new process's css_set can be changed
  2359		 * between here and cgroup_post_fork() if an organisation operation is in
  2360		 * progress.
  2361		 */
  2362		retval = cgroup_can_fork(p, args);
  2363		if (retval)
  2364			goto bad_fork_put_pidfd;
  2365	
  2366		/*
  2367		 * Now that the cgroups are pinned, re-clone the parent cgroup and put
  2368		 * the new task on the correct runqueue. All this *before* the task
  2369		 * becomes visible.
  2370		 *
  2371		 * This isn't part of ->can_fork() because while the re-cloning is
  2372		 * cgroup specific, it unconditionally needs to place the task on a
  2373		 * runqueue.
  2374		 */
  2375		sched_cgroup_fork(p, args);
  2376	
  2377		/*
  2378		 * From this point on we must avoid any synchronous user-space
  2379		 * communication until we take the tasklist-lock. In particular, we do
  2380		 * not want user-space to be able to predict the process start-time by
  2381		 * stalling fork(2) after we recorded the start_time but before it is
  2382		 * visible to the system.
  2383		 */
  2384	
  2385		p->start_time = ktime_get_ns();
  2386		p->start_boottime = ktime_get_boottime_ns();
  2387	
  2388		/*
  2389		 * Make it visible to the rest of the system, but dont wake it up yet.
  2390		 * Need tasklist lock for parent etc handling!
  2391		 */
  2392		write_lock_irq(&tasklist_lock);
  2393	
  2394		/* CLONE_PARENT re-uses the old parent */
  2395		if (clone_flags & (CLONE_PARENT|CLONE_THREAD)) {
  2396			p->real_parent = current->real_parent;
  2397			p->parent_exec_id = current->parent_exec_id;
  2398			if (clone_flags & CLONE_THREAD)
  2399				p->exit_signal = -1;
  2400			else
  2401				p->exit_signal = current->group_leader->exit_signal;
  2402		} else {
  2403			p->real_parent = current;
  2404			p->parent_exec_id = current->self_exec_id;
  2405			p->exit_signal = args->exit_signal;
  2406		}
> 2407		p->caba = current;
  2408	
  2409		klp_copy_process(p);
  2410	
  2411		sched_core_fork(p);
  2412	
  2413		spin_lock(&current->sighand->siglock);
  2414	
  2415		/*
  2416		 * Copy seccomp details explicitly here, in case they were changed
  2417		 * before holding sighand lock.
  2418		 */
  2419		copy_seccomp(p);
  2420	
  2421		rv_task_fork(p);
  2422	
  2423		rseq_fork(p, clone_flags);
  2424	
  2425		/* Don't start children in a dying pid namespace */
  2426		if (unlikely(!(ns_of_pid(pid)->pid_allocated & PIDNS_ADDING))) {
  2427			retval = -ENOMEM;
  2428			goto bad_fork_cancel_cgroup;
  2429		}
  2430	
  2431		/* Let kill terminate clone/fork in the middle */
  2432		if (fatal_signal_pending(current)) {
  2433			retval = -EINTR;
  2434			goto bad_fork_cancel_cgroup;
  2435		}
  2436	
  2437		init_task_pid_links(p);
  2438		if (likely(p->pid)) {
  2439			ptrace_init_task(p, (clone_flags & CLONE_PTRACE) || trace);
  2440	
  2441			init_task_pid(p, PIDTYPE_PID, pid);
  2442			if (thread_group_leader(p)) {
  2443				init_task_pid(p, PIDTYPE_TGID, pid);
  2444				init_task_pid(p, PIDTYPE_PGID, task_pgrp(current));
  2445				init_task_pid(p, PIDTYPE_SID, task_session(current));
  2446	
  2447				if (is_child_reaper(pid)) {
  2448					ns_of_pid(pid)->child_reaper = p;
  2449					p->signal->flags |= SIGNAL_UNKILLABLE;
  2450				}
  2451				p->signal->shared_pending.signal = delayed.signal;
  2452				p->signal->tty = tty_kref_get(current->signal->tty);
  2453				/*
  2454				 * Inherit has_child_subreaper flag under the same
  2455				 * tasklist_lock with adding child to the process tree
  2456				 * for propagate_has_child_subreaper optimization.
  2457				 */
  2458				p->signal->has_child_subreaper = p->real_parent->signal->has_child_subreaper ||
  2459								 p->real_parent->signal->is_child_subreaper;
  2460				list_add_tail(&p->sibling, &p->real_parent->children);
  2461				list_add_tail(&p->cabd, &p->caba->cabds);
  2462				list_add_tail_rcu(&p->tasks, &init_task.tasks);
  2463				attach_pid(p, PIDTYPE_TGID);
  2464				attach_pid(p, PIDTYPE_PGID);
  2465				attach_pid(p, PIDTYPE_SID);
  2466				__this_cpu_inc(process_counts);
  2467			} else {
  2468				current->signal->nr_threads++;
  2469				atomic_inc(&current->signal->live);
  2470				refcount_inc(&current->signal->sigcnt);
  2471				task_join_group_stop(p);
  2472				list_add_tail_rcu(&p->thread_group,
  2473						  &p->group_leader->thread_group);
  2474				list_add_tail_rcu(&p->thread_node,
  2475						  &p->signal->thread_head);
  2476			}
  2477			attach_pid(p, PIDTYPE_PID);
  2478			nr_threads++;
  2479		}
  2480		total_forks++;
  2481		hlist_del_init(&delayed.node);
  2482		spin_unlock(&current->sighand->siglock);
  2483		syscall_tracepoint_update(p);
  2484		write_unlock_irq(&tasklist_lock);
  2485	
  2486		if (pidfile)
  2487			fd_install(pidfd, pidfile);
  2488	
  2489		proc_fork_connector(p);
  2490		sched_post_fork(p);
  2491		cgroup_post_fork(p, args);
  2492		perf_event_fork(p);
  2493	
  2494		trace_task_newtask(p, clone_flags);
  2495		uprobe_copy_process(p, clone_flags);
  2496	
  2497		copy_oom_score_adj(clone_flags, p);
  2498	
  2499		return p;
  2500	
  2501	bad_fork_cancel_cgroup:
  2502		sched_core_free(p);
  2503		spin_unlock(&current->sighand->siglock);
  2504		write_unlock_irq(&tasklist_lock);
  2505		cgroup_cancel_fork(p, args);
  2506	bad_fork_put_pidfd:
  2507		if (clone_flags & CLONE_PIDFD) {
  2508			fput(pidfile);
  2509			put_unused_fd(pidfd);
  2510		}
  2511	bad_fork_free_pid:
  2512		if (pid != &init_struct_pid)
  2513			free_pid(pid);
  2514	bad_fork_cleanup_thread:
  2515		exit_thread(p);
  2516	bad_fork_cleanup_io:
  2517		if (p->io_context)
  2518			exit_io_context(p);
  2519	bad_fork_cleanup_namespaces:
  2520		exit_task_namespaces(p);
  2521	bad_fork_cleanup_mm:
  2522		if (p->mm) {
  2523			mm_clear_owner(p->mm, p);
  2524			mmput(p->mm);
  2525		}
  2526	bad_fork_cleanup_signal:
  2527		if (!(clone_flags & CLONE_THREAD))
  2528			free_signal_struct(p->signal);
  2529	bad_fork_cleanup_sighand:
  2530		__cleanup_sighand(p->sighand);
  2531	bad_fork_cleanup_fs:
  2532		exit_fs(p); /* blocking */
  2533	bad_fork_cleanup_files:
  2534		exit_files(p); /* blocking */
  2535	bad_fork_cleanup_semundo:
  2536		exit_sem(p);
  2537	bad_fork_cleanup_security:
  2538		security_task_free(p);
  2539	bad_fork_cleanup_audit:
  2540		audit_free(p);
  2541	bad_fork_cleanup_perf:
  2542		perf_event_free_task(p);
  2543	bad_fork_cleanup_policy:
  2544		lockdep_free_task(p);
  2545	#ifdef CONFIG_NUMA
  2546		mpol_put(p->mempolicy);
  2547	#endif
  2548	bad_fork_cleanup_delayacct:
  2549		delayacct_tsk_free(p);
  2550	bad_fork_cleanup_count:
  2551		dec_rlimit_ucounts(task_ucounts(p), UCOUNT_RLIMIT_NPROC, 1);
  2552		exit_creds(p);
  2553	bad_fork_free:
  2554		WRITE_ONCE(p->__state, TASK_DEAD);
  2555		exit_task_stack_account(p);
  2556		put_task_stack(p);
  2557		delayed_free_task(p);
  2558	fork_out:
  2559		spin_lock_irq(&current->sighand->siglock);
  2560		hlist_del_init(&delayed.node);
  2561		spin_unlock_irq(&current->sighand->siglock);
  2562		return ERR_PTR(retval);
  2563	}
  2564	

-- 
0-DAY CI Kernel Test Service
https://01.org/lkp



[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [NTFS 3]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [NTFS 3]     [Samba]     [Device Mapper]     [CEPH Development]

  Powered by Linux