From dd4f161b7e5bc10ef74854238f74acde0a3089ab Mon Sep 17 00:00:00 2001 From: Darek Stojaczyk Date: Sun, 13 Jan 2019 18:28:46 +0100 Subject: [PATCH] vhost/rpc: remove any usages of the external events Replaced them with inline code that performs exactly the same but is shorter and easier to follow. External events were replaced by spdk_vhost_lock() and spdk_vhost_dev_find(). Change-Id: Id46a619c592c20a573664b54efc097489e9bb893 Signed-off-by: Darek Stojaczyk Reviewed-on: https://review.gerrithub.io/c/440378 Tested-by: SPDK CI Jenkins Reviewed-by: Pawel Wodkowski Reviewed-by: Shuhei Matsumoto Reviewed-by: Jim Harris Reviewed-by: Ben Walker --- lib/vhost/vhost_rpc.c | 417 +++++++++++++++++------------------------- 1 file changed, 170 insertions(+), 247 deletions(-) diff --git a/lib/vhost/vhost_rpc.c b/lib/vhost/vhost_rpc.c index 774a2c24aa..9b58292e1d 100644 --- a/lib/vhost/vhost_rpc.c +++ b/lib/vhost/vhost_rpc.c @@ -105,8 +105,6 @@ struct rpc_add_vhost_scsi_ctrlr_lun { char *ctrlr; int32_t scsi_target_num; char *bdev_name; - - struct spdk_jsonrpc_request *request; }; static void @@ -123,47 +121,13 @@ static const struct spdk_json_object_decoder rpc_vhost_add_lun[] = { {"bdev_name", offsetof(struct rpc_add_vhost_scsi_ctrlr_lun, bdev_name), spdk_json_decode_string }, }; -static int -spdk_rpc_add_vhost_scsi_lun_cb(struct spdk_vhost_dev *vdev, void *arg) -{ - struct rpc_add_vhost_scsi_ctrlr_lun *rpc = arg; - struct spdk_jsonrpc_request *request = rpc->request; - struct spdk_json_write_ctx *w; - int rc; - - if (vdev == NULL) { - rc = -ENODEV; - goto invalid; - } - - rc = spdk_vhost_scsi_dev_add_tgt(vdev, rpc->scsi_target_num, rpc->bdev_name); - if (rc < 0) { - goto invalid; - } - - free_rpc_add_vhost_scsi_ctrlr_lun(rpc); - - w = spdk_jsonrpc_begin_result(request); - if (w == NULL) { - return -1; - } - - spdk_json_write_int32(w, rc); - spdk_jsonrpc_end_result(request, w); - return 0; - -invalid: - free_rpc_add_vhost_scsi_ctrlr_lun(rpc); - spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, - spdk_strerror(-rc)); - return rc; -} - static void spdk_rpc_add_vhost_scsi_lun(struct spdk_jsonrpc_request *request, const struct spdk_json_val *params) { struct rpc_add_vhost_scsi_ctrlr_lun *req; + struct spdk_json_write_ctx *w; + struct spdk_vhost_dev *vdev; int rc; req = calloc(1, sizeof(*req)); @@ -172,7 +136,6 @@ spdk_rpc_add_vhost_scsi_lun(struct spdk_jsonrpc_request *request, goto invalid; } - req->request = request; if (spdk_json_decode_object(params, rpc_vhost_add_lun, SPDK_COUNTOF(rpc_vhost_add_lun), req)) { @@ -187,8 +150,29 @@ spdk_rpc_add_vhost_scsi_lun(struct spdk_jsonrpc_request *request, goto invalid; } - spdk_vhost_call_external_event(req->ctrlr, spdk_rpc_add_vhost_scsi_lun_cb, req); + spdk_vhost_lock(); + vdev = spdk_vhost_dev_find(req->ctrlr); + if (vdev == NULL) { + spdk_vhost_unlock(); + rc = -ENODEV; + goto invalid; + } + rc = spdk_vhost_scsi_dev_add_tgt(vdev, req->scsi_target_num, req->bdev_name); + spdk_vhost_unlock(); + if (rc < 0) { + goto invalid; + } + + free_rpc_add_vhost_scsi_ctrlr_lun(req); + + w = spdk_jsonrpc_begin_result(request); + if (w == NULL) { + return; + } + + spdk_json_write_int32(w, rc); + spdk_jsonrpc_end_result(request, w); return; invalid: @@ -238,37 +222,12 @@ spdk_rpc_remove_vhost_scsi_target_finish_cb(struct spdk_vhost_dev *vdev, void *a return 0; } -static int -spdk_rpc_remove_vhost_scsi_target_cb(struct spdk_vhost_dev *vdev, void *arg) -{ - struct rpc_remove_vhost_scsi_ctrlr_target *rpc = arg; - struct spdk_jsonrpc_request *request = rpc->request; - int rc; - - if (vdev == NULL) { - rc = -ENODEV; - goto invalid; - } - - rc = spdk_vhost_scsi_dev_remove_tgt(vdev, rpc->scsi_target_num, - spdk_rpc_remove_vhost_scsi_target_finish_cb, rpc); - if (rc < 0) { - goto invalid; - } - - return 0; - -invalid: - free_rpc_remove_vhost_scsi_ctrlr_target(rpc); - spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, spdk_strerror(-rc)); - return rc; -} - static void spdk_rpc_remove_vhost_scsi_target(struct spdk_jsonrpc_request *request, const struct spdk_json_val *params) { struct rpc_remove_vhost_scsi_ctrlr_target *req; + struct spdk_vhost_dev *vdev; int rc; req = calloc(1, sizeof(*req)); @@ -286,8 +245,20 @@ spdk_rpc_remove_vhost_scsi_target(struct spdk_jsonrpc_request *request, goto invalid; } - spdk_vhost_call_external_event(req->ctrlr, spdk_rpc_remove_vhost_scsi_target_cb, req); + spdk_vhost_lock(); + vdev = spdk_vhost_dev_find(req->ctrlr); + if (vdev == NULL) { + spdk_vhost_unlock(); + rc = -ENODEV; + goto invalid; + } + rc = spdk_vhost_scsi_dev_remove_tgt(vdev, req->scsi_target_num, + spdk_rpc_remove_vhost_scsi_target_finish_cb, req); + spdk_vhost_unlock(); + if (rc < 0) { + goto invalid; + } return; invalid: @@ -365,8 +336,6 @@ SPDK_RPC_REGISTER("construct_vhost_blk_controller", spdk_rpc_construct_vhost_blk struct rpc_remove_vhost_ctrlr { char *ctrlr; - - struct spdk_jsonrpc_request *request; }; static const struct spdk_json_object_decoder rpc_remove_vhost_ctrlr[] = { @@ -380,47 +349,13 @@ free_rpc_remove_vhost_ctrlr(struct rpc_remove_vhost_ctrlr *req) free(req); } -static int -spdk_rpc_remove_vhost_controller_cb(struct spdk_vhost_dev *vdev, void *arg) -{ - struct rpc_remove_vhost_ctrlr *ctx = arg; - struct spdk_jsonrpc_request *request = ctx->request; - struct spdk_json_write_ctx *w; - int rc; - - if (vdev == NULL) { - rc = -ENODEV; - goto invalid; - } - - rc = spdk_vhost_dev_remove(vdev); - if (rc < 0) { - goto invalid; - } - - free_rpc_remove_vhost_ctrlr(ctx); - - w = spdk_jsonrpc_begin_result(request); - if (w == NULL) { - return 0; - } - - spdk_json_write_bool(w, true); - spdk_jsonrpc_end_result(request, w); - return 0; - -invalid: - free_rpc_remove_vhost_ctrlr(ctx); - spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, - spdk_strerror(-rc)); - return -1; -} - static void spdk_rpc_remove_vhost_controller(struct spdk_jsonrpc_request *request, const struct spdk_json_val *params) { struct rpc_remove_vhost_ctrlr *req; + struct spdk_json_write_ctx *w; + struct spdk_vhost_dev *vdev; int rc; req = calloc(1, sizeof(*req)); @@ -429,7 +364,6 @@ spdk_rpc_remove_vhost_controller(struct spdk_jsonrpc_request *request, goto invalid; } - req->request = request; if (spdk_json_decode_object(params, rpc_remove_vhost_ctrlr, SPDK_COUNTOF(rpc_remove_vhost_ctrlr), req)) { SPDK_DEBUGLOG(SPDK_LOG_VHOST_RPC, "spdk_json_decode_object failed\n"); @@ -437,7 +371,30 @@ spdk_rpc_remove_vhost_controller(struct spdk_jsonrpc_request *request, goto invalid; } - spdk_vhost_call_external_event(req->ctrlr, spdk_rpc_remove_vhost_controller_cb, req); + spdk_vhost_lock(); + vdev = spdk_vhost_dev_find(req->ctrlr); + if (vdev == NULL) { + spdk_vhost_unlock(); + rc = -ENODEV; + goto invalid; + } + + rc = spdk_vhost_dev_remove(vdev); + spdk_vhost_unlock(); + if (rc < 0) { + goto invalid; + } + + free_rpc_remove_vhost_ctrlr(req); + + w = spdk_jsonrpc_begin_result(request); + if (w == NULL) { + return; + } + + spdk_json_write_bool(w, true); + spdk_jsonrpc_end_result(request, w); + return; invalid: @@ -452,8 +409,6 @@ SPDK_RPC_REGISTER("remove_vhost_controller", spdk_rpc_remove_vhost_controller, S struct rpc_get_vhost_ctrlrs { char *name; - struct spdk_json_write_ctx *w; - struct spdk_jsonrpc_request *request; }; static void @@ -478,98 +433,92 @@ _spdk_rpc_get_vhost_controller(struct spdk_json_write_ctx *w, struct spdk_vhost_ spdk_json_write_object_end(w); } -static int -spdk_rpc_get_vhost_controllers_cb(struct spdk_vhost_dev *vdev, void *arg) -{ - struct rpc_get_vhost_ctrlrs *ctx = arg; - - assert(ctx->name == NULL); - - if (vdev == NULL) { - spdk_json_write_array_end(ctx->w); - spdk_jsonrpc_end_result(ctx->request, ctx->w); - free(ctx); - return 0; - } - - _spdk_rpc_get_vhost_controller(ctx->w, vdev); - return 0; -} - -static int -spdk_rpc_get_vhost_controller_cb(struct spdk_vhost_dev *vdev, void *arg) -{ - struct rpc_get_vhost_ctrlrs *ctx = arg; - - assert(ctx->name != NULL); - - if (vdev == NULL) { - spdk_jsonrpc_send_error_response(ctx->request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, - spdk_strerror(ENODEV)); - goto free_name_ctx; - } - - ctx->w = spdk_jsonrpc_begin_result(ctx->request); - if (ctx->w == NULL) { - goto free_name_ctx; - } - - spdk_json_write_array_begin(ctx->w); - _spdk_rpc_get_vhost_controller(ctx->w, vdev); - spdk_json_write_array_end(ctx->w); - - spdk_jsonrpc_end_result(ctx->request, ctx->w); - -free_name_ctx: - free(ctx->name); - free(ctx); - return 0; -} - static const struct spdk_json_object_decoder rpc_get_vhost_ctrlrs_decoders[] = { {"name", offsetof(struct rpc_get_vhost_ctrlrs, name), spdk_json_decode_string, true}, }; +static void +free_rpc_get_vhost_ctrlrs(struct rpc_get_vhost_ctrlrs *req) +{ + free(req->name); + free(req); +} + static void spdk_rpc_get_vhost_controllers(struct spdk_jsonrpc_request *request, const struct spdk_json_val *params) { struct rpc_get_vhost_ctrlrs *ctx; struct spdk_json_write_ctx *w; + struct spdk_vhost_dev *vdev; + int rc; ctx = calloc(1, sizeof(*ctx)); if (ctx == NULL) { - spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, - spdk_strerror(ENOMEM)); - return; + rc = -ENOMEM; + goto invalid; } if (params && spdk_json_decode_object(params, rpc_get_vhost_ctrlrs_decoders, SPDK_COUNTOF(rpc_get_vhost_ctrlrs_decoders), ctx)) { SPDK_ERRLOG("spdk_json_decode_object failed\n"); - free(ctx); - spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, - "Invalid parameters"); + rc = -EINVAL; + goto invalid; + } + + spdk_vhost_lock(); + if (ctx->name != NULL) { + vdev = spdk_vhost_dev_find(ctx->name); + if (vdev == NULL) { + spdk_vhost_unlock(); + rc = -ENODEV; + goto invalid; + } + + free_rpc_get_vhost_ctrlrs(ctx); + + w = spdk_jsonrpc_begin_result(request); + if (w == NULL) { + spdk_vhost_unlock(); + return; + } + + spdk_json_write_array_begin(w); + + _spdk_rpc_get_vhost_controller(w, vdev); + spdk_vhost_unlock(); + + spdk_json_write_array_end(w); + spdk_jsonrpc_end_result(request, w); return; } - if (ctx->name) { - ctx->request = request; - spdk_vhost_call_external_event(ctx->name, spdk_rpc_get_vhost_controller_cb, ctx); - return; - } + free_rpc_get_vhost_ctrlrs(ctx); w = spdk_jsonrpc_begin_result(request); if (w == NULL) { - free(ctx); + spdk_vhost_unlock(); return; } - spdk_json_write_array_begin(w); - ctx->w = w; - ctx->request = request; - spdk_vhost_call_external_event_foreach(spdk_rpc_get_vhost_controllers_cb, ctx); + vdev = spdk_vhost_dev_next(NULL); + while (vdev != NULL) { + _spdk_rpc_get_vhost_controller(w, vdev); + vdev = spdk_vhost_dev_next(vdev); + } + spdk_vhost_unlock(); + + spdk_json_write_array_end(w); + spdk_jsonrpc_end_result(request, w); + return; + +invalid: + if (ctx) { + free_rpc_get_vhost_ctrlrs(ctx); + } + spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, + spdk_strerror(-rc)); } SPDK_RPC_REGISTER("get_vhost_controllers", spdk_rpc_get_vhost_controllers, SPDK_RPC_RUNTIME) @@ -578,7 +527,6 @@ struct rpc_vhost_ctrlr_coalescing { char *ctrlr; uint32_t delay_base_us; uint32_t iops_threshold; - struct spdk_jsonrpc_request *request; }; static const struct spdk_json_object_decoder rpc_set_vhost_ctrlr_coalescing[] = { @@ -598,44 +546,13 @@ free_rpc_set_vhost_controllers_event_coalescing(struct rpc_vhost_ctrlr_coalescin free(req); } -static int -spdk_rpc_set_vhost_controller_coalescing_cb(struct spdk_vhost_dev *vdev, void *arg) -{ - struct rpc_vhost_ctrlr_coalescing *req = arg; - struct spdk_json_write_ctx *w; - int rc; - - if (vdev == NULL) { - rc = -ENODEV; - goto invalid; - } - - rc = spdk_vhost_set_coalescing(vdev, req->delay_base_us, req->iops_threshold); - if (rc) { - goto invalid; - } - - w = spdk_jsonrpc_begin_result(req->request); - if (w != NULL) { - spdk_json_write_bool(w, true); - spdk_jsonrpc_end_result(req->request, w); - } - - free_rpc_set_vhost_controllers_event_coalescing(req); - return 0; - -invalid: - spdk_jsonrpc_send_error_response(req->request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, - spdk_strerror(-rc)); - free_rpc_set_vhost_controllers_event_coalescing(req); - return 0; -} - static void spdk_rpc_set_vhost_controller_coalescing(struct spdk_jsonrpc_request *request, const struct spdk_json_val *params) { struct rpc_vhost_ctrlr_coalescing *req; + struct spdk_json_write_ctx *w; + struct spdk_vhost_dev *vdev; int rc; req = calloc(1, sizeof(struct rpc_vhost_ctrlr_coalescing)); @@ -651,8 +568,28 @@ spdk_rpc_set_vhost_controller_coalescing(struct spdk_jsonrpc_request *request, goto invalid; } - req->request = request; - spdk_vhost_call_external_event(req->ctrlr, spdk_rpc_set_vhost_controller_coalescing_cb, req); + spdk_vhost_lock(); + vdev = spdk_vhost_dev_find(req->ctrlr); + if (vdev == NULL) { + spdk_vhost_unlock(); + rc = -ENODEV; + goto invalid; + } + + rc = spdk_vhost_set_coalescing(vdev, req->delay_base_us, req->iops_threshold); + spdk_vhost_unlock(); + if (rc) { + goto invalid; + } + + free_rpc_set_vhost_controllers_event_coalescing(req); + + w = spdk_jsonrpc_begin_result(request); + if (w != NULL) { + spdk_json_write_bool(w, true); + spdk_jsonrpc_end_result(request, w); + } + return; invalid: @@ -725,7 +662,6 @@ SPDK_RPC_REGISTER("construct_vhost_nvme_controller", spdk_rpc_construct_vhost_nv struct rpc_add_vhost_nvme_ctrlr_ns { char *ctrlr; char *bdev_name; - struct spdk_jsonrpc_request *request; }; static void @@ -741,46 +677,13 @@ static const struct spdk_json_object_decoder rpc_vhost_nvme_add_ns[] = { {"bdev_name", offsetof(struct rpc_add_vhost_nvme_ctrlr_ns, bdev_name), spdk_json_decode_string }, }; -static int -spdk_rpc_add_vhost_nvme_ns_cb(struct spdk_vhost_dev *vdev, void *arg) -{ - struct rpc_add_vhost_nvme_ctrlr_ns *rpc = arg; - struct spdk_jsonrpc_request *request = rpc->request; - struct spdk_json_write_ctx *w; - int rc; - - if (vdev == NULL) { - rc = -ENODEV; - goto invalid; - } - - rc = spdk_vhost_nvme_dev_add_ns(vdev, rpc->bdev_name); - if (rc < 0) { - goto invalid; - } - free_rpc_add_vhost_nvme_ctrlr_ns(rpc); - - w = spdk_jsonrpc_begin_result(request); - if (w == NULL) { - return -1; - } - - spdk_json_write_bool(w, true); - spdk_jsonrpc_end_result(request, w); - return 0; - -invalid: - free_rpc_add_vhost_nvme_ctrlr_ns(rpc); - spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, - spdk_strerror(-rc)); - return rc; -} - static void spdk_rpc_add_vhost_nvme_ns(struct spdk_jsonrpc_request *request, const struct spdk_json_val *params) { struct rpc_add_vhost_nvme_ctrlr_ns *req; + struct spdk_json_write_ctx *w; + struct spdk_vhost_dev *vdev; int rc; req = calloc(1, sizeof(*req)); @@ -789,7 +692,6 @@ spdk_rpc_add_vhost_nvme_ns(struct spdk_jsonrpc_request *request, goto invalid; } - req->request = request; if (spdk_json_decode_object(params, rpc_vhost_nvme_add_ns, SPDK_COUNTOF(rpc_vhost_nvme_add_ns), req)) { @@ -798,7 +700,28 @@ spdk_rpc_add_vhost_nvme_ns(struct spdk_jsonrpc_request *request, goto invalid; } - spdk_vhost_call_external_event(req->ctrlr, spdk_rpc_add_vhost_nvme_ns_cb, req); + spdk_vhost_lock(); + vdev = spdk_vhost_dev_find(req->ctrlr); + if (vdev == NULL) { + spdk_vhost_unlock(); + rc = -ENODEV; + goto invalid; + } + + rc = spdk_vhost_nvme_dev_add_ns(vdev, req->bdev_name); + spdk_vhost_unlock(); + if (rc < 0) { + goto invalid; + } + free_rpc_add_vhost_nvme_ctrlr_ns(req); + + w = spdk_jsonrpc_begin_result(request); + if (w == NULL) { + return; + } + + spdk_json_write_bool(w, true); + spdk_jsonrpc_end_result(request, w); return; invalid: