From 187aeaec67d603a01409af27b306597f6933039f Mon Sep 17 00:00:00 2001 From: myoungwon oh Date: Tue, 5 Oct 2021 10:37:59 +0900 Subject: [PATCH] seastore: add blocks_per_segment to use paddr_t in RBM Seastore exploits paddr_t to represent its address. However. the term of "segment" in paddr_t generally be used in LFS, not random block design---"block" is more general term of RBM. The problem is that seasore already has been tighly coupled with padd_t, also it does not make sense that there are two differnt address such as paddr_t and block_paddr_t. Therefore, to solve this problem, this commit adds blocks_per_segment, which describes how many blocks a single segment contains to make RBM be compotible with paddr_t Signed-off-by: Myoungwon Oh --- src/crimson/os/seastore/random_block_manager.h | 2 ++ .../random_block_manager/nvme_manager.cc | 1 + .../random_block_manager/nvme_manager.h | 6 ++++++ src/crimson/os/seastore/seastore_types.cc | 18 ++++++++++++++++++ src/crimson/os/seastore/seastore_types.h | 5 +++++ 5 files changed, 32 insertions(+) diff --git a/src/crimson/os/seastore/random_block_manager.h b/src/crimson/os/seastore/random_block_manager.h index a25ec5ba99c25..d184bb205f8c1 100644 --- a/src/crimson/os/seastore/random_block_manager.h +++ b/src/crimson/os/seastore/random_block_manager.h @@ -32,6 +32,7 @@ public: blk_paddr_t end; size_t block_size = 0; size_t total_size = 0; + uint32_t blocks_per_segment = 1 << 18; seastore_meta_t meta; }; using mkfs_ertr = crimson::errorator< @@ -98,6 +99,7 @@ public: virtual size_t get_size() const = 0; virtual size_t get_block_size() const = 0; virtual uint64_t get_free_blocks() const = 0; + virtual uint32_t get_blocks_per_segment() const = 0; virtual ~RandomBlockManager() {} }; using RandomBlockManagerRef = std::unique_ptr; diff --git a/src/crimson/os/seastore/random_block_manager/nvme_manager.cc b/src/crimson/os/seastore/random_block_manager/nvme_manager.cc index b0fe1bc709c91..07ccbbce7c4c8 100644 --- a/src/crimson/os/seastore/random_block_manager/nvme_manager.cc +++ b/src/crimson/os/seastore/random_block_manager/nvme_manager.cc @@ -137,6 +137,7 @@ NVMeManager::mkfs_ertr::future<> NVMeManager::mkfs(mkfs_config_t config) super.start_alloc_area + super.alloc_area_size; super.crc = 0; super.feature |= RBM_BITMAP_BLOCK_CRC; + super.blocks_per_segment = config.blocks_per_segment; logger().debug(" super {} ", super); // write super block diff --git a/src/crimson/os/seastore/random_block_manager/nvme_manager.h b/src/crimson/os/seastore/random_block_manager/nvme_manager.h index ca45eedd49c86..5ae66030d9034 100644 --- a/src/crimson/os/seastore/random_block_manager/nvme_manager.h +++ b/src/crimson/os/seastore/random_block_manager/nvme_manager.h @@ -54,6 +54,7 @@ struct rbm_metadata_header_t { uint32_t start_data_area; uint64_t flag; // reserved uint64_t feature; + uint32_t blocks_per_segment; // the number of blocks in segment checksum_t crc; DENC(rbm_metadata_header_t, v, p) { @@ -70,6 +71,7 @@ struct rbm_metadata_header_t { denc(v.start_data_area, p); denc(v.flag, p); denc(v.feature, p); + denc(v.blocks_per_segment, p); denc(v.crc, p); DENC_FINISH(p); @@ -360,6 +362,10 @@ public: free_block_ertr::future<> add_free_extent( std::vector& v, blk_paddr_t from, size_t len); + uint32_t get_blocks_per_segment() const final { + return super.blocks_per_segment; + } + private: /* * this contains the number of bitmap blocks, free blocks and diff --git a/src/crimson/os/seastore/seastore_types.cc b/src/crimson/os/seastore/seastore_types.cc index e6dbbcb979d75..63fa9759f3e9d 100644 --- a/src/crimson/os/seastore/seastore_types.cc +++ b/src/crimson/os/seastore/seastore_types.cc @@ -236,5 +236,23 @@ std::string device_type_to_string(device_type_t dtype) { ceph_assert(0 == "impossible"); } } +paddr_t convert_blk_paddr_to_paddr(blk_paddr_t addr, size_t block_size, + uint32_t blocks_per_segment, device_id_t d_id) +{ + paddr_t paddr; + paddr.segment = segment_id_t { + d_id, + (uint32_t)(addr / (block_size * blocks_per_segment)) + }; + paddr.offset = addr % (block_size * blocks_per_segment); + return paddr; +} + +blk_paddr_t convert_paddr_to_blk_paddr(paddr_t addr, size_t block_size, + uint32_t blocks_per_segment) +{ + return (blk_paddr_t)(addr.segment.device_segment_id() * + (block_size * blocks_per_segment) + addr.offset); +} } diff --git a/src/crimson/os/seastore/seastore_types.h b/src/crimson/os/seastore/seastore_types.h index 1efe7912e9fe5..b7b521eb9b8b2 100644 --- a/src/crimson/os/seastore/seastore_types.h +++ b/src/crimson/os/seastore/seastore_types.h @@ -1077,6 +1077,11 @@ struct rbm_alloc_delta_t { op_types_t op; }; +paddr_t convert_blk_paddr_to_paddr(blk_paddr_t addr, size_t block_size, + uint32_t blocks_per_segment, device_id_t d_id); +blk_paddr_t convert_paddr_to_blk_paddr(paddr_t addr, size_t block_size, + uint32_t blocks_per_segment); + struct extent_info_t { extent_types_t type = extent_types_t::NONE; laddr_t addr = L_ADDR_NULL; -- 2.39.5