diff --git a/src/plugins/posix/linux_aio_queue.cpp b/src/plugins/posix/linux_aio_queue.cpp index 0b4cebfa6..351e49c1e 100644 --- a/src/plugins/posix/linux_aio_queue.cpp +++ b/src/plugins/posix/linux_aio_queue.cpp @@ -28,8 +28,7 @@ linuxAioQueue::linuxAioQueue(int num_entries, nixl_xfer_op_t operation) ios(num_entries), num_entries(num_entries), num_ios_to_submit(0), - completed(num_entries), - num_completed(0), + num_ios_to_complete(0), operation(operation) { if (num_entries <= 0) { throw std::runtime_error("Invalid number of entries for AIO queue"); @@ -58,6 +57,11 @@ linuxAioQueue::submit(const nixl_meta_dlist_t &, const nixl_meta_dlist_t &) { return NIXL_IN_PROG; } + if (num_ios_to_complete) { + NIXL_ERROR << "previous submit is not completed"; + return NIXL_ERR_NOT_ALLOWED; + } + int ret = io_submit(io_ctx, num_ios_to_submit, ios_to_submit.data()); if (ret != num_ios_to_submit) { if (ret < 0) { @@ -69,14 +73,13 @@ linuxAioQueue::submit(const nixl_meta_dlist_t &, const nixl_meta_dlist_t &) { return NIXL_ERR_BACKEND; } - num_completed = 0; - num_ios_to_submit = 0; + num_ios_to_complete = ret; return NIXL_IN_PROG; } nixl_status_t linuxAioQueue::checkCompleted() { - if (num_completed == num_entries) { + if (!num_ios_to_complete) { return NIXL_SUCCESS; } @@ -91,20 +94,15 @@ linuxAioQueue::checkCompleted() { } for (int i = 0; i < rc; i++) { - struct iocb *io = events[i].obj; - size_t idx = (size_t)io->data; - - ios_to_submit[idx] = nullptr; // Mark as completed - if (events[i].res < 0) { NIXL_ERROR << "AIO operation failed: " << events[i].res; return NIXL_ERR_BACKEND; } } - num_completed += rc; + num_ios_to_complete -= rc; - return (num_completed == num_entries) ? NIXL_SUCCESS : NIXL_IN_PROG; + return num_ios_to_complete ? NIXL_IN_PROG : NIXL_SUCCESS; } nixl_status_t diff --git a/src/plugins/posix/linux_aio_queue.h b/src/plugins/posix/linux_aio_queue.h index 985b5f73e..4f48a3d00 100644 --- a/src/plugins/posix/linux_aio_queue.h +++ b/src/plugins/posix/linux_aio_queue.h @@ -32,8 +32,7 @@ class linuxAioQueue : public nixlPosixQueue { int num_entries; // Total number of entries expected std::vector ios_to_submit; // Array of I/Os to submit int num_ios_to_submit; // Total number of entries to submit - std::vector completed; // Track completed I/Os - int num_completed; // Number of completed operations + int num_ios_to_complete; // Total number of entries to complete nixl_xfer_op_t operation; // Whether this is a read operation // Delete copy and move operations