From: Oleg Nesterov <oleg@redhat.com>
To: Denys Vlasenko <vda.linux@googlemail.com>
Cc: Tejun Heo <tj@kernel.org>,
Linus Torvalds <torvalds@linux-foundation.org>,
indan@nul.nu, bdonlan@gmail.com, linux-kernel@vger.kernel.org,
jan.kratochvil@redhat.com, akpm@linux-foundation.org
Subject: Re: thread leader death under strace (was Re: [PATCH 03/10] ptrace: implement PTRACE_SEIZE)
Date: Sat, 4 Jun 2011 17:27:26 +0200 [thread overview]
Message-ID: <20110604152726.GA5734@redhat.com> (raw)
In-Reply-To: <201106032010.03947.vda.linux@googlemail.com>
On 06/03, Denys Vlasenko wrote:
>
> On Friday 03 June 2011 17:29, Oleg Nesterov wrote:
> > > > > > thread_leader(void *unused)
> > > > > > {
> > > > > > /* malloc gives sufficiently aligned buffer.
> > > > > > * long buf[] does not! (on ia64).
> > > > > > */
> > > > > > clone2(thread1, malloc(16 * 1024), 16 * 1024, 0
> > > > >
> > > > > Probably because of this clone2.
> > >
> > > This seems to be not a problem (it is defined to clone()).
> >
> > Doesn't matter.
> >
> > Unlike pthread_create() which uses CLONE_SETTLS, this doesn't setup
> > the tls area, and I assume you used -lpthread. In this case it is clear
> > why raise() doesn't work, pt-raise.c thinks that THREAD_GETMEM(tid)
> > should always work.
>
> I don't link against pthread.
Hmm. OK, I was wrong, I thought that the !pt version in raise.c should
work because it does
selftid = THREAD_GETMEM(tid);
if (!selftid) {
selftid = sys_gettid();
THREAD_GETMEM(tid) = selftid;
}
and thus uses the correct tid. But it doesn't work because it uses the
wrong _pid_ by the same reason (tls). It rechecks THREAD_GETMEM(tid)
but not THREAD_GETMEM(pid), then it does
if (!pid)
pid = selftid;
and tgkill() correctly fails again.
Heh,
int tfunc(void *unused)
{
raise(SIGKILL);
printf("WTF? SIGKILL doesn't work\n");
printf("thread: tgid = %d\n", getpid());
exit(0);
}
char stack[32 * 1024];
int main(void)
{
printf("main: tgid = %ld\n", syscall(__NR_getpid));
clone(tfunc, stack + sizeof(stack)/2,
CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_THREAD,
NULL);
pause();
assert(0);
return 0;
}
prints
main: tgid = 5959
WTF? SIGKILL doesn't work
thread: tgid = 5960
on my machine. Note that if the main thread uses getpid() (which caches
the returned value in THREAD_GETMEM) instead of syscall, everything works.
And if you remove raise() from tfunc(), the thread prints the correct tgid.
This is because raise() fills THREAD_GETMEM(tid) which is used (why???) by
really_getpid() before sys_getpid().
Funny that...
On your machine you can have the different results, my glibc is rather
old. Anyway, I think we can conclude that there is no kernel bug involved.
I am not brave enough to contact glibc developers, may be you can ;)
Oleg.
prev parent reply other threads:[~2011-06-04 15:29 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-06-02 15:33 thread leader death under strace (was Re: [PATCH 03/10] ptrace: implement PTRACE_SEIZE) Denys Vlasenko
2011-06-02 16:36 ` Oleg Nesterov
2011-06-02 16:39 ` Oleg Nesterov
2011-06-02 22:26 ` Denys Vlasenko
2011-06-03 15:29 ` Oleg Nesterov
2011-06-03 18:10 ` Denys Vlasenko
2011-06-04 15:27 ` Oleg Nesterov [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20110604152726.GA5734@redhat.com \
--to=oleg@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=bdonlan@gmail.com \
--cc=indan@nul.nu \
--cc=jan.kratochvil@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=tj@kernel.org \
--cc=torvalds@linux-foundation.org \
--cc=vda.linux@googlemail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.