From: Oleg Nesterov <oleg@redhat.com>
To: Jakub Jelinek <jakub@redhat.com>
Cc: Ulrich Drepper <drepper@redhat.com>,
Darren Hart <dvhltc@us.ibm.com>, Ingo Molnar <mingo@elte.hu>,
Linus Torvalds <torvalds@linux-foundation.org>,
Peter Zijlstra <a.p.zijlstra@chello.nl>,
Thomas Gleixner <tglx@linutronix.de>,
Andreas Schwab <schwab@redhat.com>, Danny Feng <dfeng@redhat.com>,
linux-kernel@vger.kernel.org,
Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Subject: Re: Q: sys_futex() && timespec_valid()
Date: Mon, 28 Jun 2010 17:02:08 +0200 [thread overview]
Message-ID: <20100628150208.GA13954@redhat.com> (raw)
In-Reply-To: <20100628143715.GJ25077@tyan-ft48-01.lab.bos.redhat.com>
On 06/28, Jakub Jelinek wrote:
>
> On Mon, Jun 28, 2010 at 03:58:25PM +0200, Oleg Nesterov wrote:
> > Honestly, it looks a bit strange to me that you blame the correct code,
>
> Whether that is correct or not is what is being disputed.
OK. I only argued with the "buggy" term. Once again, the code works
as expected.
> > and at the same time you ignore the test-case which hangs because the
> > kernel returns -EFAULT saying that this is the caller's problem.
>
> The userspace code reads the abstime->tv_nsec value, so if it wouldn't
> be valid address, the code would already segfault. And that's fine, POSIX
> certainly allows that, reporting EFAULT isn't required. Well, it doesn't
> read abstime->tv_sec in the assembly version, so if you try hard, you can
> avoid the segfault, yet get EFAULT from futex syscall by putting abstime
> 8 bytes before start of some page with previous page not mmapped.
And this is exactly what I did to prove that (in my opinion) libc needs
fixes anyway, even if we change the kernel to treat tv_sec < 0 specially.
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/mman.h>
pthread_rwlock_t rwlock;
static struct timespec *make_efault_ts(void)
{
int page_size = sysconf(_SC_PAGESIZE);
void *ptr = mmap(0, 2 * page_size, PROT_READ|PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
munmap(ptr, page_size);
return ptr + page_size - sizeof(long);
}
static void *thread_func(void *arg)
{
int ret = pthread_rwlock_timedwrlock(&rwlock, make_efault_ts());
printf("lock: ret=%d %m\n", ret);
return NULL;
}
int main(int argv, char *argc[])
{
pthread_t tid;
pthread_rwlock_init(&rwlock, NULL);
pthread_rwlock_wrlock(&rwlock);
pthread_create(&tid, NULL, thread_func, NULL);
pthread_join(tid, NULL);
return 0;
}
It may hang or segfault on your machine, this depends on libc version.
It hangs on the testing machine which also suffers from the reported
timespec_valid() issue. I did this test-case looking at
"objdump -d /lib64/libpthread.so".
To me, this looks like a bug in libc, but I won't insist.
Oleg.
next prev parent reply other threads:[~2010-06-28 15:04 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-06-25 19:20 Q: sys_futex() && timespec_valid() Oleg Nesterov
2010-06-25 19:42 ` Darren Hart
2010-06-25 19:49 ` Ulrich Drepper
2010-06-25 20:11 ` Thomas Gleixner
2010-06-28 13:58 ` Oleg Nesterov
2010-06-28 14:37 ` Jakub Jelinek
2010-06-28 15:02 ` Oleg Nesterov [this message]
2010-06-25 19:56 ` Mathieu Desnoyers
2010-06-25 19:59 ` Thomas Gleixner
2010-06-25 20:04 ` Ulrich Drepper
2010-06-25 20:25 ` Thomas Gleixner
2010-06-28 15:15 ` Linus Torvalds
2010-06-28 15:29 ` Andreas Schwab
2010-06-28 15:33 ` Thomas Gleixner
2010-06-28 16:04 ` Linus Torvalds
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=20100628150208.GA13954@redhat.com \
--to=oleg@redhat.com \
--cc=a.p.zijlstra@chello.nl \
--cc=dfeng@redhat.com \
--cc=drepper@redhat.com \
--cc=dvhltc@us.ibm.com \
--cc=jakub@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mathieu.desnoyers@efficios.com \
--cc=mingo@elte.hu \
--cc=schwab@redhat.com \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
/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.