Just a few quick ideas: have you checked the return value from aio_cancel? Different timing conditions are indicated with different return values.
What does aio_sigevent == 0 mean? You say "hang the system"...does that mean "the process", or the entire system? Can you still ping the system? Does it respond to kmdb? Does it ever recover? In the cases where you hang the system, has the driver received any awrite calls? has it processed any of them? Adam Chunn wrote: > Driver list, > > I have an issue I can't figure out. Any help would be appreciated. > > I have written a block driver that works in most cases except one: using > aio_cancel64 to cancel pending DMA(s). > > If I run the program below compiled with "gcc test.c", my system hangs. > This test is queuing 16 asynchronous DMAs to the block layer. It then > immediately cancels all DMAs. > > If I run the program below compiled with "gcc -DADD_DELAY=1 test.c" my > system does not hang. In this case the added delay is allowing all the > pending DMAs to complete prior to calling aio_cancel64. > > I figure I don't have some aio_cancel hook filled out in my driver. As > far as I can tell -- nothing like that exists. Can anyone shed light on > what I need to do to support aio_cancel64? > > -Adam > > > > #define BUF_SIZE 8*1024*1024 > #define NUM_IOS 16 > > int main(int argc, char **argv) { > struct aiocb64 aiocb[NUM_IOS]; > char *ptr, *buf; > int fd, st, ii; > > ptr = malloc(NUM_IOS * BUF_SIZE); > memset(ptr, 0, NUM_IOS * BUF_SIZE); > > #ifdef ADD_DELAY > printf("Adding delay\n"); > #endif > > fd = open("/dev/dsk/c9d0s0", O_RDWR | O_LARGEFILE | O_SYNC); > > memset(aiocb, 0, sizeof(aiocb)); > buf = ptr; > > for (ii = 0; ii < NUM_IOS; ii++) { > aiocb[ii].aio_fildes = fd; > aiocb[ii].aio_buf = buf; > aiocb[ii].aio_offset = ii * BUF_SIZE; > aiocb[ii].aio_nbytes = BUF_SIZE; > > aio_write64(&aiocb[ii]); > buf += BUF_SIZE; > } > > #ifdef ADD_DELAY > sleep(2); > #endif > > aio_cancel64(fd, NULL); > > close(fd); > free(ptr); > > return 0; > } > > > > ------------------------------------------------------------------------ > > _______________________________________________ > driver-discuss mailing list > driver-discuss@opensolaris.org > http://mail.opensolaris.org/mailman/listinfo/driver-discuss _______________________________________________ driver-discuss mailing list driver-discuss@opensolaris.org http://mail.opensolaris.org/mailman/listinfo/driver-discuss