From: Abutalib Aghayev Date: Wed, 2 Sep 2020 20:12:50 +0000 (-0400) Subject: os/bluestore: Switch from libzbc library to libzbd library X-Git-Tag: v16.1.0~1161^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=bb488b06c972ae5b6e65684b749636aa6668a6bc;p=ceph.git os/bluestore: Switch from libzbc library to libzbd library Libzbc maintainers recommend switching to libzbd, which is lighter and supports both ZNS SSDs and HM-SMR HDDs. Signed-off-by: Abutalib Aghayev --- diff --git a/CMakeLists.txt b/CMakeLists.txt index f444ed724c09..05cba0336942 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -183,8 +183,8 @@ if(WITH_BLUESTORE) if(LINUX) find_package(aio) set(HAVE_LIBAIO ${AIO_FOUND}) - find_package(zbc) - set(HAVE_LIBZBC ${ZBC_FOUND}) + find_package(zbd) + set(HAVE_LIBZBD ${ZBD_FOUND}) elseif(FREEBSD) # POSIX AIO is integrated into FreeBSD kernel, and exposed by libc. set(HAVE_POSIXAIO ON) diff --git a/cmake/modules/Findzbc.cmake b/cmake/modules/Findzbc.cmake deleted file mode 100644 index 604981630810..000000000000 --- a/cmake/modules/Findzbc.cmake +++ /dev/null @@ -1,19 +0,0 @@ -# - Find ZBC -# -# ZBC_INCLUDE - Where to find zbc.h -# ZBC_LIBRARIES - List of libraries when using zbc. -# ZBC_FOUND - True if zbc found. - -find_path(ZBC_INCLUDE_DIR - zbc.h - HINTS $ENV{ZBC_ROOT}/libzbc - PATH_SUFFIXES libzbc) - -find_library(ZBC_LIBRARIES - zbc - HINTS $ENV{ZBC_ROOT}/lib) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(zbc DEFAULT_MSG ZBC_LIBRARIES ZBC_INCLUDE_DIR) - -mark_as_advanced(ZBC_INCLUDE_DIR ZBC_LIBRARIES) diff --git a/cmake/modules/Findzbd.cmake b/cmake/modules/Findzbd.cmake new file mode 100644 index 000000000000..f4b23ef2f9c5 --- /dev/null +++ b/cmake/modules/Findzbd.cmake @@ -0,0 +1,19 @@ +# - Find ZBD +# +# ZBD_INCLUDE - Where to find zbd.h +# ZBD_LIBRARIES - List of libraries when using zbd. +# ZBD_FOUND - True if zbd found. + +find_path(ZBD_INCLUDE_DIR + zbd.h + HINTS $ENV{ZBD_ROOT}/libzbd + PATH_SUFFIXES libzbd) + +find_library(ZBD_LIBRARIES + zbd + HINTS $ENV{ZBD_ROOT}/lib) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(zbd DEFAULT_MSG ZBD_LIBRARIES ZBD_INCLUDE_DIR) + +mark_as_advanced(ZBD_INCLUDE_DIR ZBD_LIBRARIES) diff --git a/src/blk/BlockDevice.cc b/src/blk/BlockDevice.cc index 4f1fdae3bd83..345d51fdb09f 100644 --- a/src/blk/BlockDevice.cc +++ b/src/blk/BlockDevice.cc @@ -31,7 +31,7 @@ #include "pmem/PMEMDevice.h" #endif -#if defined(HAVE_LIBZBC) +#if defined(HAVE_LIBZBD) #include "zoned/HMSMRDevice.h" #endif @@ -99,7 +99,7 @@ BlockDevice::detect_device_type(const std::string& path) return block_device_t::pmem; } #endif -#if (defined(HAVE_LIBAIO) || defined(HAVE_POSIXAIO)) && defined(HAVE_LIBZBC) +#if (defined(HAVE_LIBAIO) || defined(HAVE_POSIXAIO)) && defined(HAVE_LIBZBD) if (HMSMRDevice::support(path)) { return block_device_t::hm_smr; } @@ -126,7 +126,7 @@ BlockDevice::device_type_from_name(const std::string& blk_dev_name) return block_device_t::pmem; } #endif -#if (defined(HAVE_LIBAIO) || defined(HAVE_POSIXAIO)) && defined(HAVE_LIBZBC) +#if (defined(HAVE_LIBAIO) || defined(HAVE_POSIXAIO)) && defined(HAVE_LIBZBD) if (blk_dev_name == "hm_smr") { return block_device_t::hm_smr; } @@ -152,7 +152,7 @@ BlockDevice* BlockDevice::create_with_type(block_device_t device_type, case block_device_t::pmem: return new PMEMDevice(cct, cb, cbpriv); #endif -#if (defined(HAVE_LIBAIO) || defined(HAVE_POSIXAIO)) && defined(HAVE_LIBZBC) +#if (defined(HAVE_LIBAIO) || defined(HAVE_POSIXAIO)) && defined(HAVE_LIBZBD) case block_device_t::hm_smr: return new HMSMRDevice(cct, cb, cbpriv, d_cb, d_cbpriv); #endif diff --git a/src/blk/BlockDevice.h b/src/blk/BlockDevice.h index 3123c8aece8e..8ed53e69266c 100644 --- a/src/blk/BlockDevice.h +++ b/src/blk/BlockDevice.h @@ -140,7 +140,7 @@ private: unknown, #if defined(HAVE_LIBAIO) || defined(HAVE_POSIXAIO) aio, -#if defined(HAVE_LIBZBC) +#if defined(HAVE_LIBZBD) hm_smr, #endif #endif diff --git a/src/blk/CMakeLists.txt b/src/blk/CMakeLists.txt index 24ea60ecf6e8..586a9b2628b8 100644 --- a/src/blk/CMakeLists.txt +++ b/src/blk/CMakeLists.txt @@ -20,7 +20,7 @@ if(WITH_SPDK) spdk/NVMEDevice.cc) endif() -if(HAVE_LIBZBC) +if(HAVE_LIBZBD) list(APPEND libblk_srcs zoned/HMSMRDevice.cc) endif() @@ -36,8 +36,8 @@ if(WITH_SPDK) target_link_libraries(blk PRIVATE ${SPDK_LIBRARIES}) endif() -if(HAVE_LIBZBC) - target_link_libraries(blk PRIVATE ${ZBC_LIBRARIES}) +if(HAVE_LIBZBD) + target_link_libraries(blk PRIVATE ${ZBD_LIBRARIES}) endif() if(WITH_BLUESTORE_PMEM OR WITH_RBD_RWL) diff --git a/src/blk/zoned/HMSMRDevice.cc b/src/blk/zoned/HMSMRDevice.cc index 60a2e44a525c..867c9df43b3d 100644 --- a/src/blk/zoned/HMSMRDevice.cc +++ b/src/blk/zoned/HMSMRDevice.cc @@ -37,7 +37,7 @@ #include "kernel/io_uring.h" extern "C" { -#include +#include } #define dout_context cct @@ -78,7 +78,7 @@ HMSMRDevice::HMSMRDevice(CephContext* cct, aio_callback_t cb, void *cbpriv, aio_ bool HMSMRDevice::support(const std::string& path) { - return zbc_device_is_zoned(path.c_str(), false, nullptr) == 1; + return zbd_device_is_zoned(path.c_str()) == 1; } int HMSMRDevice::_lock() @@ -95,23 +95,23 @@ int HMSMRDevice::_lock() bool HMSMRDevice::set_smr_params(const std::string& path) { dout(10) << __func__ << " opening " << path << dendl; - zbc_device *dev; - if (zbc_open(path.c_str(), O_RDWR | O_DIRECT, &dev) != 0) { + int dev = zbd_open(path.c_str(), O_RDWR | O_DIRECT | O_LARGEFILE, nullptr); + if (dev < 0) { return false; } - auto close_dev = make_scope_guard([dev] { zbc_close(dev); }); + auto close_dev = make_scope_guard([dev] { zbd_close(dev); }); unsigned int nr_zones = 0; - if (zbc_report_nr_zones(dev, 0, ZBC_RO_NOT_WP, &nr_zones) != 0) { + if (zbd_report_nr_zones(dev, 0, 0, ZBD_RO_NOT_WP, &nr_zones) != 0) { return false; } - std::vector zones(nr_zones); - if (zbc_report_zones(dev, 0, ZBC_RO_NOT_WP, zones.data(), &nr_zones) != 0) { + std::vector zones(nr_zones); + if (zbd_report_zones(dev, 0, 0, ZBD_RO_NOT_WP, zones.data(), &nr_zones) != 0) { return false; } - zone_size = 512 * zbc_zone_length(&zones[0]); // on HM-SMR zones are equisized + zone_size = zbd_zone_len(&zones[0]); conventional_region_size = nr_zones * zone_size; dout(10) << __func__ << " setting zone size to " << zone_size diff --git a/src/include/config-h.in.cmake b/src/include/config-h.in.cmake index 1ea3703f620c..c612ab8a6a2a 100644 --- a/src/include/config-h.in.cmake +++ b/src/include/config-h.in.cmake @@ -75,8 +75,8 @@ /* Defined if you have libaio */ #cmakedefine HAVE_LIBAIO -/* Defined if you have libzbc */ -#cmakedefine HAVE_LIBZBC +/* Defined if you have libzbd */ +#cmakedefine HAVE_LIBZBD /* Defined if you have liburing */ #cmakedefine HAVE_LIBURING diff --git a/src/os/CMakeLists.txt b/src/os/CMakeLists.txt index 678c2bfd5d6a..375811a68043 100644 --- a/src/os/CMakeLists.txt +++ b/src/os/CMakeLists.txt @@ -37,7 +37,7 @@ if(WITH_BLUESTORE) ) endif(WITH_BLUESTORE) -if(HAVE_LIBZBC) +if(HAVE_LIBZBD) list(APPEND libos_srcs bluestore/zoned_types.cc bluestore/ZonedFreelistManager.cc diff --git a/src/os/bluestore/Allocator.cc b/src/os/bluestore/Allocator.cc index 5cd5d3b5ca83..eaabccfe5653 100644 --- a/src/os/bluestore/Allocator.cc +++ b/src/os/bluestore/Allocator.cc @@ -6,7 +6,7 @@ #include "BitmapAllocator.h" #include "AvlAllocator.h" #include "HybridAllocator.h" -#ifdef HAVE_LIBZBC +#ifdef HAVE_LIBZBD #include "ZonedAllocator.h" #endif #include "common/debug.h" @@ -128,7 +128,7 @@ Allocator *Allocator::create(CephContext* cct, string type, return new HybridAllocator(cct, size, block_size, cct->_conf.get_val("bluestore_hybrid_alloc_mem_cap"), name); -#ifdef HAVE_LIBZBC +#ifdef HAVE_LIBZBD } else if (type == "zoned") { return new ZonedAllocator(cct, size, block_size, name); #endif diff --git a/src/os/bluestore/FreelistManager.cc b/src/os/bluestore/FreelistManager.cc index 652cb9251ba1..5907df443e00 100644 --- a/src/os/bluestore/FreelistManager.cc +++ b/src/os/bluestore/FreelistManager.cc @@ -3,7 +3,7 @@ #include "FreelistManager.h" #include "BitmapFreelistManager.h" -#ifdef HAVE_LIBZBC +#ifdef HAVE_LIBZBD #include "ZonedFreelistManager.h" #endif @@ -20,7 +20,7 @@ FreelistManager *FreelistManager::create( if (type == "bitmap") return new BitmapFreelistManager(cct, "B", "b"); -#ifdef HAVE_LIBZBC +#ifdef HAVE_LIBZBD // With zoned drives there is only one FreelistManager implementation that we // can use, and we also know if a drive is zoned right after opening it // (BlueStore::_open_bdev). Hence, we set freelist_type to "zoned" whenever @@ -37,7 +37,7 @@ FreelistManager *FreelistManager::create( void FreelistManager::setup_merge_operators(KeyValueDB *db, const std::string& type) { -#ifdef HAVE_LIBZBC +#ifdef HAVE_LIBZBD if (type == "zoned") ZonedFreelistManager::setup_merge_operator(db, "z"); else