bdev: optimize coversion of bytes to blocks
Since division is more expensive than right shift operator, in function spdk_bdev_bytes_to_blocks, use right shift instead of division if the blocklen of bdev is a power of two. Change-Id: Ib3dbc792e86582bba30b3dc028efbd12c69075ba Signed-off-by: lorneli <lorneli@163.com> Reviewed-on: https://review.gerrithub.io/438318 Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com> Reviewed-by: Pawel Wodkowski <pawelx.wodkowski@intel.com> Reviewed-by: Changpeng Liu <changpeng.liu@intel.com> Reviewed-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com> Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com> Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
parent
eb6bac0aa9
commit
02be32d482
@ -2304,11 +2304,20 @@ spdk_bdev_bytes_to_blocks(struct spdk_bdev *bdev, uint64_t offset_bytes, uint64_
|
||||
uint64_t num_bytes, uint64_t *num_blocks)
|
||||
{
|
||||
uint32_t block_size = bdev->blocklen;
|
||||
uint8_t shift_cnt;
|
||||
|
||||
/* Avoid expensive div operations if possible. These spdk_u32 functions are very cheap. */
|
||||
if (spdk_likely(spdk_u32_is_pow2(block_size))) {
|
||||
shift_cnt = spdk_u32log2(block_size);
|
||||
*offset_blocks = offset_bytes >> shift_cnt;
|
||||
*num_blocks = num_bytes >> shift_cnt;
|
||||
return (offset_bytes - (*offset_blocks << shift_cnt)) |
|
||||
(num_bytes - (*num_blocks << shift_cnt));
|
||||
} else {
|
||||
*offset_blocks = offset_bytes / block_size;
|
||||
*num_blocks = num_bytes / block_size;
|
||||
|
||||
return (offset_bytes % block_size) | (num_bytes % block_size);
|
||||
}
|
||||
}
|
||||
|
||||
static bool
|
||||
|
@ -546,6 +546,18 @@ bytes_to_blocks_test(void)
|
||||
|
||||
/* Length not a block multiple */
|
||||
CU_ASSERT(spdk_bdev_bytes_to_blocks(&bdev, 512, &offset_blocks, 3, &num_blocks) != 0);
|
||||
|
||||
/* In case blocklen not the power of two */
|
||||
bdev.blocklen = 100;
|
||||
CU_ASSERT(spdk_bdev_bytes_to_blocks(&bdev, 100, &offset_blocks, 200, &num_blocks) == 0);
|
||||
CU_ASSERT(offset_blocks == 1);
|
||||
CU_ASSERT(num_blocks == 2);
|
||||
|
||||
/* Offset not a block multiple */
|
||||
CU_ASSERT(spdk_bdev_bytes_to_blocks(&bdev, 3, &offset_blocks, 100, &num_blocks) != 0);
|
||||
|
||||
/* Length not a block multiple */
|
||||
CU_ASSERT(spdk_bdev_bytes_to_blocks(&bdev, 100, &offset_blocks, 3, &num_blocks) != 0);
|
||||
}
|
||||
|
||||
static void
|
||||
|
Loading…
Reference in New Issue
Block a user