* 2.6.37.6 2.6.38.2 tst-aio4.c
@ 2011-03-28 18:05 Klaus Dittrich
2011-03-28 18:14 ` Roland Dreier
0 siblings, 1 reply; 7+ messages in thread
From: Klaus Dittrich @ 2011-03-28 18:05 UTC (permalink / raw)
To: linux-kernel
Reverting the patch of kernel/signal.c which was
applied to 2.6.37.6 and 2.6.38.2 solved the problem.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: 2.6.37.6 2.6.38.2 tst-aio4.c
2011-03-28 18:05 2.6.37.6 2.6.38.2 tst-aio4.c Klaus Dittrich
@ 2011-03-28 18:14 ` Roland Dreier
2011-03-29 14:32 ` Jiri Slaby
0 siblings, 1 reply; 7+ messages in thread
From: Roland Dreier @ 2011-03-28 18:14 UTC (permalink / raw)
To: Klaus Dittrich; +Cc: linux-kernel
On Mon, Mar 28, 2011 at 11:05 AM, Klaus Dittrich <kladit@arcor.de> wrote:
> Reverting the patch of kernel/signal.c which was
> applied to 2.6.37.6 and 2.6.38.2 solved the problem.
Indeed, I found that the same patch was to blame. Fix coming shortly.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: 2.6.37.6 2.6.38.2 tst-aio4.c
2011-03-28 18:14 ` Roland Dreier
@ 2011-03-29 14:32 ` Jiri Slaby
2011-03-29 21:07 ` Roland Dreier
0 siblings, 1 reply; 7+ messages in thread
From: Jiri Slaby @ 2011-03-29 14:32 UTC (permalink / raw)
To: Roland Dreier; +Cc: Klaus Dittrich, linux-kernel
On 03/28/2011 08:14 PM, Roland Dreier wrote:
> On Mon, Mar 28, 2011 at 11:05 AM, Klaus Dittrich <kladit@arcor.de> wrote:
>> Reverting the patch of kernel/signal.c which was
>> applied to 2.6.37.6 and 2.6.38.2 solved the problem.
>
> Indeed, I found that the same patch was to blame. Fix coming shortly.
Is there a patch for this already?
thanks,
--
js
^ permalink raw reply [flat|nested] 7+ messages in thread
* 2.6.37.6 2.6.38.2 tst-aio4.c
@ 2011-03-28 17:17 Klaus Dittrich
2011-03-28 18:05 ` Roland Dreier
0 siblings, 1 reply; 7+ messages in thread
From: Klaus Dittrich @ 2011-03-28 17:17 UTC (permalink / raw)
To: linux-kernel
[-- Attachment #1: Type: text/plain, Size: 171 bytes --]
With both kernels, 2.6.37.6 and 2.6.38.2 tst-aio4.c of glibc fails.
It successfully completes with 2.6.37.5 and 2.6.38.1 and before.
I appended the code for convinice.
[-- Attachment #2: tst-aio4.c --]
[-- Type: text/plain, Size: 3536 bytes --]
/* Test for completion signal handling.
Copyright (C) 2000,01,02 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <aio.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
/* We might need a bit longer timeout. */
#define TIMEOUT 10 /* sec */
int my_signo;
volatile sig_atomic_t flag;
static void
sighandler (const int signo)
{
flag = signo;
printf ("signo = %d\n",signo);
}
static int
wait_flag (void)
{
while (flag == 0)
{
puts ("Sleeping...");
sleep (1);
}
if (flag != my_signo)
{
printf ("signal handler received wrong signal, flag is %d\n", flag);
return 1;
}
return 0;
}
#ifndef SIGRTMIN
# define SIGRTMIN -1
# define SIGRTMAX -1
#endif
static int
do_test (int argc, char *argv[])
{
char name[] = "/tmp/aio4.XXXXXX";
int fd;
struct aiocb *arr[1];
struct aiocb cb;
static const char buf[] = "Hello World\n";
struct aioinit init = {10, 20, 0};
struct sigaction sa;
struct sigevent ev;
if (SIGRTMIN == -1)
{
printf ("RT signals not supported.\n");
return 0;
}
/* Select a signal from the middle of the available choices... */
my_signo = (SIGRTMAX + SIGRTMIN) / 2;
fd = mkstemp (name);
if (fd == -1)
{
printf ("cannot open temp name: %m\n");
return 1;
}
unlink (name);
/* Test also aio_init. */
aio_init (&init);
arr[0] = &cb;
cb.aio_fildes = fd;
cb.aio_lio_opcode = LIO_WRITE;
cb.aio_reqprio = 0;
cb.aio_buf = (void *) buf;
cb.aio_nbytes = sizeof (buf) - 1;
cb.aio_offset = 0;
cb.aio_sigevent.sigev_notify = SIGEV_SIGNAL;
cb.aio_sigevent.sigev_notify_function = NULL;
cb.aio_sigevent.sigev_notify_attributes = NULL;
cb.aio_sigevent.sigev_signo = my_signo;
cb.aio_sigevent.sigev_value.sival_ptr = NULL;
ev.sigev_notify = SIGEV_SIGNAL;
ev.sigev_notify_function = NULL;
ev.sigev_notify_attributes = NULL;
ev.sigev_signo = my_signo;
sa.sa_handler = sighandler;
sigemptyset (&sa.sa_mask);
sa.sa_flags = SA_RESTART;
if (sigaction (my_signo, &sa, NULL) < 0)
{
printf ("sigaction failed: %m\n");
return 1;
}
flag = 0;
/* First use aio_write. */
if (aio_write (arr[0]) < 0)
{
if (errno == ENOSYS)
{
puts ("no aio support in this configuration");
return 0;
}
printf ("aio_write failed: %m\n");
return 1;
}
if (wait_flag ())
return 1;
puts ("aio_write OK");
flag = 0;
/* Again with lio_listio. */
if (lio_listio (LIO_NOWAIT, arr, 1, &ev) < 0)
{
printf ("lio_listio failed: %m\n");
return 1;
}
if (wait_flag ())
return 1;
puts ("all OK");
return 0;
}
int main(int argc, char *argv[]) {
do_test (argc, argv);
}
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: 2.6.37.6 2.6.38.2 tst-aio4.c
2011-03-28 17:17 Klaus Dittrich
@ 2011-03-28 18:05 ` Roland Dreier
0 siblings, 0 replies; 7+ messages in thread
From: Roland Dreier @ 2011-03-28 18:05 UTC (permalink / raw)
To: Klaus Dittrich; +Cc: linux-kernel
On Mon, Mar 28, 2011 at 10:17 AM, Klaus Dittrich <kladit@arcor.de> wrote:
> With both kernels, 2.6.37.6 and 2.6.38.2 tst-aio4.c of glibc fails.
>
> It successfully completes with 2.6.37.5 and 2.6.38.1 and before.
>
> I appended the code for convinice.
I took a quick look at this, and indeed the program succeeds on 2.6.38
but fails on the latest tip of Linus's tree. I'm pretty sure that the obvious
place to look, my patch "aio: wake all waiters when destroying ctx" is not
to blame, both because the patch is obviously correct :) and also because
this test is using the glibc aio implementation, which doesn't use the
kernel's aio code at all.
Indeed, an strace of the program shows that on old kernels, the child thread
does
rt_sigqueueinfo(16143, SIGRT_17, {si_signo=SIGRT_17,
si_code=SI_ASYNCIO, si_pid=16143, si_uid=1000, si_value={int=0,
ptr=0}}) = 0
while on the new kernel, it gets EPERM:
rt_sigqueueinfo(17198, SIGRT_17, {si_signo=SIGRT_17,
si_code=SI_ASYNCIO, si_pid=17198, si_uid=1000, si_value={int=0,
ptr=0}}) = -1 EPERM (Operation not permitted)
I'll take a look to see which -stable patch might be to blame.
- R.
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2011-03-31 10:57 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-03-28 18:05 2.6.37.6 2.6.38.2 tst-aio4.c Klaus Dittrich
2011-03-28 18:14 ` Roland Dreier
2011-03-29 14:32 ` Jiri Slaby
2011-03-29 21:07 ` Roland Dreier
2011-03-31 10:57 ` Jiri Slaby
-- strict thread matches above, loose matches on Subject: below --
2011-03-28 17:17 Klaus Dittrich
2011-03-28 18:05 ` Roland Dreier
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox