Commit ec2ba7aa authored by Yao Liu's avatar Yao Liu Committed by Tomasz Zawadzki
Browse files

bdev/uring: add an argument to specify block size



The block size of non-disk files can't be automatically detected,
so add an argument to specify it.

Signed-off-by: default avatarYao Liu <yotta.liu@ucloud.cn>
Change-Id: Ia11ab177b78c66ede4a09a997bba28827d83ec25
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/473607


Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Community-CI: Broadcom SPDK FC-NVMe CI <spdk-ci.pdl@broadcom.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent 9d9a90fa
Loading
Loading
Loading
Loading
+35 −6
Original line number Diff line number Diff line
@@ -410,10 +410,10 @@ bdev_uring_group_destroy_cb(void *io_device, void *ctx_buf)
}

struct spdk_bdev *
create_uring_bdev(const char *name, const char *filename)
create_uring_bdev(const char *name, const char *filename, uint32_t block_size)
{
	struct bdev_uring *uring;
	uint32_t block_size;
	uint32_t detected_block_size;
	uint64_t bdev_size;
	int rc;

@@ -444,11 +444,26 @@ create_uring_bdev(const char *name, const char *filename)

	uring->bdev.write_cache = 1;

	block_size = spdk_fd_get_blocklen(uring->fd);
	detected_block_size = spdk_fd_get_blocklen(uring->fd);
	if (block_size == 0) {
		/* User did not specify block size - use autodetected block size. */
		if (detected_block_size == 0) {
			SPDK_ERRLOG("Block size could not be auto-detected\n");
			goto error_return;
		}
		block_size = detected_block_size;
	} else {
		if (block_size < detected_block_size) {
			SPDK_ERRLOG("Specified block size %" PRIu32 " is smaller than "
				    "auto-detected block size %" PRIu32 "\n",
				    block_size, detected_block_size);
			goto error_return;
		} else if (detected_block_size != 0 && block_size != detected_block_size) {
			SPDK_WARNLOG("Specified block size %" PRIu32 " does not match "
				     "auto-detected block size %" PRIu32 "\n",
				     block_size, detected_block_size);
		}
	}

	if (block_size < 512) {
		SPDK_ERRLOG("Invalid block size %" PRIu32 " (must be at least 512).\n", block_size);
@@ -548,6 +563,9 @@ bdev_uring_init(void)
	while (true) {
		const char *file;
		const char *name;
		const char *block_size_str;
		uint32_t block_size = 0;
		long int tmp;

		file = spdk_conf_section_get_nmval(sp, "URING", i, 0);
		if (!file) {
@@ -561,7 +579,18 @@ bdev_uring_init(void)
			continue;
		}

		bdev = create_uring_bdev(name, file);
		block_size_str = spdk_conf_section_get_nmval(sp, "URING", i, 2);
		if (block_size_str) {
			tmp = spdk_strtol(block_size_str, 10);
			if (tmp < 0) {
				SPDK_ERRLOG("Invalid block size for URING bdev with file %s\n", file);
				i++;
				continue;
			}
			block_size = (uint32_t)tmp;
		}

		bdev = create_uring_bdev(name, file, block_size);
		if (!bdev) {
			SPDK_ERRLOG("Unable to create URING bdev from file %s\n", file);
			i++;
+1 −1
Original line number Diff line number Diff line
@@ -43,7 +43,7 @@

typedef void (*spdk_delete_uring_complete)(void *cb_arg, int bdeverrno);

struct spdk_bdev *create_uring_bdev(const char *name, const char *filename);
struct spdk_bdev *create_uring_bdev(const char *name, const char *filename, uint32_t block_size);

void delete_uring_bdev(struct spdk_bdev *bdev, spdk_delete_uring_complete cb_fn, void *cb_arg);

+3 −1
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@
struct rpc_create_uring {
	char *name;
	char *filename;
	uint32_t block_size;
};

/* Free the allocated memory resource after the RPC handling. */
@@ -55,6 +56,7 @@ free_rpc_create_uring(struct rpc_create_uring *r)
static const struct spdk_json_object_decoder rpc_create_uring_decoders[] = {
	{"name", offsetof(struct rpc_create_uring, name), spdk_json_decode_string},
	{"filename", offsetof(struct rpc_create_uring, filename), spdk_json_decode_string},
	{"block_size", offsetof(struct rpc_create_uring, block_size), spdk_json_decode_uint32, true},
};

/* Decode the parameters for this RPC method and properly create the uring
@@ -77,7 +79,7 @@ spdk_rpc_bdev_uring_create(struct spdk_jsonrpc_request *request,
		goto cleanup;
	}

	bdev = create_uring_bdev(req.name, req.filename);
	bdev = create_uring_bdev(req.name, req.filename, req.block_size);
	if (!bdev) {
		SPDK_ERRLOG("Unable to create URING bdev from file %s\n", req.filename);
		spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
+3 −1
Original line number Diff line number Diff line
@@ -329,11 +329,13 @@ if __name__ == "__main__":
    def bdev_uring_create(args):
        print_json(rpc.bdev.bdev_uring_create(args.client,
                                              filename=args.filename,
                                              name=args.name))
                                              name=args.name,
                                              block_size=args.block_size))

    p = subparsers.add_parser('bdev_uring_create', help='Create a bdev with io_uring backend')
    p.add_argument('filename', help='Path to device or file (ex: /dev/nvme0n1)')
    p.add_argument('name', help='bdev name')
    p.add_argument('block_size', help='Block size for this bdev', type=int, nargs='?', default=0)
    p.set_defaults(func=bdev_uring_create)

    def bdev_uring_delete(args):
+5 −1
Original line number Diff line number Diff line
@@ -321,12 +321,13 @@ def bdev_aio_delete(client, name):
    return client.call('bdev_aio_delete', params)


def bdev_uring_create(client, filename, name):
def bdev_uring_create(client, filename, name, block_size=None):
    """Create a bdev with Linux io_uring backend.

    Args:
        filename: path to device or file (ex: /dev/nvme0n1)
        name: name of bdev
        block_size: block size of device (optional; autodetected if omitted)

    Returns:
        Name of created bdev.
@@ -334,6 +335,9 @@ def bdev_uring_create(client, filename, name):
    params = {'name': name,
              'filename': filename}

    if block_size:
        params['block_size'] = block_size

    return client.call('bdev_uring_create', params)