]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: Unify on preadv for io_uring and future refactor. 28025/head
authorMark Nelson <mnelson@redhat.com>
Wed, 8 May 2019 14:46:55 +0000 (09:46 -0500)
committerMark Nelson <mnelson@redhat.com>
Wed, 8 May 2019 14:46:55 +0000 (09:46 -0500)
Signed-off-by: Mark Nelson <mnelson@redhat.com>
src/os/bluestore/KernelDevice.cc
src/os/bluestore/ceph_aio.h

index ec163c7f1c08f8b78cc2f74dbf2426685e5e753c..87771a9da765eac13b9a8d3bb03227abdb94b4e3 100644 (file)
@@ -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
index ab03388631b8eccca99f6901862157be9fe399a0..9d814a6379b376a3c1a8786b3f4cb3bc35a40b8b 100644 (file)
@@ -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() {