]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
blk: make the buffer alignment configurable in KernelDevice.
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Thu, 28 Jan 2021 15:42:34 +0000 (16:42 +0100)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Wed, 12 Jan 2022 20:35:50 +0000 (20:35 +0000)
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/blk/kernel/KernelDevice.cc
src/common/options/global.yaml.in

index ebd387aa17e9b931f4646ba73aaa065ebdf21a05..d5251411dcde130a0197d8835d89eef6a0ba9473 100644 (file)
@@ -1041,6 +1041,22 @@ int KernelDevice::discard(uint64_t offset, uint64_t len)
   return r;
 }
 
+
+// create a buffer basing on user-configurable. it's intended to make
+// our buffers THP-able.
+static ceph::unique_leakable_ptr<buffer::raw> create_custom_aligned(
+  CephContext* const cct,
+  const size_t len)
+{
+  // just to preserve the logic of create_small_page_aligned().
+  if (len < CEPH_PAGE_SIZE) {
+    return ceph::buffer::create_small_page_aligned(len);
+  } else {
+    const size_t custom_alignment = cct->_conf->bdev_read_buffer_alignment;
+    return ceph::buffer::create_aligned(len, custom_alignment);
+  }
+}
+
 int KernelDevice::read(uint64_t off, uint64_t len, bufferlist *pbl,
                      IOContext *ioc,
                      bool buffered)
@@ -1054,7 +1070,7 @@ int KernelDevice::read(uint64_t off, uint64_t len, bufferlist *pbl,
 
   auto start1 = mono_clock::now();
 
-  auto p = ceph::buffer::ptr_node::create(ceph::buffer::create_small_page_aligned(len));
+  auto p = ceph::buffer::ptr_node::create(create_custom_aligned(cct, len));
   int r = ::pread(choose_fd(buffered,  WRITE_LIFE_NOT_SET),
                  p->c_str(), len, off);
   auto age = cct->_conf->bdev_debug_aio_log_age;
@@ -1106,7 +1122,7 @@ int KernelDevice::aio_read(
     ++ioc->num_pending;
     aio_t& aio = ioc->pending_aios.back();
     aio.bl.push_back(
-      ceph::buffer::ptr_node::create(ceph::buffer::create_small_page_aligned(len)));
+      ceph::buffer::ptr_node::create(create_custom_aligned(cct, len)));
     aio.bl.prepare_iov(&aio.iov);
     aio.preadv(off, len);
     dout(30) << aio << dendl;
index 557c67646bec813079ad7bba71b0e89cdfca604d..39866897d21a05898c83ff6919fbebf16b1fb3cb 100644 (file)
@@ -3915,6 +3915,11 @@ options:
   level: advanced
   default: 4_K
   with_legacy: true
+- name: bdev_read_buffer_alignment
+  type: size
+  level: advanced
+  default: 4_K
+  with_legacy: true
 - name: bdev_debug_aio
   type: bool
   level: dev