Commit 0830da33 authored by Artur Paszkiewicz's avatar Artur Paszkiewicz Committed by Tomasz Zawadzki
Browse files

raid5f: interleaved md support



Also enable it in the unit tests.

Signed-off-by: default avatarArtur Paszkiewicz <artur.paszkiewicz@intel.com>
Change-Id: I2ee7aad32f79af7e8434771ada69308998ad152d
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/21683


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Reviewed-by: default avatarMateusz Kozlowski <mateusz.kozlowski@solidigm.com>
Community-CI: Mellanox Build Bot
parent 51978c16
Loading
Loading
Loading
Loading
+10 −12
Original line number Diff line number Diff line
@@ -314,13 +314,13 @@ raid5f_xor_stripe(struct stripe_request *stripe_req, stripe_req_xor_cb cb)
			      r5ch->chunk_xor_iovs,
			      r5ch->chunk_xor_iovcnt,
			      r5ch->chunk_xor_buffers);
	stripe_req->xor.remaining = num_blocks << raid_bdev->blocklen_shift;
	stripe_req->xor.remaining = num_blocks * raid_bdev->bdev.blocklen;
	stripe_req->xor.status = 0;
	stripe_req->xor.cb = cb;

	if (raid_io->md_buf != NULL) {
		uint8_t n_src = raid5f_stripe_data_chunks_num(raid_bdev);
		uint64_t len = num_blocks * spdk_bdev_get_md_size(&raid_bdev->bdev);
		uint64_t len = num_blocks * raid_bdev->bdev.md_len;
		int ret;

		stripe_req->xor.remaining_md = len;
@@ -519,8 +519,6 @@ raid5f_stripe_request_map_iovecs(struct stripe_request *stripe_req)
{
	struct raid_bdev_io *raid_io = stripe_req->raid_io;
	struct raid_bdev *raid_bdev = raid_io->raid_bdev;
	void *raid_io_md = raid_io->md_buf;
	uint32_t raid_io_md_size = spdk_bdev_get_md_size(&raid_bdev->bdev);
	struct chunk *chunk;
	int raid_io_iov_idx = 0;
	size_t raid_io_offset = 0;
@@ -529,7 +527,7 @@ raid5f_stripe_request_map_iovecs(struct stripe_request *stripe_req)

	FOR_EACH_DATA_CHUNK(stripe_req, chunk) {
		int chunk_iovcnt = 0;
		uint64_t len = raid_bdev->strip_size << raid_bdev->blocklen_shift;
		uint64_t len = raid_bdev->strip_size * raid_bdev->bdev.blocklen;
		size_t off = raid_io_iov_offset;
		int ret;

@@ -548,9 +546,9 @@ raid5f_stripe_request_map_iovecs(struct stripe_request *stripe_req)
			return ret;
		}

		if (raid_io_md) {
			chunk->md_buf = raid_io_md +
					(raid_io_offset >> raid_bdev->blocklen_shift) * raid_io_md_size;
		if (raid_io->md_buf != NULL) {
			chunk->md_buf = raid_io->md_buf +
					(raid_io_offset >> raid_bdev->blocklen_shift) * raid_bdev->bdev.md_len;
		}

		for (i = 0; i < chunk_iovcnt; i++) {
@@ -575,7 +573,7 @@ raid5f_stripe_request_map_iovecs(struct stripe_request *stripe_req)
	}

	stripe_req->parity_chunk->iovs[0].iov_base = stripe_req->write.parity_buf;
	stripe_req->parity_chunk->iovs[0].iov_len = raid_bdev->strip_size << raid_bdev->blocklen_shift;
	stripe_req->parity_chunk->iovs[0].iov_len = raid_bdev->strip_size * raid_bdev->bdev.blocklen;
	stripe_req->parity_chunk->iovcnt = 1;
	stripe_req->parity_chunk->md_buf = stripe_req->write.parity_md_buf;

@@ -743,7 +741,7 @@ raid5f_submit_reconstruct_read(struct raid_bdev_io *raid_io, uint64_t stripe_ind
			struct iovec *iov = &chunk->iovs[0];

			iov->iov_base = stripe_req->reconstruct.chunk_buffers[buf_idx];
			iov->iov_len = raid_io->num_blocks << raid_bdev->blocklen_shift;
			iov->iov_len = raid_io->num_blocks * raid_bdev->bdev.blocklen;
			chunk->iovcnt = 1;

			if (raid_io_md) {
@@ -874,7 +872,7 @@ raid5f_stripe_request_alloc(struct raid5f_io_channel *r5ch, enum stripe_request_
{
	struct raid5f_info *r5f_info = raid5f_ch_to_r5f_info(r5ch);
	struct raid_bdev *raid_bdev = r5f_info->raid_bdev;
	uint32_t raid_io_md_size = spdk_bdev_get_md_size(&raid_bdev->bdev);
	uint32_t raid_io_md_size = raid_bdev->bdev.md_interleave ? 0 : raid_bdev->bdev.md_len;
	struct stripe_request *stripe_req;
	struct chunk *chunk;
	size_t chunk_len;
@@ -896,7 +894,7 @@ raid5f_stripe_request_alloc(struct raid5f_io_channel *r5ch, enum stripe_request_
		}
	}

	chunk_len = raid_bdev->strip_size << raid_bdev->blocklen_shift;
	chunk_len = raid_bdev->strip_size * raid_bdev->bdev.blocklen;

	if (type == STRIPE_REQ_WRITE) {
		stripe_req->write.parity_buf = spdk_dma_malloc(chunk_len, r5f_info->buf_alignment, NULL);
+6 −10
Original line number Diff line number Diff line
@@ -35,12 +35,6 @@ spdk_accel_get_io_channel(void)
	return spdk_get_io_channel(g_accel_p);
}

uint32_t
spdk_bdev_get_md_size(const struct spdk_bdev *bdev)
{
	return bdev->md_len;
}

struct xor_ctx {
	spdk_accel_completion_cb cb_fn;
	void *cb_arg;
@@ -93,7 +87,7 @@ test_suite_init(void)
	uint64_t base_bdev_blockcnt_values[] = { 1, 1024, 1024 * 1024 };
	uint32_t base_bdev_blocklen_values[] = { 512, 4096 };
	uint32_t strip_size_kb_values[] = { 1, 4, 128 };
	enum raid_params_md_type md_type_values[] = { RAID_PARAMS_MD_NONE, RAID_PARAMS_MD_SEPARATE };
	enum raid_params_md_type md_type_values[] = { RAID_PARAMS_MD_NONE, RAID_PARAMS_MD_SEPARATE, RAID_PARAMS_MD_INTERLEAVED };
	uint8_t *num_base_bdevs;
	uint64_t *base_bdev_blockcnt;
	uint32_t *base_bdev_blocklen;
@@ -625,7 +619,7 @@ test_raid5f_write_request(struct raid_io_info *io_info)
			i--;
		}

		strip_len = raid_bdev->strip_size_kb * 1024;
		strip_len = raid_bdev->strip_size * raid_bdev->bdev.blocklen;
		offset = i * strip_len;

		memcpy(io_info->dest_buf + offset, io_info->src_buf + offset, strip_len);
@@ -692,7 +686,7 @@ init_io_info(struct raid_io_info *io_info, struct raid5f_info *r5f_info,
	void *src_buf, *dest_buf;
	void *src_md_buf, *dest_md_buf;
	size_t buf_size = num_blocks * blocklen;
	size_t buf_md_size = num_blocks * raid_bdev->bdev.md_len;
	size_t buf_md_size = raid_bdev->bdev.md_interleave ? 0 : num_blocks * raid_bdev->bdev.md_len;
	uint64_t block;
	uint64_t i;

@@ -775,6 +769,8 @@ io_info_setup_parity(struct raid_io_info *io_info, void *src, void *src_md)
	if (src_md) {
		size_t strip_md_len = raid_bdev->strip_size * raid_bdev->bdev.md_len;

		SPDK_CU_ASSERT_FATAL(raid_bdev->bdev.md_interleave == 0);

		io_info->parity_md_buf_size = strip_md_len;
		io_info->parity_md_buf = calloc(1, io_info->parity_md_buf_size);
		SPDK_CU_ASSERT_FATAL(io_info->parity_md_buf != NULL);
@@ -795,7 +791,7 @@ io_info_setup_degraded(struct raid_io_info *io_info)
	struct raid5f_info *r5f_info = io_info->r5f_info;
	struct raid_bdev *raid_bdev = r5f_info->raid_bdev;
	uint32_t blocklen = raid_bdev->bdev.blocklen;
	uint32_t md_len = raid_bdev->bdev.md_len;
	uint32_t md_len = raid_bdev->bdev.md_interleave ? 0 : raid_bdev->bdev.md_len;
	size_t stripe_len = r5f_info->stripe_blocks * blocklen;
	size_t stripe_md_len = r5f_info->stripe_blocks * md_len;