• O
    pids: init_struct_pid.tasks should never see the swapper process · f2001145
    Oleg Nesterov 提交于
    "statically initialize struct pid for swapper" commit 820e45db says:
    
    	Statically initialize a struct pid for the swapper process (pid_t == 0)
    	and attach it to init_task.  This is needed so task_pid(), task_pgrp()
    	and task_session() interfaces work on the swapper process also.
    
    OK, but:
    
    	- it doesn't make sense to add init_task.pids[].node into
    	  init_struct_pid.tasks[], and in fact this just wrong.
    
    	  idle threads are special, they shouldn't be visible on any
    	  global list. In particular do_each_pid_task(init_struct_pid)
    	  shouldn't see swapper.
    
    	  This is the actual reason why kill(0, SIGKILL) from /sbin/init
    	  (which starts with 0,0 special pids) crashes the kernel. The
    	  signal sent to pgid/sid == 0 must never see idle threads, even
    	  if the previous patch fixed the crash itself.
    
    	- we have other idle threads running on the non-boot CPUs, see
    	  the next patch.
    
    Change INIT_STRUCT_PID/INIT_PID_LINK to create the empty/unhashed
    hlist_head/hlist_node. Like any other idle thread swapper can never exit,
    so detach_pid()->__hlist_del() is not possible, but we could change
    INIT_PID_LINK() to set pprev = &next if needed.
    
    All we need is the valid swapper->pids[].pid == &init_struct_pid.
    Reported-by: NMathias Krause <mathias.krause@secunet.com>
    Signed-off-by: NOleg Nesterov <oleg@redhat.com>
    Cc: Cedric Le Goater <clg@fr.ibm.com>
    Cc: Dave Hansen <haveblue@us.ibm.com>
    Cc: Eric Biederman <ebiederm@xmission.com>
    Cc: Herbert Poetzl <herbert@13thfloor.at>
    Cc: Mathias Krause <Mathias.Krause@secunet.com>
    Acked-by: NRoland McGrath <roland@redhat.com>
    Acked-by: NSerge Hallyn <serue@us.ibm.com>
    Cc: Sukadev Bhattiprolu <sukadev@us.ibm.com>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    f2001145
init_task.h 5.2 KB