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

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

 





On 09.09.2022 00:29, kernel test robot wrote:
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;

Not sure how to fix this error, we set real_parent to current just several lines above, but as I want to set caba to current in CLONE_PARENT case to see actual parent after CLONE_PARENT calls, and I can't take it from real_parent which is different in this case.

Note that I've updated this patch to v4, as for threads creation caba = current was not a desired behaviour.

   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	


--
Best regards, Tikhomirov Pavel
Software Developer, Virtuozzo.



[Index of Archives]     [Linux Kernel]     [Sparc Linux]     [DCCP]     [Linux ARM]     [Yosemite News]     [Linux SCSI]     [Linux x86_64]     [Linux for Ham Radio]

  Powered by Linux