Messages in this thread Patch in this message | ![/](/images/icornerl.gif) | | Date | Mon, 24 Nov 2003 15:12:49 +0530 | From | Suparna Bhattacharya <> | Subject | Re: 2.6.0-test9-mm3 - AIO test results |
| |
On Tue, Nov 18, 2003 at 03:47:53PM -0800, Daniel McNeil wrote: > Suparna, > > I was unable to reproduce the hang in io_submit() without your patch. > I ran aiocp with 1k i/o size constantly for 2 hours and it never hung. > > I re-ran with your patch with both as-iosched and deadline and both > hung in io_submit(). aiocp would run a few times, but I put the > aiocp in a while loop and it hung on the 1st or 2nd time. It > did get most of the way through copying the file before hanging. > This is on a 2-proc to ide disks running ext3. >
Found one race ... not sure if its the one causing the hangs you see. The attached patch is not a complete fix (there is one other race to close), but it would be interesting to see if this makes any difference for you.
Regards Suparna
-- Suparna Bhattacharya (suparna@in.ibm.com) Linux Technology Center IBM Software Labs, India
------------------------------------------------------ Don't access dio fields if its possible that the dio could already have been freed asynchronously during i/o completion. Fixme: This still leaves a window between decrement of bio_count and accessing dio->waiter during i/o completion wherein the dio could get freed by the submission path.
--- pure-mm3/fs/direct-io.c 2003-11-24 13:00:33.000000000 +0530 +++ linux-2.6.0-test9-mm3/fs/direct-io.c 2003-11-24 14:15:30.000000000 +0530 @@ -994,14 +995,17 @@ * reflect the number of to-be-processed BIOs. */ if (dio->is_async) { - if (ret == 0) - ret = dio->result; - if (ret > 0 && dio->result < dio->size && rw == WRITE) { + int should_wait = 0; + + if (dio->result < dio->size && rw == WRITE) { dio->waiter = current; + should_wait = 1; } + if (ret == 0) + ret = dio->result; finished_one_bio(dio); /* This can free the dio */ blk_run_queues(); - if (dio->waiter) { + if (should_wait) { /* * Wait for already issued I/O to drain out and * release its references to user-space pages @@ -1013,7 +1017,7 @@ set_current_state(TASK_UNINTERRUPTIBLE); } set_current_state(TASK_RUNNING); - dio->waiter = NULL; + kfree(dio); } } else { finished_one_bio(dio); - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| ![\](/images/icornerr.gif) |