From 08ccbc1d26e81d54278ab10d53450e810694df50 Mon Sep 17 00:00:00 2001 From: Jinyong Ha Date: Mon, 25 Oct 2021 14:23:33 +0900 Subject: [PATCH] seastore : add the use case of write data protection Apply data protection to RandomBlockManager. It omits generating CRC if the write protection is enabled Signed-off-by: Jinyong Ha --- .../random_block_manager/nvme_manager.cc | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) 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 8f37dfb816920..90103d37d8f36 100644 --- a/src/crimson/os/seastore/random_block_manager/nvme_manager.cc +++ b/src/crimson/os/seastore/random_block_manager/nvme_manager.cc @@ -54,7 +54,11 @@ NVMeManager::mkfs_ertr::future<> NVMeManager::initialize_blk_alloc_area() { for (uint64_t i = 0; i < start; i++) { b_block.set_bit(i); } - b_block.set_crc(); + + // CRC calculation is offloaded to NVMeDevice if data protection is enabled. + if (device->is_data_protection_enabled() == false) { + b_block.set_crc(); + } return rbm_sync_block_bitmap(b_block, super.start_alloc_area / super.block_size @@ -565,7 +569,15 @@ NVMeManager::write_ertr::future<> NVMeManager::write_rbm_header() bufferlist meta_b_header; super.crc = 0; encode(super, meta_b_header); - super.crc = meta_b_header.crc32c(-1); + // If NVMeDevice supports data protection, CRC for checksum is not required + // NVMeDevice is expected to generate and store checksum internally. + // CPU overhead for CRC might be saved. + if (device->is_data_protection_enabled()) { + super.crc = -1; + } + else { + super.crc = meta_b_header.crc32c(-1); + } bufferlist bl; encode(super, bl); @@ -605,10 +617,14 @@ NVMeManager::read_ertr::future NVMeManager::read_rbm_head bufferlist meta_b_header; super_block.crc = 0; encode(super_block, meta_b_header); - if (meta_b_header.crc32c(-1) != crc) { - logger().debug(" bad crc on super block, expected {} != actual {} ", - meta_b_header.crc32c(-1), crc); - return crimson::ct_error::input_output_error::make(); + + // Do CRC verification only if data protection is not supported. + if (device->is_data_protection_enabled() == false) { + if (meta_b_header.crc32c(-1) != crc) { + logger().debug(" bad crc on super block, expected {} != actual {} ", + meta_b_header.crc32c(-1), crc); + return crimson::ct_error::input_output_error::make(); + } } logger().debug(" got {} ", super); return read_ertr::future( -- 2.39.5