• Oleg Nesterov's avatar
    signals: make task_struct->signal immutable/refcountable · ea6d290c
    Oleg Nesterov authored
    We have a lot of problems with accessing task_struct->signal, it can
    "disappear" at any moment.  Even current can't use its ->signal safely
    after exit_notify().  ->siglock helps, but it is not convenient, not
    always possible, and sometimes it makes sense to use task->signal even
    after this task has already dead.
    
    This patch adds the reference counter, sigcnt, into signal_struct.  This
    reference is owned by task_struct and it is dropped in
    __put_task_struct().  Perhaps it makes sense to export
    get/put_signal_struct() later, but currently I don't see the immediate
    reason.
    
    Rename __cleanup_signal() to free_signal_struct() and unexport it.  With
    the previous changes it does nothing except kmem_cache_free().
    
    Change __exit_signal() to not clear/free ->signal, it will be freed when
    the last reference to any thread in the thread group goes away.
    
    Note:
    	- when the last thead exits signal->tty can point to nowhere, see
    	  the next patch.
    
    	- with or without this patch signal_struct->count should go away,
    	  or at least it should be "int nr_threads" for fs/proc. This will
    	  be addressed later.
    Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
    Cc: Alan Cox <alan@linux.intel.com>
    Cc: Ingo Molnar <mingo@elte.hu>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Acked-by: default avatarRoland McGrath <roland@redhat.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    ea6d290c
exit.c 43.8 KB