The problem is that my block driver doesn't use aphysio. I figure that
the block layer should isolate my driver from character driver entry
points (read, aread, write and awrite). In fact when I run the below
program with the delay, I only see the strategy routine getting called
(along with the open, getinfo & close).
I filled out the aread and awrite entry points with asyncio, but none of
it ever got called.
When I panic my system and the box recovers, I can see that the panic
occurred in my strategy command while accessing the passed in *struct
buf*. I assume that the aio_cancel64 de-allocated the structure and
accessing it is no longer valid.
I incorrectly said earlier that my system "hung", it doesn't hang, it
panics. FWIW.
-Adam
Garrett D'Amore wrote:
> If you read the man page for aphysio, you'll find that you have to use
> anocancel() in your driver entry point, because cancellation is not
> supported. You'll see that "sd" for example does this.
>
> - Garrett
>
> 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
>> [email protected]
>> http://mail.opensolaris.org/mailman/listinfo/driver-discuss
>>
>>
>
>
_______________________________________________
driver-discuss mailing list
[email protected]
http://mail.opensolaris.org/mailman/listinfo/driver-discuss