Commit 994d99ab authored by Ori Evron's avatar Ori Evron Committed by Tomasz Zawadzki
Browse files

bdev: add preferred write/unmap alignment/granularity and optimal write size



To enable configuration of both write and unmap alignments for a bdev, we have
introduced new fields to the bdev structure.

preferred_write_alignment
preferred_write_granularity
optimal_write_size
preferred_unmap_alignment
preferred_unmap_granularity

If a bdev module does not want to report values, just set them to 0.

For all the APIs, a return value of 0 means "not specified"

Change-Id: Ia03be3a344eb695bc1a47a1a07a85f7b19a7fe44
Signed-off-by: default avatarOri Evron <oevron@nvidia.com>
Signed-off-by: default avatarJim Harris <jim.harris@nvidia.com>
Reviewed-on: https://review.spdk.io/c/spdk/spdk/+/26507


Tested-by: default avatarSPDK Automated Test System <spdkbot@gmail.com>
Reviewed-by: default avatarBen Walker <ben@nvidia.com>
Reviewed-by: default avatarAnkit Kumar <ankit.kumar@samsung.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarChangpeng Liu <changpeliu@tencent.com>
parent d7b4e337
Loading
Loading
Loading
Loading
+40 −0
Original line number Diff line number Diff line
@@ -949,6 +949,46 @@ uint32_t spdk_bdev_get_data_block_size(const struct spdk_bdev *bdev);
 */
uint32_t spdk_bdev_get_physical_block_size(const struct spdk_bdev *bdev);

/**
 * Get block device preferred write alignment.
 *
 * \param bdev Block device to query.
 * \return preferred write alignment for this bdev in blocks. Value 0 means there is no preferred write alignment.
 */
uint32_t spdk_bdev_get_preferred_write_alignment(const struct spdk_bdev *bdev);

/**
 * Get block device preferred write granularity.
 *
 * \param bdev Block device to query.
 * \return preferred write granularity for this bdev in blocks. Value 0 means there is no preferred write granularity.
 */
uint32_t spdk_bdev_get_preferred_write_granularity(const struct spdk_bdev *bdev);

/**
 * Get block device optimal write size.
 *
 * \param bdev Block device to query.
 * \return preferred write size for this bdev in blocks. Value 0 means there is no preferred write size.
 */
uint32_t spdk_bdev_get_optimal_write_size(const struct spdk_bdev *bdev);

/**
 * Get block device preferred unmap alignment.
 *
 * \param bdev Block device to query.
 * \return preferred unmap alignment for this bdev in blocks. Value 0 means there is no preferred unmap alignment.
 */
uint32_t spdk_bdev_get_preferred_unmap_alignment(const struct spdk_bdev *bdev);

/**
 * Get block device preferred unmap granularity.
 *
 * \param bdev Block device to query.
 * \return preferred unmap granularity for this bdev in blocks. Value 0 means there is no preferred unmap granularity.
 */
uint32_t spdk_bdev_get_preferred_unmap_granularity(const struct spdk_bdev *bdev);

/**
 * Get DIF type of the block device.
 *
+15 −0
Original line number Diff line number Diff line
@@ -495,6 +495,21 @@ struct spdk_bdev {
	 */
	uint32_t optimal_io_boundary;

	/** Size in blocks of the preferred write alignment for the backend */
	uint32_t preferred_write_alignment;

	/** Size in blocks of the preferred write granularity for the backend */
	uint32_t preferred_write_granularity;

	/** Size in blocks of the optimal write size for the backend */
	uint32_t optimal_write_size;

	/** Size in blocks of the preferred unmap alignment for the backend */
	uint32_t preferred_unmap_alignment;

	/** Size in blocks of the preferred unmap granularity for the backend */
	uint32_t preferred_unmap_granularity;

	/**
	 * Max io size in bytes of a single segment
	 *
+30 −0
Original line number Diff line number Diff line
@@ -5213,6 +5213,36 @@ spdk_bdev_get_physical_block_size(const struct spdk_bdev *bdev)
	return bdev->phys_blocklen;
}

uint32_t
spdk_bdev_get_preferred_write_alignment(const struct spdk_bdev *bdev)
{
	return bdev->preferred_write_alignment;
}

uint32_t
spdk_bdev_get_preferred_write_granularity(const struct spdk_bdev *bdev)
{
	return bdev->preferred_write_granularity;
}

uint32_t
spdk_bdev_get_optimal_write_size(const struct spdk_bdev *bdev)
{
	return bdev->optimal_write_size;
}

uint32_t
spdk_bdev_get_preferred_unmap_alignment(const struct spdk_bdev *bdev)
{
	return bdev->preferred_unmap_alignment;
}

uint32_t
spdk_bdev_get_preferred_unmap_granularity(const struct spdk_bdev *bdev)
{
	return bdev->preferred_unmap_granularity;
}

static uint32_t
_bdev_get_block_size_with_md(const struct spdk_bdev *bdev)
{
+9 −0
Original line number Diff line number Diff line
@@ -669,6 +669,15 @@ rpc_dump_bdev_info(void *ctx, struct spdk_bdev *bdev)
	spdk_json_write_named_string(w, "product_name", spdk_bdev_get_product_name(bdev));
	spdk_json_write_named_uint32(w, "block_size", spdk_bdev_get_block_size(bdev));
	spdk_json_write_named_uint64(w, "num_blocks", spdk_bdev_get_num_blocks(bdev));
	spdk_json_write_named_uint32(w, "preferred_write_alignment",
				     spdk_bdev_get_preferred_write_alignment(bdev));
	spdk_json_write_named_uint32(w, "preferred_write_granularity",
				     spdk_bdev_get_preferred_write_granularity(bdev));
	spdk_json_write_named_uint32(w, "optimal_write_size", spdk_bdev_get_optimal_write_size(bdev));
	spdk_json_write_named_uint32(w, "preferred_unmap_alignment",
				     spdk_bdev_get_preferred_unmap_alignment(bdev));
	spdk_json_write_named_uint32(w, "preferred_unmap_granularity",
				     spdk_bdev_get_preferred_unmap_granularity(bdev));
	spdk_json_write_named_uuid(w, "uuid", &bdev->uuid);
	if (bdev->numa.id_valid) {
		spdk_json_write_named_int32(w, "numa_id", bdev->numa.id);
+5 −0
Original line number Diff line number Diff line
@@ -46,6 +46,11 @@
	spdk_bdev_is_zoned;
	spdk_bdev_get_data_block_size;
	spdk_bdev_get_physical_block_size;
	spdk_bdev_get_preferred_write_alignment;
	spdk_bdev_get_preferred_write_granularity;
	spdk_bdev_get_optimal_write_size;
	spdk_bdev_get_preferred_unmap_alignment;
	spdk_bdev_get_preferred_unmap_granularity;
	spdk_bdev_get_dif_type;
	spdk_bdev_get_dif_pi_format;
	spdk_bdev_is_dif_head_of_md;