diff --git a/lib/vhost/vhost.c b/lib/vhost/vhost.c index 380fd3b41..945faaacd 100644 --- a/lib/vhost/vhost.c +++ b/lib/vhost/vhost.c @@ -346,6 +346,7 @@ spdk_vhost_dev_construct(struct spdk_vhost_dev *vdev, const char *name, uint64_t vdev->lcore = -1; vdev->cpumask = cpumask; vdev->type = type; + vdev->vhost_backend = backend; g_spdk_vhost_devices[ctrlr_num] = vdev; @@ -703,4 +704,11 @@ spdk_vhost_timed_event_wait(struct spdk_vhost_timed_event *ev, const char *errms sem_destroy(&ev->sem); } +void +spdk_vhost_dump_config_json(struct spdk_vhost_dev *vdev, struct spdk_json_write_ctx *w) +{ + assert(vdev->vhost_backend->dump_config_json != NULL); + vdev->vhost_backend->dump_config_json(vdev, w); +} + SPDK_LOG_REGISTER_TRACE_FLAG("vhost_ring", SPDK_TRACE_VHOST_RING) diff --git a/lib/vhost/vhost_blk.c b/lib/vhost/vhost_blk.c index a46103672..e2872f4ed 100644 --- a/lib/vhost/vhost_blk.c +++ b/lib/vhost/vhost_blk.c @@ -428,15 +428,6 @@ spdk_vhost_blk_get_dev(struct spdk_vhost_dev *vdev) return bvdev->bdev; } -bool -spdk_vhost_blk_get_readonly(struct spdk_vhost_dev *vdev) -{ - struct spdk_vhost_blk_dev *bvdev = to_blk_dev(vdev); - - assert(bvdev != NULL); - return bvdev->readonly; -} - static void bdev_remove_cb(void *remove_ctx) { @@ -517,6 +508,29 @@ destroy_device(int vid) spdk_vhost_dev_unload(vdev); } +static void +spdk_vhost_blk_dump_config_json(struct spdk_vhost_dev *vdev, struct spdk_json_write_ctx *w) +{ + struct spdk_bdev *bdev = spdk_vhost_blk_get_dev(vdev); + struct spdk_vhost_blk_dev *bvdev = to_blk_dev(vdev); + + assert(bvdev != NULL); + spdk_json_write_name(w, "block"); + spdk_json_write_object_begin(w); + + spdk_json_write_name(w, "readonly"); + spdk_json_write_bool(w, bvdev->readonly); + + spdk_json_write_name(w, "bdev"); + if (bdev) { + spdk_json_write_string(w, spdk_bdev_get_name(bdev)); + } else { + spdk_json_write_null(w); + } + + spdk_json_write_object_end(w); +} + static const struct spdk_vhost_dev_backend vhost_blk_device_backend = { .virtio_features = (1ULL << VHOST_F_LOG_ALL) | (1ULL << VHOST_USER_F_PROTOCOL_FEATURES) | (1ULL << VIRTIO_F_VERSION_1) | (1ULL << VIRTIO_F_NOTIFY_ON_EMPTY) | @@ -528,6 +542,7 @@ static const struct spdk_vhost_dev_backend vhost_blk_device_backend = { .disabled_features = (1ULL << VHOST_F_LOG_ALL) | (1ULL << VIRTIO_BLK_F_GEOMETRY) | (1ULL << VIRTIO_BLK_F_RO) | (1ULL << VIRTIO_BLK_F_FLUSH) | (1ULL << VIRTIO_BLK_F_CONFIG_WCE) | (1ULL << VIRTIO_BLK_F_BARRIER) | (1ULL << VIRTIO_BLK_F_SCSI), + .dump_config_json = spdk_vhost_blk_dump_config_json, .ops = { .new_device = new_device, .destroy_device = destroy_device, diff --git a/lib/vhost/vhost_internal.h b/lib/vhost/vhost_internal.h index 1cb4473ba..40922f203 100644 --- a/lib/vhost/vhost_internal.h +++ b/lib/vhost/vhost_internal.h @@ -40,6 +40,7 @@ #include "spdk_internal/log.h" #include "spdk/event.h" +#include "spdk/rpc.h" #define SPDK_CACHE_LINE_SIZE RTE_CACHE_LINE_SIZE @@ -66,6 +67,13 @@ enum spdk_vhost_dev_type { SPDK_VHOST_DEV_T_BLK, }; +struct spdk_vhost_dev_backend { + uint64_t virtio_features; + uint64_t disabled_features; + void (*dump_config_json)(struct spdk_vhost_dev *vdev, struct spdk_json_write_ctx *w); + const struct vhost_device_ops ops; +}; + struct spdk_vhost_dev { struct rte_vhost_memory *mem; char *name; @@ -82,13 +90,7 @@ struct spdk_vhost_dev { uint64_t negotiated_features; struct rte_vhost_vring virtqueue[SPDK_VHOST_MAX_VQUEUES] __attribute((aligned( SPDK_CACHE_LINE_SIZE))); -}; - - -struct spdk_vhost_dev_backend { - uint64_t virtio_features; - uint64_t disabled_features; - const struct vhost_device_ops ops; + const struct spdk_vhost_dev_backend *vhost_backend; }; void spdk_vhost_dev_mem_register(struct spdk_vhost_dev *vdev); @@ -145,5 +147,6 @@ void spdk_vhost_timed_event_send(int32_t lcore, spdk_vhost_timed_event_fn cn_fn, void spdk_vhost_timed_event_wait(struct spdk_vhost_timed_event *event, const char *errmsg); int spdk_vhost_blk_controller_construct(void); +void spdk_vhost_dump_config_json(struct spdk_vhost_dev *vdev, struct spdk_json_write_ctx *w); #endif /* SPDK_VHOST_INTERNAL_H */ diff --git a/lib/vhost/vhost_rpc.c b/lib/vhost/vhost_rpc.c index a055f6586..93c084700 100644 --- a/lib/vhost/vhost_rpc.c +++ b/lib/vhost/vhost_rpc.c @@ -42,99 +42,6 @@ #include "vhost_internal.h" #include "spdk/bdev.h" -static void -json_scsi_dev_write(struct spdk_json_write_ctx *ctx, struct spdk_scsi_dev *dev) -{ - int l; - - spdk_json_write_name(ctx, "id"); - spdk_json_write_int32(ctx, spdk_scsi_dev_get_id(dev)); - - spdk_json_write_name(ctx, "device_name"); - spdk_json_write_string(ctx, spdk_scsi_dev_get_name(dev)); - - spdk_json_write_name(ctx, "luns"); - spdk_json_write_array_begin(ctx); - - for (l = 0; l < SPDK_SCSI_DEV_MAX_LUN; l++) { - struct spdk_scsi_lun *lun = spdk_scsi_dev_get_lun(dev, l); - - if (!lun) { - continue; - } - - spdk_json_write_object_begin(ctx); - - spdk_json_write_name(ctx, "id"); - spdk_json_write_int32(ctx, spdk_scsi_lun_get_id(lun)); - - spdk_json_write_name(ctx, "lun_name"); - spdk_json_write_string(ctx, spdk_scsi_lun_get_name(lun)); - - spdk_json_write_object_end(ctx); - } - spdk_json_write_array_end(ctx); -} - -static void -spdk_rpc_get_vhost_scsi_controllers(struct spdk_jsonrpc_request *request, - const struct spdk_json_val *params) -{ - struct spdk_json_write_ctx *w; - struct spdk_vhost_dev *vdev = NULL; - struct spdk_scsi_dev *dev; - uint32_t i; - - if (params != NULL) { - spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, - "get_vhost_scsi_controllers requires no parameters"); - return; - } - - w = spdk_jsonrpc_begin_result(request); - if (w == NULL) { - return; - } - - spdk_json_write_array_begin(w); - while ((vdev = spdk_vhost_dev_next(vdev)) != NULL) { - if (vdev->type != SPDK_VHOST_DEV_T_SCSI) { - continue; - } - - spdk_json_write_object_begin(w); - - spdk_json_write_name(w, "ctrlr"); - spdk_json_write_string(w, spdk_vhost_dev_get_name(vdev)); - - spdk_json_write_name(w, "cpumask"); - spdk_json_write_string_fmt(w, "%#" PRIx64, spdk_vhost_dev_get_cpumask(vdev)); - - spdk_json_write_name(w, "scsi_devs"); - spdk_json_write_array_begin(w); - - for (i = 0; i < SPDK_VHOST_SCSI_CTRLR_MAX_DEVS; i++) { - dev = spdk_vhost_scsi_dev_get_dev(vdev, i); - if (!dev) - continue; - - spdk_json_write_object_begin(w); - spdk_json_write_name(w, "scsi_dev_num"); - spdk_json_write_uint32(w, i); - json_scsi_dev_write(w, dev); - spdk_json_write_object_end(w); - } - - spdk_json_write_array_end(w); // devs - - spdk_json_write_object_end(w); // ctrl - } - spdk_json_write_array_end(w); - spdk_jsonrpc_end_result(request, w); - return; -} -SPDK_RPC_REGISTER("get_vhost_scsi_controllers", spdk_rpc_get_vhost_scsi_controllers) - struct rpc_vhost_scsi_ctrlr { char *ctrlr; char *cpumask; @@ -502,17 +409,15 @@ invalid: SPDK_RPC_REGISTER("remove_vhost_blk_controller", spdk_rpc_remove_vhost_blk_controller) static void -spdk_rpc_get_vhost_blk_controllers(struct spdk_jsonrpc_request *request, - const struct spdk_json_val *params) +spdk_rpc_get_vhost_controllers(struct spdk_jsonrpc_request *request, + const struct spdk_json_val *params) { struct spdk_json_write_ctx *w; struct spdk_vhost_dev *vdev = NULL; - struct spdk_bdev *bdev; if (params != NULL) { - spdk_jsonrpc_send_error_response(request, - SPDK_JSONRPC_ERROR_INVALID_PARAMS, - "get_vhost_block_controllers requires no parameters"); + spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, + "get_vhost_controllers requires no parameters"); return; } @@ -523,8 +428,6 @@ spdk_rpc_get_vhost_blk_controllers(struct spdk_jsonrpc_request *request, spdk_json_write_array_begin(w); while ((vdev = spdk_vhost_dev_next(vdev)) != NULL) { - if (vdev->type != SPDK_VHOST_DEV_T_BLK) - continue; spdk_json_write_object_begin(w); spdk_json_write_name(w, "ctrlr"); @@ -533,19 +436,16 @@ spdk_rpc_get_vhost_blk_controllers(struct spdk_jsonrpc_request *request, spdk_json_write_name(w, "cpumask"); spdk_json_write_string_fmt(w, "%#" PRIx64, spdk_vhost_dev_get_cpumask(vdev)); - spdk_json_write_name(w, "readonly"); - spdk_json_write_bool(w, spdk_vhost_blk_get_readonly(vdev)); + spdk_json_write_name(w, "backend_specific"); - bdev = spdk_vhost_blk_get_dev(vdev); - spdk_json_write_name(w, "dev_name"); - if (bdev) - spdk_json_write_string(w, spdk_bdev_get_name(bdev)); - else - spdk_json_write_null(w); + spdk_json_write_object_begin(w); + spdk_vhost_dump_config_json(vdev, w); + spdk_json_write_object_end(w); spdk_json_write_object_end(w); } + spdk_json_write_array_end(w); spdk_jsonrpc_end_result(request, w); } -SPDK_RPC_REGISTER("get_vhost_blk_controllers", spdk_rpc_get_vhost_blk_controllers) +SPDK_RPC_REGISTER("get_vhost_controllers", spdk_rpc_get_vhost_controllers) diff --git a/lib/vhost/vhost_scsi.c b/lib/vhost/vhost_scsi.c index 14c5bff7e..67082fa51 100644 --- a/lib/vhost/vhost_scsi.c +++ b/lib/vhost/vhost_scsi.c @@ -114,10 +114,12 @@ struct spdk_vhost_scsi_event { static int new_device(int vid); static void destroy_device(int vid); +static void spdk_vhost_scsi_config_json(struct spdk_vhost_dev *vdev, struct spdk_json_write_ctx *w); const struct spdk_vhost_dev_backend spdk_vhost_scsi_device_backend = { .virtio_features = SPDK_VHOST_SCSI_FEATURES, .disabled_features = SPDK_VHOST_SCSI_DISABLED_FEATURES, + .dump_config_json = spdk_vhost_scsi_config_json, .ops = { .new_device = new_device, .destroy_device = destroy_device, @@ -1203,6 +1205,58 @@ spdk_vhost_fini(void) return 0; } +static void +spdk_vhost_scsi_config_json(struct spdk_vhost_dev *vdev, struct spdk_json_write_ctx *w) +{ + struct spdk_scsi_dev *sdev; + struct spdk_scsi_lun *lun; + uint32_t dev_idx; + uint32_t lun_idx; + + assert(vdev != NULL); + spdk_json_write_name(w, "scsi"); + spdk_json_write_object_begin(w); + for (dev_idx = 0; dev_idx < SPDK_VHOST_SCSI_CTRLR_MAX_DEVS; dev_idx++) { + sdev = spdk_vhost_scsi_dev_get_dev(vdev, dev_idx); + if (!sdev) { + continue; + } + + spdk_json_write_name(w, "scsi_dev_num"); + spdk_json_write_uint32(w, dev_idx); + + spdk_json_write_name(w, "id"); + spdk_json_write_int32(w, spdk_scsi_dev_get_id(sdev)); + + spdk_json_write_name(w, "device_name"); + spdk_json_write_string(w, spdk_scsi_dev_get_name(sdev)); + + spdk_json_write_name(w, "luns"); + spdk_json_write_array_begin(w); + + for (lun_idx = 0; lun_idx < SPDK_SCSI_DEV_MAX_LUN; lun_idx++) { + lun = spdk_scsi_dev_get_lun(sdev, lun_idx); + if (!lun) { + continue; + } + + spdk_json_write_object_begin(w); + + spdk_json_write_name(w, "id"); + spdk_json_write_int32(w, spdk_scsi_lun_get_id(lun)); + + spdk_json_write_name(w, "name"); + spdk_json_write_string(w, spdk_scsi_lun_get_name(lun)); + + spdk_json_write_object_end(w); + } + + spdk_json_write_array_end(w); + } + + spdk_json_write_object_end(w); +} + SPDK_LOG_REGISTER_TRACE_FLAG("vhost_scsi", SPDK_TRACE_VHOST_SCSI) SPDK_LOG_REGISTER_TRACE_FLAG("vhost_scsi_queue", SPDK_TRACE_VHOST_SCSI_QUEUE) SPDK_LOG_REGISTER_TRACE_FLAG("vhost_scsi_data", SPDK_TRACE_VHOST_SCSI_DATA) diff --git a/scripts/rpc.py b/scripts/rpc.py index e3df462f1..006ea0a1f 100755 --- a/scripts/rpc.py +++ b/scripts/rpc.py @@ -470,12 +470,6 @@ p = subparsers.add_parser('kill_instance', help='Send signal to instance') p.add_argument('sig_name', help='signal will be sent to server.') p.set_defaults(func=kill_instance) -def get_vhost_scsi_controllers(args): - print_dict(jsonrpc_call('get_vhost_scsi_controllers')) - -p = subparsers.add_parser('get_vhost_scsi_controllers', help='List vhost controllers') -p.set_defaults(func=get_vhost_scsi_controllers) - def construct_vhost_scsi_controller(args): params = {'ctrlr': args.ctrlr} @@ -549,11 +543,11 @@ p = subparsers.add_parser('remove_vhost_blk_controller', help='Remove a vhost bl p.add_argument('ctrlr', help='controller name') p.set_defaults(func=remove_vhost_blk_controller) -def get_vhost_blk_controllers(args): - print_dict(jsonrpc_call('get_vhost_blk_controllers')) +def get_vhost_controllers(args): + print_dict(jsonrpc_call('get_vhost_controllers')) -p = subparsers.add_parser('get_vhost_blk_controllers', help='List vhost block controllers') -p.set_defaults(func=get_vhost_blk_controllers) +p = subparsers.add_parser('get_vhost_controllers', help='List vhost controllers') +p.set_defaults(func=get_vhost_controllers) def get_rpc_methods(args): print_dict(jsonrpc_call('get_rpc_methods')) diff --git a/test/vhost/fiotest/autotest.sh b/test/vhost/fiotest/autotest.sh index c6fb0ca0d..f26069fb6 100755 --- a/test/vhost/fiotest/autotest.sh +++ b/test/vhost/fiotest/autotest.sh @@ -198,8 +198,7 @@ for vm_conf in ${vms[@]}; do done done <<< "${conf[2]}" unset IFS; - $rpc_py get_vhost_scsi_controllers - $rpc_py get_vhost_blk_controllers + $rpc_py get_vhost_controllers fi $setup_cmd done