From: Igor Fedotov Date: Wed, 20 Mar 2024 18:27:41 +0000 (+0300) Subject: blk/aio: fix incomplete patch to get rid off aio_size X-Git-Tag: v18.2.5~234^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=6a39a1646b701ef280c8af03797825b600d1f0b0;p=ceph.git blk/aio: fix incomplete patch to get rid off aio_size Signed-off-by: Igor Fedotov (cherry picked from commit 8238b6086968d9da18081a14cfd00cc669ffc4ad) --- diff --git a/src/blk/aio/aio.cc b/src/blk/aio/aio.cc index e550165a9605..cb553b80bde2 100644 --- a/src/blk/aio/aio.cc +++ b/src/blk/aio/aio.cc @@ -29,18 +29,25 @@ int aio_queue_t::submit_batch(aio_iter begin, aio_iter end, struct aio_t *piocb[max_iodepth]; #endif int done = 0; - while (cur != end) { + int pushed = 0; //used for LIBAIO only + int pulled = 0; + while (cur != end || pushed < pulled) { #if defined(HAVE_LIBAIO) - int itemCount = 0; - while (cur != end && itemCount < max_iodepth) { + while (cur != end && pulled < max_iodepth) { cur->priv = priv; - piocb[itemCount] = &(*cur); - ++itemCount; + piocb[pulled] = &(*cur); + ++pulled; ++cur; } - r = io_submit(ctx, itemCount, (struct iocb**)piocb); + int toSubmit = pulled - pushed; + r = io_submit(ctx, toSubmit, (struct iocb**)(piocb + pushed)); + if (r >= 0 && r < toSubmit) { + pushed += r; + done += r; + r = -EAGAIN; + } #elif defined(HAVE_POSIXAIO) - cur->priv = priv + cur->priv = priv; if ((cur->n_aiocb == 1) { // TODO: consider batching multiple reads together with lio_listio cur->aio.aiocb.aio_sigevent.sigev_notify = SIGEV_KEVENT; @@ -69,6 +76,7 @@ int aio_queue_t::submit_batch(aio_iter begin, aio_iter end, done += r; attempts = 16; delay = 125; + pushed = pulled = 0; } return done; } diff --git a/src/blk/aio/aio.h b/src/blk/aio/aio.h index 0d8211e7858a..cf21c4167316 100644 --- a/src/blk/aio/aio.h +++ b/src/blk/aio/aio.h @@ -100,7 +100,7 @@ struct io_queue_t { virtual int init(std::vector &fds) = 0; virtual void shutdown() = 0; - virtual int submit_batch(aio_iter begin, aio_iter end, + virtual int submit_batch(aio_iter begin, aio_iter end, void *priv, int *retries) = 0; virtual int get_next_completed(int timeout_ms, aio_t **paio, int max) = 0; };