vhost: add packed ring support
Update vhost blk contruct rpc, make it enable to support packed ring feature. Change-Id: Ia1f75e72e8441e8d82fad89073e4875f89e5b9cd Signed-off-by: Jin Yu <jin.yu@intel.com> Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/1567 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Changpeng Liu <changpeng.liu@intel.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
parent
cbfc8b2d48
commit
2eabc71518
@ -313,11 +313,12 @@ int spdk_vhost_scsi_dev_remove_tgt(struct spdk_vhost_dev *vdev, unsigned scsi_tg
|
|||||||
* \param dev_name bdev name to associate with this vhost device
|
* \param dev_name bdev name to associate with this vhost device
|
||||||
* \param readonly if set, all writes to the device will fail with
|
* \param readonly if set, all writes to the device will fail with
|
||||||
* \c VIRTIO_BLK_S_IOERR error code.
|
* \c VIRTIO_BLK_S_IOERR error code.
|
||||||
|
* \param packed_ring this controller supports packed ring if set.
|
||||||
*
|
*
|
||||||
* \return 0 on success, negative errno on error.
|
* \return 0 on success, negative errno on error.
|
||||||
*/
|
*/
|
||||||
int spdk_vhost_blk_construct(const char *name, const char *cpumask, const char *dev_name,
|
int spdk_vhost_blk_construct(const char *name, const char *cpumask, const char *dev_name,
|
||||||
bool readonly);
|
bool readonly, bool packed_ring);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove a vhost device. The device must not have any open connections on it's socket.
|
* Remove a vhost device. The device must not have any open connections on it's socket.
|
||||||
|
@ -34,7 +34,7 @@
|
|||||||
SPDK_ROOT_DIR := $(abspath $(CURDIR)/../..)
|
SPDK_ROOT_DIR := $(abspath $(CURDIR)/../..)
|
||||||
include $(SPDK_ROOT_DIR)/mk/spdk.common.mk
|
include $(SPDK_ROOT_DIR)/mk/spdk.common.mk
|
||||||
|
|
||||||
SO_VER := 2
|
SO_VER := 3
|
||||||
SO_MINOR := 0
|
SO_MINOR := 0
|
||||||
SO_SUFFIX := $(SO_VER).$(SO_MINOR)
|
SO_SUFFIX := $(SO_VER).$(SO_MINOR)
|
||||||
|
|
||||||
|
@ -1158,6 +1158,7 @@ vhost_blk_controller_construct(void)
|
|||||||
char *cpumask;
|
char *cpumask;
|
||||||
char *name;
|
char *name;
|
||||||
bool readonly;
|
bool readonly;
|
||||||
|
bool packed_ring;
|
||||||
|
|
||||||
for (sp = spdk_conf_first_section(NULL); sp != NULL; sp = spdk_conf_next_section(sp)) {
|
for (sp = spdk_conf_first_section(NULL); sp != NULL; sp = spdk_conf_next_section(sp)) {
|
||||||
if (!spdk_conf_section_match_prefix(sp, "VhostBlk")) {
|
if (!spdk_conf_section_match_prefix(sp, "VhostBlk")) {
|
||||||
@ -1178,13 +1179,15 @@ vhost_blk_controller_construct(void)
|
|||||||
|
|
||||||
cpumask = spdk_conf_section_get_val(sp, "Cpumask");
|
cpumask = spdk_conf_section_get_val(sp, "Cpumask");
|
||||||
readonly = spdk_conf_section_get_boolval(sp, "ReadOnly", false);
|
readonly = spdk_conf_section_get_boolval(sp, "ReadOnly", false);
|
||||||
|
packed_ring = spdk_conf_section_get_boolval(sp, "PackedRing", false);
|
||||||
|
|
||||||
bdev_name = spdk_conf_section_get_val(sp, "Dev");
|
bdev_name = spdk_conf_section_get_val(sp, "Dev");
|
||||||
if (bdev_name == NULL) {
|
if (bdev_name == NULL) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (spdk_vhost_blk_construct(name, cpumask, bdev_name, readonly) < 0) {
|
if (spdk_vhost_blk_construct(name, cpumask, bdev_name,
|
||||||
|
readonly, packed_ring) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1193,7 +1196,8 @@ vhost_blk_controller_construct(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
spdk_vhost_blk_construct(const char *name, const char *cpumask, const char *dev_name, bool readonly)
|
spdk_vhost_blk_construct(const char *name, const char *cpumask, const char *dev_name,
|
||||||
|
bool readonly, bool packed_ring)
|
||||||
{
|
{
|
||||||
struct spdk_vhost_blk_dev *bvdev = NULL;
|
struct spdk_vhost_blk_dev *bvdev = NULL;
|
||||||
struct spdk_vhost_dev *vdev;
|
struct spdk_vhost_dev *vdev;
|
||||||
@ -1220,6 +1224,8 @@ spdk_vhost_blk_construct(const char *name, const char *cpumask, const char *dev_
|
|||||||
vdev->disabled_features = SPDK_VHOST_BLK_DISABLED_FEATURES;
|
vdev->disabled_features = SPDK_VHOST_BLK_DISABLED_FEATURES;
|
||||||
vdev->protocol_features = SPDK_VHOST_BLK_PROTOCOL_FEATURES;
|
vdev->protocol_features = SPDK_VHOST_BLK_PROTOCOL_FEATURES;
|
||||||
|
|
||||||
|
vdev->virtio_features |= (uint64_t)packed_ring << VIRTIO_F_RING_PACKED;
|
||||||
|
|
||||||
if (spdk_bdev_io_type_supported(bdev, SPDK_BDEV_IO_TYPE_UNMAP)) {
|
if (spdk_bdev_io_type_supported(bdev, SPDK_BDEV_IO_TYPE_UNMAP)) {
|
||||||
vdev->virtio_features |= (1ULL << VIRTIO_BLK_F_DISCARD);
|
vdev->virtio_features |= (1ULL << VIRTIO_BLK_F_DISCARD);
|
||||||
}
|
}
|
||||||
|
@ -242,6 +242,7 @@ struct rpc_vhost_blk_ctrlr {
|
|||||||
char *dev_name;
|
char *dev_name;
|
||||||
char *cpumask;
|
char *cpumask;
|
||||||
bool readonly;
|
bool readonly;
|
||||||
|
bool packed_ring;
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct spdk_json_object_decoder rpc_construct_vhost_blk_ctrlr[] = {
|
static const struct spdk_json_object_decoder rpc_construct_vhost_blk_ctrlr[] = {
|
||||||
@ -249,6 +250,7 @@ static const struct spdk_json_object_decoder rpc_construct_vhost_blk_ctrlr[] = {
|
|||||||
{"dev_name", offsetof(struct rpc_vhost_blk_ctrlr, dev_name), spdk_json_decode_string },
|
{"dev_name", offsetof(struct rpc_vhost_blk_ctrlr, dev_name), spdk_json_decode_string },
|
||||||
{"cpumask", offsetof(struct rpc_vhost_blk_ctrlr, cpumask), spdk_json_decode_string, true},
|
{"cpumask", offsetof(struct rpc_vhost_blk_ctrlr, cpumask), spdk_json_decode_string, true},
|
||||||
{"readonly", offsetof(struct rpc_vhost_blk_ctrlr, readonly), spdk_json_decode_bool, true},
|
{"readonly", offsetof(struct rpc_vhost_blk_ctrlr, readonly), spdk_json_decode_bool, true},
|
||||||
|
{"packed_ring", offsetof(struct rpc_vhost_blk_ctrlr, packed_ring), spdk_json_decode_bool, true},
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -275,7 +277,8 @@ spdk_rpc_vhost_create_blk_controller(struct spdk_jsonrpc_request *request,
|
|||||||
goto invalid;
|
goto invalid;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = spdk_vhost_blk_construct(req.ctrlr, req.cpumask, req.dev_name, req.readonly);
|
rc = spdk_vhost_blk_construct(req.ctrlr, req.cpumask, req.dev_name,
|
||||||
|
req.readonly, req.packed_ring);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
goto invalid;
|
goto invalid;
|
||||||
}
|
}
|
||||||
|
@ -1993,7 +1993,8 @@ Format: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 mse
|
|||||||
ctrlr=args.ctrlr,
|
ctrlr=args.ctrlr,
|
||||||
dev_name=args.dev_name,
|
dev_name=args.dev_name,
|
||||||
cpumask=args.cpumask,
|
cpumask=args.cpumask,
|
||||||
readonly=args.readonly)
|
readonly=args.readonly,
|
||||||
|
packed_ring=args.packed_ring)
|
||||||
|
|
||||||
p = subparsers.add_parser('vhost_create_blk_controller',
|
p = subparsers.add_parser('vhost_create_blk_controller',
|
||||||
aliases=['construct_vhost_blk_controller'],
|
aliases=['construct_vhost_blk_controller'],
|
||||||
@ -2002,6 +2003,7 @@ Format: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 mse
|
|||||||
p.add_argument('dev_name', help='device name')
|
p.add_argument('dev_name', help='device name')
|
||||||
p.add_argument('--cpumask', help='cpu mask for this controller')
|
p.add_argument('--cpumask', help='cpu mask for this controller')
|
||||||
p.add_argument("-r", "--readonly", action='store_true', help='Set controller as read-only')
|
p.add_argument("-r", "--readonly", action='store_true', help='Set controller as read-only')
|
||||||
|
p.add_argument("-p", "--packed_ring", action='store_true', help='Set controller as packed ring supported')
|
||||||
p.set_defaults(func=vhost_create_blk_controller)
|
p.set_defaults(func=vhost_create_blk_controller)
|
||||||
|
|
||||||
def vhost_create_nvme_controller(args):
|
def vhost_create_nvme_controller(args):
|
||||||
|
@ -97,13 +97,14 @@ def vhost_nvme_controller_add_ns(client, ctrlr, bdev_name):
|
|||||||
|
|
||||||
|
|
||||||
@deprecated_alias('construct_vhost_blk_controller')
|
@deprecated_alias('construct_vhost_blk_controller')
|
||||||
def vhost_create_blk_controller(client, ctrlr, dev_name, cpumask=None, readonly=None):
|
def vhost_create_blk_controller(client, ctrlr, dev_name, cpumask=None, readonly=None, packed_ring=None):
|
||||||
"""Create vhost BLK controller.
|
"""Create vhost BLK controller.
|
||||||
Args:
|
Args:
|
||||||
ctrlr: controller name
|
ctrlr: controller name
|
||||||
dev_name: device name to add to controller
|
dev_name: device name to add to controller
|
||||||
cpumask: cpu mask for this controller
|
cpumask: cpu mask for this controller
|
||||||
readonly: set controller as read-only
|
readonly: set controller as read-only
|
||||||
|
packed_ring: support controller packed_ring
|
||||||
"""
|
"""
|
||||||
params = {
|
params = {
|
||||||
'ctrlr': ctrlr,
|
'ctrlr': ctrlr,
|
||||||
@ -113,6 +114,8 @@ def vhost_create_blk_controller(client, ctrlr, dev_name, cpumask=None, readonly=
|
|||||||
params['cpumask'] = cpumask
|
params['cpumask'] = cpumask
|
||||||
if readonly:
|
if readonly:
|
||||||
params['readonly'] = readonly
|
params['readonly'] = readonly
|
||||||
|
if packed_ring:
|
||||||
|
params['packed_ring'] = packed_ring
|
||||||
return client.call('vhost_create_blk_controller', params)
|
return client.call('vhost_create_blk_controller', params)
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user