Patch "kernel/fork: fix CLONE_CHILD_CLEARTID regression in nscd" has been added to the 4.4-stable tree
Subsystems (4)
This is a note to let you know that I've just added the patch titled
kernel/fork: fix CLONE_CHILD_CLEARTID regression in nscd
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
kernel-fork-fix-clone_child_cleartid-regression-in-nscd.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
735f2770a770156100f534646158cb58cb8b2939Mon Sep 17 00:00:00 2001
From: Michal Hocko <[email protected]>
Date: Thu, 1 Sep 2016 16:15:13 -0700
Subject: kernel/fork: fix CLONE_CHILD_CLEARTID regression in nscd
From: Michal Hocko <[email protected]>
commit 735f2770a770156100f534646158cb58cb8b2939 upstream.
Commit fec1d0115240 ("[PATCH] Disable CLONE_CHILD_CLEARTID for abnormal exit") has caused a subtle regression in nscd which uses CLONE_CHILD_CLEARTID to clear the nscd_certainly_running flag in the shared databases, so that the clients are notified when nscd is restarted. Now, when nscd uses a non-persistent database, clients that have it mapped keep thinking the database is being updated by nscd, when in fact nscd has created a new (anonymous) one (for non-persistent databases it uses an unlinked file as backend).
The original proposal for the CLONE_CHILD_CLEARTID change claimed
(https://lkml.org/lkml/2006/10/25/233):
: The NPTL library uses the CLONE_CHILD_CLEARTID flag on clone() syscalls : on behalf of pthread_create() library calls. This feature is used to : request that the kernel clear the thread-id in user space (at an address : provided in the syscall) when the thread disassociates itself from the : address space, which is done in mm_release().
:
: Unfortunately, when a multi-threaded process incurs a core dump (such as : from a SIGSEGV), the core-dumping thread sends SIGKILL signals to all of : the other threads, which then proceed to clear their user-space tids : before synchronizing in exit_mm() with the start of core dumping. This : misrepresents the state of process's address space at the time of the : SIGSEGV and makes it more difficult for someone to debug NPTL and glibc : problems (misleading him/her to conclude that the threads had gone away : before the fault).
:
: The fix below is to simply avoid the CLONE_CHILD_CLEARTID action if a : core dump has been initiated.
The resulting patch from Roland (https://lkml.org/lkml/2006/10/26/269)
seems to have a larger scope than the original patch asked for. It seems that limitting the scope of the check to core dumping should work for SIGSEGV issue describe above.
--- kernel/fork.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)
kernel/fork.c +4 -6
@@ -901,14 +901,12 @@ void mm_release(struct task_struct *tsk,deactivate_mm (tsk, mm);/* -* If we're exiting normally, clear a user-space tid field if -* requested. We leave this alone when dying by signal, to leave -* the value intact in a core dump, and to save the unnecessary -* trouble, say, a killed vfork parent shouldn't touch this mm. -* Userland only wants this done for a sys_exit. +* Signal userspace if we're not exiting with a core dump +* because we want to leave the value intact for debugging +* purposes. */ if (tsk->clear_child_tid) { -if (!(tsk->flags &PF_SIGNALED ) && +if (!(tsk->signal->flags &SIGNAL_GROUP_COREDUMP ) &&atomic_read (&mm->mm_users) >1 ) {/* * We don't check the error code - if userspace has
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/kernel-fork-fix-clone_child_cleartid-regression-in-nscd.patch queue-4.4/mm-ksm-fix-endless-looping-in-allocating-memory-when-ksm-enable.patch