Commit 1d29b231 authored by Xiaodong Liu's avatar Xiaodong Liu Committed by Changpeng Liu
Browse files

bdev/raid: extend unmap process to null data io



Other io_type, like FLUSH, has a similar character with
UNMAP, that has a range description (offset and length),
but has no data payload. So the process for UNMAP io_type
can be extended to io_type like FLUSH.

Change-Id: I9467dfc3cc4fc1431b79359b0c477807ec138ac7
Signed-off-by: default avatarXiaodong Liu <xiaodong.liu@intel.com>
Reviewed-on: https://review.gerrithub.io/c/446491


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarwuzhouhui <wuzhouhui@kingsoft.com>
Reviewed-by: default avatarPiotr Pelpliński <piotr.pelplinski@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
parent 59f0d22e
Loading
Loading
Loading
Loading
+28 −17
Original line number Diff line number Diff line
@@ -634,7 +634,7 @@ _raid_bdev_get_io_range(struct raid_bdev_io_range *io_range,
	io_range->start_disk = start_strip % num_base_bdevs;
	io_range->end_disk = end_strip % num_base_bdevs;

	/* Calculate how many base_bdevs are involved in unmap operation.
	/* Calculate how many base_bdevs are involved in io operation.
	 * Number of base bdevs involved is between 1 and num_base_bdevs.
	 * It will be 1 if the first strip and last strip are the same one.
	 */
@@ -693,16 +693,17 @@ _raid_bdev_split_io_range(struct raid_bdev_io_range *io_range, uint64_t disk_idx

/*
 * brief:
 * _raid_bdev_submit_unmap_request_next function submits the next batch of unmap requests
 * to member disks; it will submit as many as possible unless one unmap fails with -ENOMEM, in
 * which case it will queue it for later submission
 * _raid_bdev_submit_null_payload_request_next function submits the next batch of
 * io requests with range but without payload, like FLUSH and UNMAP, to member disks;
 * it will submit as many as possible unless one base io request fails with -ENOMEM,
 * in which case it will queue itself for later submission.
 * params:
 * bdev_io - pointer to parent bdev_io on raid bdev device
 * returns:
 * none
 */
static void
_raid_bdev_submit_unmap_request_next(void *_bdev_io)
_raid_bdev_submit_null_payload_request_next(void *_bdev_io)
{
	struct spdk_bdev_io		*bdev_io = _bdev_io;
	struct raid_bdev_io		*raid_io;
@@ -733,15 +734,25 @@ _raid_bdev_submit_unmap_request_next(void *_bdev_io)

		_raid_bdev_split_io_range(&io_range, disk_idx, &offset_in_disk, &nblocks_in_disk);

		switch (bdev_io->type) {
		case SPDK_BDEV_IO_TYPE_UNMAP:
			ret = spdk_bdev_unmap_blocks(raid_bdev->base_bdev_info[disk_idx].desc,
						     raid_ch->base_channel[disk_idx],
						     offset_in_disk, nblocks_in_disk,
						     raid_bdev_base_io_completion, bdev_io);
			break;

		default:
			SPDK_ERRLOG("submit request, invalid io type with null payload %u\n", bdev_io->type);
			assert(false);
			ret = -EIO;
		}

		if (ret == 0) {
			raid_io->base_bdev_io_submitted++;
		} else {
			raid_bdev_base_io_submit_fail_process(bdev_io, disk_idx,
							      _raid_bdev_submit_unmap_request_next, ret);
							      _raid_bdev_submit_null_payload_request_next, ret);
			return;
		}
	}
@@ -749,8 +760,8 @@ _raid_bdev_submit_unmap_request_next(void *_bdev_io)

/*
 * brief:
 * _raid_bdev_submit_unmap_request function is the submit_request function for
 * unmap requests
 * _raid_bdev_submit_null_payload_request function is the submit_request function
 * for io requests with range but without payload, like UNMAP and FLUSH.
 * params:
 * ch - pointer to raid bdev io channel
 * bdev_io - pointer to parent bdev_io on raid bdev device
@@ -758,7 +769,7 @@ _raid_bdev_submit_unmap_request_next(void *_bdev_io)
 * none
 */
static void
_raid_bdev_submit_unmap_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io)
_raid_bdev_submit_null_payload_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io)
{
	struct raid_bdev_io		*raid_io;

@@ -768,10 +779,10 @@ _raid_bdev_submit_unmap_request(struct spdk_io_channel *ch, struct spdk_bdev_io
	raid_io->base_bdev_io_completed = 0;
	raid_io->base_bdev_io_status = SPDK_BDEV_IO_STATUS_SUCCESS;

	SPDK_DEBUGLOG(SPDK_LOG_BDEV_RAID, "raid_bdev unmap (0x%lx, 0x%lx)\n",
		      bdev_io->u.bdev.offset_blocks, bdev_io->u.bdev.num_blocks);
	SPDK_DEBUGLOG(SPDK_LOG_BDEV_RAID, "raid_bdev: type %d, range (0x%lx, 0x%lx)\n",
		      bdev_io->type, bdev_io->u.bdev.offset_blocks, bdev_io->u.bdev.num_blocks);

	_raid_bdev_submit_unmap_request_next(bdev_io);
	_raid_bdev_submit_null_payload_request_next(bdev_io);
}

/*
@@ -834,7 +845,7 @@ raid_bdev_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_i
		break;

	case SPDK_BDEV_IO_TYPE_UNMAP:
		_raid_bdev_submit_unmap_request(ch, bdev_io);
		_raid_bdev_submit_null_payload_request(ch, bdev_io);
		break;

	default: