Re: [PATCH 3/22] Refcounting fixes

From: Suparna Bhattacharya
Date: Fri Jul 02 2004 - 08:07:18 EST


On Fri, Jul 02, 2004 at 06:30:30PM +0530, Suparna Bhattacharya wrote:
> The patchset contains modifications and fixes to the AIO core
> to support the full retry model, an implementation of AIO
> support for buffered filesystem AIO reads and O_SYNC writes
> (the latter courtesy O_SYNC speedup changes from Andrew Morton),
> an implementation of AIO reads and writes to pipes (from
> Chris Mason) and AIO poll (again from Chris Mason).
>
> Full retry infrastructure and fixes
> [1] aio-retry.patch
> [2] 4g4g-aio-hang-fix.patch
> [3] aio-retry-elevated-refcount.patch

Refcounting fixes from Daniel McNeil.

Regards
Suparna
--
Suparna Bhattacharya (suparna@xxxxxxxxxx)
Linux Technology Center
IBM Software Lab, India


From: Daniel McNeil <daniel@xxxxxxxx>

Here is the patch for AIO retry to hold an extra ref count. The patch is
small, but I wanted to make sure it was safe.

I spent time looking over the retry code and this patch looks ok to me. It
is potentially calling put_ioctx() while holding ctx->ctx_lock, I do not
think that will cause any problems. This should never be the last reference
on the ioctx anyway, since the loop is checking list_empty(&ctx->run_list).
The first ref is taken in sys_io_setup() and last removed in io_destroy().
It also looks like holding ctx->ctx_lock prevents any races between any
retries and an io_destroy() which would try to cancel all iocbs.

I've tested this on my 2-proc by coping a raw partitions and copying ext3
files using using AIO and O_DIRECT, O_SYNC, and both.


fs/aio.c | 9 +++++++--
1 files changed, 7 insertions(+), 2 deletions(-)

--- aio/fs/aio.c 2004-06-17 12:37:49.946161352 -0700
+++ aio-retry-elevated-refcount/fs/aio.c 2004-06-17 13:12:07.795320728 -0700
@@ -764,14 +764,19 @@ out:
static void __aio_run_iocbs(struct kioctx *ctx)
{
struct kiocb *iocb;
- ssize_t ret;
int count = 0;

while (!list_empty(&ctx->run_list)) {
iocb = list_entry(ctx->run_list.next, struct kiocb,
ki_run_list);
list_del(&iocb->ki_run_list);
- ret = aio_run_iocb(iocb);
+ /*
+ * Hold an extra reference while retrying i/o.
+ */
+ iocb->ki_users++; /* grab extra reference */
+ aio_run_iocb(iocb);
+ if (__aio_put_req(ctx, iocb)) /* drop extra ref */
+ put_ioctx(ctx);
count++;
}
aio_run++;
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/