[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <5a09fae7-8430-9bca-b112-6d489b7d3e5b@virtuozzo.com>
Date: Fri, 9 Sep 2022 01:15:32 +0300
From: Pavel Tikhomirov <ptikhomirov@...tuozzo.com>
To: kernel test robot <lkp@...el.com>,
Eric Biederman <ebiederm@...ssion.com>,
Alexander Viro <viro@...iv.linux.org.uk>,
Christian Brauner <brauner@...nel.org>,
Andrei Vagin <avagin@...gle.com>, linux-kernel@...r.kernel.org
Cc: kbuild-all@...ts.01.org, Kees Cook <keescook@...omium.org>,
Ingo Molnar <mingo@...hat.com>,
Peter Zijlstra <peterz@...radead.org>,
Juri Lelli <juri.lelli@...hat.com>,
Vincent Guittot <vincent.guittot@...aro.org>,
Dietmar Eggemann <dietmar.eggemann@....com>,
Steven Rostedt <rostedt@...dmis.org>,
Ben Segall <bsegall@...gle.com>, Mel Gorman <mgorman@...e.de>,
Daniel Bristot de Oliveira <bristot@...hat.com>,
Valentin Schneider <vschneid@...hat.com>,
Andrew Morton <akpm@...ux-foundation.org>,
Linux Memory Management List <linux-mm@...ck.org>,
linux-ia64@...r.kernel.org, linux-fsdevel@...r.kernel.org,
kernel@...nvz.org
Subject: Re: [PATCH v3 1/2] Add CABA tree to task_struct
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@intel.com/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@...el.com>
>
> 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(¤t->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(¤t->signal->live);
> 2470 refcount_inc(¤t->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(¤t->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(¤t->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(¤t->sighand->siglock);
> 2560 hlist_del_init(&delayed.node);
> 2561 spin_unlock_irq(¤t->sighand->siglock);
> 2562 return ERR_PTR(retval);
> 2563 }
> 2564
>
--
Best regards, Tikhomirov Pavel
Software Developer, Virtuozzo.
Powered by blists - more mailing lists