From: Pan Liu Date: Wed, 19 Jul 2017 03:51:24 +0000 (+0800) Subject: aio: move aio.h/cc from fs dir to bluestore dir X-Git-Tag: v12.1.2~198^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F16409%2Fhead;p=ceph.git aio: move aio.h/cc from fs dir to bluestore dir Signed-off-by: Pan Liu --- diff --git a/src/os/CMakeLists.txt b/src/os/CMakeLists.txt index 5edbb2db96a8..a98fe1db0606 100644 --- a/src/os/CMakeLists.txt +++ b/src/os/CMakeLists.txt @@ -16,8 +16,7 @@ set(libos_srcs memstore/MemStore.cc kstore/KStore.cc kstore/kstore_types.cc - fs/FS.cc - fs/aio.cc) + fs/FS.cc) if(HAVE_LIBAIO) list(APPEND libos_srcs @@ -34,6 +33,7 @@ if(HAVE_LIBAIO) bluestore/StupidAllocator.cc bluestore/BitMapAllocator.cc bluestore/BitAllocator.cc + bluestore/aio.cc ) endif(HAVE_LIBAIO) diff --git a/src/os/bluestore/BlockDevice.h b/src/os/bluestore/BlockDevice.h index f2b48f05a8bd..5d511ddbb570 100644 --- a/src/os/bluestore/BlockDevice.h +++ b/src/os/bluestore/BlockDevice.h @@ -23,7 +23,7 @@ #include #include "acconfig.h" -#include "os/fs/aio.h" +#include "aio.h" #define SPDK_PREFIX "spdk:" diff --git a/src/os/bluestore/KernelDevice.h b/src/os/bluestore/KernelDevice.h index faccde3d5ba0..f04b7f972af3 100644 --- a/src/os/bluestore/KernelDevice.h +++ b/src/os/bluestore/KernelDevice.h @@ -18,9 +18,9 @@ #include #include "os/fs/FS.h" -#include "os/fs/aio.h" #include "include/interval_set.h" +#include "aio.h" #include "BlockDevice.h" class KernelDevice : public BlockDevice { diff --git a/src/os/bluestore/PMEMDevice.h b/src/os/bluestore/PMEMDevice.h index a908c7876e7b..c08e3cc5f2f1 100644 --- a/src/os/bluestore/PMEMDevice.h +++ b/src/os/bluestore/PMEMDevice.h @@ -20,8 +20,8 @@ #include #include "os/fs/FS.h" -#include "os/fs/aio.h" #include "include/interval_set.h" +#include "aio.h" #include "BlockDevice.h" class PMEMDevice : public BlockDevice { diff --git a/src/os/bluestore/aio.cc b/src/os/bluestore/aio.cc new file mode 100644 index 000000000000..cfe0c5cf8c89 --- /dev/null +++ b/src/os/bluestore/aio.cc @@ -0,0 +1,84 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#include "aio.h" + +#if defined(HAVE_LIBAIO) + + +int aio_queue_t::submit(aio_t &aio, int *retries) +{ + // 2^16 * 125us = ~8 seconds, so max sleep is ~16 seconds + int attempts = 16; + int delay = 125; + iocb *piocb = &aio.iocb; + int r; + while (true) { + r = io_submit(ctx, 1, &piocb); + if (r < 0) { + if (r == -EAGAIN && attempts-- > 0) { + usleep(delay); + delay *= 2; + (*retries)++; + continue; + } + } + assert(r == 1); + break; + } + return r; +} + +int aio_queue_t::submit_batch(aio_iter begin, aio_iter end, + uint16_t aios_size, void *priv, + int *retries) +{ + // 2^16 * 125us = ~8 seconds, so max sleep is ~16 seconds + int attempts = 16; + int delay = 125; + + aio_iter cur = begin; + struct iocb *piocb[aios_size]; + int r, pos = 0; + while (cur != end) { + cur->priv = priv; + *(piocb+pos) = &cur->iocb; + ++pos; + ++cur; + } + while (true) { + r = io_submit(ctx, pos, piocb); + if (r < 0) { + if (r == -EAGAIN && attempts-- > 0) { + usleep(delay); + delay *= 2; + (*retries)++; + continue; + } + } + break; + } + return r; +} + +int aio_queue_t::get_next_completed(int timeout_ms, aio_t **paio, int max) +{ + io_event event[max]; + struct timespec t = { + timeout_ms / 1000, + (timeout_ms % 1000) * 1000 * 1000 + }; + + int r = 0; + do { + r = io_getevents(ctx, 1, max, event, &t); + } while (r == -EINTR); + + for (int i=0; irval = event[i].res; + } + return r; +} + +#endif diff --git a/src/os/bluestore/aio.h b/src/os/bluestore/aio.h new file mode 100644 index 000000000000..2517e5f64fbb --- /dev/null +++ b/src/os/bluestore/aio.h @@ -0,0 +1,94 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#pragma once + +#include "acconfig.h" +#ifdef HAVE_LIBAIO +# include + +#include +#include + +#include "include/buffer.h" +#include "include/types.h" + +struct aio_t { + struct iocb iocb; // must be first element; see shenanigans in aio_queue_t + void *priv; + int fd; + boost::container::small_vector iov; + uint64_t offset, length; + int rval; + bufferlist bl; ///< write payload (so that it remains stable for duration) + + boost::intrusive::list_member_hook<> queue_item; + + aio_t(void *p, int f) : priv(p), fd(f), offset(0), length(0), rval(-1000) { + } + + void pwritev(uint64_t _offset, uint64_t len) { + offset = _offset; + length = len; + io_prep_pwritev(&iocb, fd, &iov[0], iov.size(), offset); + } + void pread(uint64_t _offset, uint64_t len) { + offset = _offset; + length = len; + bufferptr p = buffer::create_page_aligned(length); + io_prep_pread(&iocb, fd, p.c_str(), length, offset); + bl.append(std::move(p)); + } + + int get_return_value() { + return rval; + } +}; + +typedef boost::intrusive::list< + aio_t, + boost::intrusive::member_hook< + aio_t, + boost::intrusive::list_member_hook<>, + &aio_t::queue_item> > aio_list_t; + +struct aio_queue_t { + int max_iodepth; + io_context_t ctx; + + typedef list::iterator aio_iter; + + explicit aio_queue_t(unsigned max_iodepth) + : max_iodepth(max_iodepth), + ctx(0) { + } + ~aio_queue_t() { + assert(ctx == 0); + } + + int init() { + assert(ctx == 0); + int r = io_setup(max_iodepth, &ctx); + if (r < 0) { + if (ctx) { + io_destroy(ctx); + ctx = 0; + } + } + return r; + } + void shutdown() { + if (ctx) { + int r = io_destroy(ctx); + assert(r == 0); + ctx = 0; + } + } + + int submit(aio_t &aio, int *retries); + int submit_batch(aio_iter begin, aio_iter end, uint16_t aios_size, + void *priv, int *retries); + int get_next_completed(int timeout_ms, aio_t **paio, int max); +}; + +#endif diff --git a/src/os/fs/aio.cc b/src/os/fs/aio.cc deleted file mode 100644 index cfe0c5cf8c89..000000000000 --- a/src/os/fs/aio.cc +++ /dev/null @@ -1,84 +0,0 @@ -// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- -// vim: ts=8 sw=2 smarttab - -#include "aio.h" - -#if defined(HAVE_LIBAIO) - - -int aio_queue_t::submit(aio_t &aio, int *retries) -{ - // 2^16 * 125us = ~8 seconds, so max sleep is ~16 seconds - int attempts = 16; - int delay = 125; - iocb *piocb = &aio.iocb; - int r; - while (true) { - r = io_submit(ctx, 1, &piocb); - if (r < 0) { - if (r == -EAGAIN && attempts-- > 0) { - usleep(delay); - delay *= 2; - (*retries)++; - continue; - } - } - assert(r == 1); - break; - } - return r; -} - -int aio_queue_t::submit_batch(aio_iter begin, aio_iter end, - uint16_t aios_size, void *priv, - int *retries) -{ - // 2^16 * 125us = ~8 seconds, so max sleep is ~16 seconds - int attempts = 16; - int delay = 125; - - aio_iter cur = begin; - struct iocb *piocb[aios_size]; - int r, pos = 0; - while (cur != end) { - cur->priv = priv; - *(piocb+pos) = &cur->iocb; - ++pos; - ++cur; - } - while (true) { - r = io_submit(ctx, pos, piocb); - if (r < 0) { - if (r == -EAGAIN && attempts-- > 0) { - usleep(delay); - delay *= 2; - (*retries)++; - continue; - } - } - break; - } - return r; -} - -int aio_queue_t::get_next_completed(int timeout_ms, aio_t **paio, int max) -{ - io_event event[max]; - struct timespec t = { - timeout_ms / 1000, - (timeout_ms % 1000) * 1000 * 1000 - }; - - int r = 0; - do { - r = io_getevents(ctx, 1, max, event, &t); - } while (r == -EINTR); - - for (int i=0; irval = event[i].res; - } - return r; -} - -#endif diff --git a/src/os/fs/aio.h b/src/os/fs/aio.h deleted file mode 100644 index 2517e5f64fbb..000000000000 --- a/src/os/fs/aio.h +++ /dev/null @@ -1,94 +0,0 @@ -// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- -// vim: ts=8 sw=2 smarttab - -#pragma once - -#include "acconfig.h" -#ifdef HAVE_LIBAIO -# include - -#include -#include - -#include "include/buffer.h" -#include "include/types.h" - -struct aio_t { - struct iocb iocb; // must be first element; see shenanigans in aio_queue_t - void *priv; - int fd; - boost::container::small_vector iov; - uint64_t offset, length; - int rval; - bufferlist bl; ///< write payload (so that it remains stable for duration) - - boost::intrusive::list_member_hook<> queue_item; - - aio_t(void *p, int f) : priv(p), fd(f), offset(0), length(0), rval(-1000) { - } - - void pwritev(uint64_t _offset, uint64_t len) { - offset = _offset; - length = len; - io_prep_pwritev(&iocb, fd, &iov[0], iov.size(), offset); - } - void pread(uint64_t _offset, uint64_t len) { - offset = _offset; - length = len; - bufferptr p = buffer::create_page_aligned(length); - io_prep_pread(&iocb, fd, p.c_str(), length, offset); - bl.append(std::move(p)); - } - - int get_return_value() { - return rval; - } -}; - -typedef boost::intrusive::list< - aio_t, - boost::intrusive::member_hook< - aio_t, - boost::intrusive::list_member_hook<>, - &aio_t::queue_item> > aio_list_t; - -struct aio_queue_t { - int max_iodepth; - io_context_t ctx; - - typedef list::iterator aio_iter; - - explicit aio_queue_t(unsigned max_iodepth) - : max_iodepth(max_iodepth), - ctx(0) { - } - ~aio_queue_t() { - assert(ctx == 0); - } - - int init() { - assert(ctx == 0); - int r = io_setup(max_iodepth, &ctx); - if (r < 0) { - if (ctx) { - io_destroy(ctx); - ctx = 0; - } - } - return r; - } - void shutdown() { - if (ctx) { - int r = io_destroy(ctx); - assert(r == 0); - ctx = 0; - } - } - - int submit(aio_t &aio, int *retries); - int submit_batch(aio_iter begin, aio_iter end, uint16_t aios_size, - void *priv, int *retries); - int get_next_completed(int timeout_ms, aio_t **paio, int max); -}; - -#endif