From: Mark Nelson Date: Wed, 8 May 2019 14:46:55 +0000 (-0500) Subject: os/bluestore: Unify on preadv for io_uring and future refactor. X-Git-Tag: v15.1.0~2646^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=30fc28f98859ed7f4de8d0b82ac72634db683df6;p=ceph.git os/bluestore: Unify on preadv for io_uring and future refactor. Signed-off-by: Mark Nelson --- diff --git a/src/os/bluestore/KernelDevice.cc b/src/os/bluestore/KernelDevice.cc index ec163c7f1c08..87771a9da765 100644 --- a/src/os/bluestore/KernelDevice.cc +++ b/src/os/bluestore/KernelDevice.cc @@ -855,7 +855,10 @@ int KernelDevice::aio_write( ioc->pending_aios.push_back(aio_t(ioc, choose_fd(false, write_hint))); ++ioc->num_pending; auto& aio = ioc->pending_aios.back(); - aio.pread(off, len); + bufferptr p = buffer::create_small_page_aligned(len); + aio.bl.append(std::move(p)); + aio.bl.prepare_iov(&aio.iov); + aio.preadv(off, len); ++injecting_crash; } else { if (bl.length() <= RW_IO_MAX) { @@ -981,7 +984,10 @@ int KernelDevice::aio_read( ioc->pending_aios.push_back(aio_t(ioc, fd_directs[WRITE_LIFE_NOT_SET])); ++ioc->num_pending; aio_t& aio = ioc->pending_aios.back(); - aio.pread(off, len); + bufferptr p = buffer::create_small_page_aligned(len); + aio.bl.append(std::move(p)); + aio.bl.prepare_iov(&aio.iov); + aio.preadv(off, len); dout(30) << aio << dendl; pbl->append(aio.bl); dout(5) << __func__ << " 0x" << std::hex << off << "~" << len diff --git a/src/os/bluestore/ceph_aio.h b/src/os/bluestore/ceph_aio.h index ab03388631b8..9d814a6379b3 100644 --- a/src/os/bluestore/ceph_aio.h +++ b/src/os/bluestore/ceph_aio.h @@ -59,20 +59,24 @@ struct aio_t { } #endif } - void pread(uint64_t _offset, uint64_t len) { + + void preadv(uint64_t _offset, uint64_t len) { offset = _offset; length = len; - bufferptr p = buffer::create_small_page_aligned(length); #if defined(HAVE_LIBAIO) - io_prep_pread(&iocb, fd, p.c_str(), length, offset); + io_prep_preadv(&iocb, fd, &iov[0], iov.size(), offset); #elif defined(HAVE_POSIXAIO) - n_aiocb = 1; - aio.aiocb.aio_fildes = fd; - aio.aiocb.aio_buf = p.c_str(); - aio.aiocb.aio_nbytes = length; - aio.aiocb.aio_offset = offset; + n_aiocb = iov.size(); + aio.aiocbp = (struct aiocb*)calloc(iov.size(), sizeof(struct aiocb)); + for (size_t i = 0; i < iov.size(); i++) { + aio.aiocbp[i].aio_fildes = fd; + aio.aiocbp[i].aio_buf = iov[i].iov_base; + aio.aiocbp[i].aio_nbytes = iov[i].iov_len; + aio.aiocbp[i].aio_offset = offset; + aio.aiocbp[i].aio_lio_opcode = LIO_READ; + offset += iov[i].iov_len; + } #endif - bl.append(std::move(p)); } long get_return_value() {