https://github.com/torvalds/linux
Revision 735f2770a770156100f534646158cb58cb8b2939 authored by Michal Hocko on 01 September 2016, 23:15:13 UTC, committed by Linus Torvalds on 02 September 2016, 00:52:02 UTC
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.

[Changelog partly based on Andreas' description]
Fixes: fec1d0115240 ("[PATCH] Disable CLONE_CHILD_CLEARTID for abnormal exit")
Link: http://lkml.kernel.org/r/1471968749-26173-1-git-send-email-mhocko@kernel.org
Signed-off-by: Michal Hocko <mhocko@suse.com>
Tested-by: William Preston <wpreston@suse.com>
Acked-by: Oleg Nesterov <oleg@redhat.com>
Cc: Roland McGrath <roland@hack.frob.com>
Cc: Andreas Schwab <schwab@suse.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent c4e2973
History
Tip revision: 735f2770a770156100f534646158cb58cb8b2939 authored by Michal Hocko on 01 September 2016, 23:15:13 UTC
kernel/fork: fix CLONE_CHILD_CLEARTID regression in nscd
Tip revision: 735f277
File Mode Size
9p
adfs
affs
afs
autofs4
befs
bfs
btrfs
cachefiles
ceph
cifs
coda
configfs
cramfs
crypto
debugfs
devpts
dlm
ecryptfs
efivarfs
efs
exofs
exportfs
ext2
ext4
f2fs
fat
freevxfs
fscache
fuse
gfs2
hfs
hfsplus
hostfs
hpfs
hugetlbfs
isofs
jbd2
jffs2
jfs
kernfs
lockd
logfs
minix
ncpfs
nfs
nfs_common
nfsd
nilfs2
nls
notify
ntfs
ocfs2
omfs
openpromfs
orangefs
overlayfs
proc
pstore
qnx4
qnx6
quota
ramfs
reiserfs
romfs
squashfs
sysfs
sysv
tracefs
ubifs
udf
ufs
xfs
Kconfig -rw-r--r-- 7.1 KB
Kconfig.binfmt -rw-r--r-- 7.1 KB
Makefile -rw-r--r-- 4.3 KB
aio.c -rw-r--r-- 43.0 KB
anon_inodes.c -rw-r--r-- 4.9 KB
attr.c -rw-r--r-- 8.5 KB
bad_inode.c -rw-r--r-- 4.7 KB
binfmt_aout.c -rw-r--r-- 10.7 KB
binfmt_elf.c -rw-r--r-- 60.8 KB
binfmt_elf_fdpic.c -rw-r--r-- 46.9 KB
binfmt_em86.c -rw-r--r-- 2.8 KB
binfmt_flat.c -rw-r--r-- 27.8 KB
binfmt_misc.c -rw-r--r-- 18.3 KB
binfmt_script.c -rw-r--r-- 3.0 KB
block_dev.c -rw-r--r-- 47.9 KB
buffer.c -rw-r--r-- 90.4 KB
char_dev.c -rw-r--r-- 13.4 KB
compat.c -rw-r--r-- 37.3 KB
compat_binfmt_elf.c -rw-r--r-- 3.7 KB
compat_ioctl.c -rw-r--r-- 45.7 KB
coredump.c -rw-r--r-- 20.6 KB
dax.c -rw-r--r-- 34.6 KB
dcache.c -rw-r--r-- 93.5 KB
dcookies.c -rw-r--r-- 6.9 KB
direct-io.c -rw-r--r-- 38.5 KB
drop_caches.c -rw-r--r-- 1.6 KB
eventfd.c -rw-r--r-- 12.9 KB
eventpoll.c -rw-r--r-- 60.1 KB
exec.c -rw-r--r-- 43.6 KB
fcntl.c -rw-r--r-- 16.7 KB
fhandle.c -rw-r--r-- 6.5 KB
file.c -rw-r--r-- 23.5 KB
file_table.c -rw-r--r-- 8.5 KB
filesystems.c -rw-r--r-- 6.4 KB
fs-writeback.c -rw-r--r-- 70.4 KB
fs_pin.c -rw-r--r-- 2.0 KB
fs_struct.c -rw-r--r-- 3.3 KB
inode.c -rw-r--r-- 53.3 KB
internal.h -rw-r--r-- 4.1 KB
ioctl.c -rw-r--r-- 17.1 KB
iomap.c -rw-r--r-- 12.3 KB
libfs.c -rw-r--r-- 30.7 KB
locks.c -rw-r--r-- 71.5 KB
mbcache.c -rw-r--r-- 11.9 KB
mount.h -rw-r--r-- 3.5 KB
mpage.c -rw-r--r-- 20.6 KB
namei.c -rw-r--r-- 119.6 KB
namespace.c -rw-r--r-- 81.6 KB
no-block.c -rw-r--r-- 688 bytes
nsfs.c -rw-r--r-- 3.7 KB
open.c -rw-r--r-- 27.0 KB
pipe.c -rw-r--r-- 26.6 KB
pnode.c -rw-r--r-- 11.3 KB
pnode.h -rw-r--r-- 1.8 KB
posix_acl.c -rw-r--r-- 20.5 KB
proc_namespace.c -rw-r--r-- 7.8 KB
read_write.c -rw-r--r-- 39.3 KB
readdir.c -rw-r--r-- 7.3 KB
select.c -rw-r--r-- 25.5 KB
seq_file.c -rw-r--r-- 22.5 KB
signalfd.c -rw-r--r-- 9.2 KB
splice.c -rw-r--r-- 46.2 KB
stack.c -rw-r--r-- 2.5 KB
stat.c -rw-r--r-- 11.9 KB
statfs.c -rw-r--r-- 5.3 KB
super.c -rw-r--r-- 36.6 KB
sync.c -rw-r--r-- 9.9 KB
timerfd.c -rw-r--r-- 13.2 KB
userfaultfd.c -rw-r--r-- 35.3 KB
utimes.c -rw-r--r-- 5.9 KB
xattr.c -rw-r--r-- 23.5 KB

back to top