From 67ce52f5f9612bde8180203bdcbb6d9e733e5108 Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Thu, 28 Jan 2021 16:42:34 +0100 Subject: [PATCH] blk: make the buffer alignment configurable in KernelDevice. Signed-off-by: Radoslaw Zarzynski --- src/blk/kernel/KernelDevice.cc | 20 ++++++++++++++++++-- src/common/options/global.yaml.in | 5 +++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/blk/kernel/KernelDevice.cc b/src/blk/kernel/KernelDevice.cc index ebd387aa17e9b..d5251411dcde1 100644 --- a/src/blk/kernel/KernelDevice.cc +++ b/src/blk/kernel/KernelDevice.cc @@ -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 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; diff --git a/src/common/options/global.yaml.in b/src/common/options/global.yaml.in index 557c67646bec8..39866897d21a0 100644 --- a/src/common/options/global.yaml.in +++ b/src/common/options/global.yaml.in @@ -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 -- 2.39.5