Date: Thu, 27 Jan 2000 10:54:07 -0800 From: "Scott Hess" <scott@avantgo.com> To: "Matthew Dillon" <dillon@apollo.backplane.com> Cc: <freebsd-hackers@FreeBSD.ORG> Subject: Re: aio_read crashing certain kernels. Message-ID: <073d01bf68f7$e3ca25b0$1e80000a@avantgo.com> References: <01b301bf6824$46e928a0$1e80000a@avantgo.com> <200001262330.PAA16635@apollo.backplane.com> <066e01bf6877$02deb550$1e80000a@avantgo.com> <200001270457.UAA18887@apollo.backplane.com>
next in thread | previous in thread | raw e-mail | index | archive | help
"Matthew Dillon" <dillon@apollo.backplane.com> wrote: > This is an incredibly scary program! OK, so I was facetious in including that program - my basic point was that it doesn't happen when I'm doing anything weird, it happens with the most straightforward aio_read program imaginable. Furthermore, it works on the uniprocessor/EIDE/standard-kernel machine, it doesn't on the SMP/Adaptec/custom-kernel machine. I've included another version of the program which I've used to actually kill a machine, repeatedly. > It's sending an iocb to aio_read > and then pops the stack and exits. The act of exiting could very well > scribble all over the iocb structure while the I/O is in progress and, > of course, then the program invalidates the stack and exits. ??? The problem is that I'm locking up the entire box, hard enough this morning that I had to pull the plug to get it back. If all I got were a coredump, I'd be over on freebsd-questions trying to figure out how it was that I misunderstood the problem. [Actually, I think this did cause my original posting to work right, because the process exitting probably caused the aio stuff to either error out or work correctly :-).] > You could be right about the SMP build --- the aio code is indeed > doing a fork with RFMEM and that *WILL* break under SMP. The weird thing is, rfork() on SMP returns ENOTSUPP - it doesn't work, but it doesn't break, either. Here's the program. I've found that it actually sometimes works, but I haven't been able to figure out why. It seems to have something to do with whether the file might be in the buffer cache or not (so it helps to pass a file which hasn't been accessed in awhile). Also, if I change the #if 1 to #if 0, it seems to work just fine. My suspicion is that it could be an SMP issue, and if I'm lucky, everything executes on a single CPU and works. If I'm unlucky, BAM! The code that I'm really hacking on does a lot of reads from widely placed sections of a file, and thus is more likely to hit the problem (if someone really really really wants that program, I can try to hack it into postable shape, but the enclosed program does the job for me). Again, the symptoms of a problem are that the entire box locks up so hard that you have to power cycle it at best, or pull the plug at worst. #include <fcntl.h> #include <aio.h> #include <errno.h> void main( int argc, char **argv) { int fd=open( argc>1 ? argv[1] : "/usr/tmp/aiotest.c", O_RDONLY); char buf[ 1024]; struct aiocb iocb; sigset_t sigset; if( fd==-1) { perror( "opening"); } bzero( &iocb, sizeof( iocb)); iocb.aio_fildes=fd; iocb.aio_offset=0; iocb.aio_buf=buf; iocb.aio_nbytes=sizeof( buf); iocb.aio_sigevent.sigev_notify=SIGEV_SIGNAL; iocb.aio_sigevent.sigev_signo=SIGIO; #if 1 if( aio_read( &iocb)==-1) { perror( "aio_read"); } while( aio_error( &iocb)==EINPROGRESS); #else printf( "aio_read\n"); if( aio_read( &iocb)==-1) { perror( "aio_read"); } do { printf( "aio_error\n"); } while( aio_error( &iocb)==EINPROGRESS); #endif printf( "en==%d\n", aio_error( &iocb)); printf( "rc==%d\n", aio_return( &iocb)); } To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?073d01bf68f7$e3ca25b0$1e80000a>