Commit da625683 authored by Jin Yu's avatar Jin Yu Committed by Tomasz Zawadzki
Browse files

bdev: virtio blk read max size and segs



The backend device such as virtio-blk or virtio-scsi
may support the SIZE_MAX and SEG_MAX. Then SPDK needs
to split the big IO. Add this feature in bdev.

Change-Id: I2442e14121ccf141682964425e96382fec482af3
Signed-off-by: default avatarJin Yu <jin.yu@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/4600


Community-CI: Broadcom CI
Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
parent b94d358a
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -305,6 +305,17 @@ struct spdk_bdev {
	 */
	uint32_t optimal_io_boundary;

	/**
	 * Max io size in bytes of a single segment
	 *
	 * Note: both max_segment_size and max_num_segments
	 * should be zero or non-zero.
	 */
	uint32_t max_segment_size;

	/* Maximum number of segments in a I/O */
	uint32_t max_num_segments;

	/**
	 * UUID for this bdev.
	 *
+2 −2
Original line number Diff line number Diff line
@@ -34,8 +34,8 @@
SPDK_ROOT_DIR := $(abspath $(CURDIR)/../..)
include $(SPDK_ROOT_DIR)/mk/spdk.common.mk

SO_VER := 4
SO_MINOR := 1
SO_VER := 5
SO_MINOR := 0

ifeq ($(CONFIG_VTUNE),y)
CFLAGS += -I$(CONFIG_VTUNE_DIR)/include -I$(CONFIG_VTUNE_DIR)/sdk/src/ittnotify
+34 −1
Original line number Diff line number Diff line
@@ -412,7 +412,7 @@ virtio_blk_dev_init(struct virtio_blk_dev *bvdev, uint16_t max_queues)
	struct virtio_dev *vdev = &bvdev->vdev;
	struct spdk_bdev *bdev = &bvdev->bdev;
	uint64_t capacity, num_blocks;
	uint32_t block_size;
	uint32_t block_size, size_max, seg_max;
	uint16_t host_max_queues;
	int rc;

@@ -465,6 +465,39 @@ virtio_blk_dev_init(struct virtio_blk_dev *bvdev, uint16_t max_queues)
		host_max_queues = 1;
	}

	if (virtio_dev_has_feature(vdev, VIRTIO_BLK_F_SIZE_MAX)) {
		rc = virtio_dev_read_dev_config(vdev, offsetof(struct virtio_blk_config, size_max),
						&size_max, sizeof(size_max));
		if (rc) {
			SPDK_ERRLOG("%s: config read failed: %s\n", vdev->name, spdk_strerror(-rc));
			return rc;
		}

		if (spdk_unlikely(size_max < block_size)) {
			SPDK_WARNLOG("%s: minimum segment size is set to block size %u forcefully.\n",
				     vdev->name, block_size);
			size_max = block_size;
		}

		bdev->max_segment_size = size_max;
	}

	if (virtio_dev_has_feature(vdev, VIRTIO_BLK_F_SEG_MAX)) {
		rc = virtio_dev_read_dev_config(vdev, offsetof(struct virtio_blk_config, seg_max),
						&seg_max, sizeof(seg_max));
		if (rc) {
			SPDK_ERRLOG("%s: config read failed: %s\n", vdev->name, spdk_strerror(-rc));
			return rc;
		}

		if (spdk_unlikely(seg_max == 0)) {
			SPDK_ERRLOG("%s: virtio blk SEG_MAX can't be 0\n", vdev->name);
			return -EINVAL;
		}

		bdev->max_num_segments = seg_max;
	}

	if (virtio_dev_has_feature(vdev, VIRTIO_BLK_F_RO)) {
		bvdev->readonly = true;
	}