1488570ebSJim Harris /* SPDX-License-Identifier: BSD-3-Clause 2a6dbe372Spaul luse * Copyright (C) 2017 Intel Corporation. All rights reserved. 31dbf53eeSPiotr Pelplinski * All rights reserved. 41dbf53eeSPiotr Pelplinski */ 51dbf53eeSPiotr Pelplinski 6b961d9ccSBen Walker #include "spdk/stdinc.h" 70d7e2b64SPawel Wodkowski 84e8e97c8STomasz Zawadzki #include "spdk/log.h" 91dbf53eeSPiotr Pelplinski #include "spdk/rpc.h" 10b58a5d73SDaniel Verkamp #include "spdk/util.h" 114d43844fSSeth Howell #include "spdk/string.h" 12bb252345SDariusz Stojaczyk #include "spdk/env.h" 1362eb2315SDariusz Stojaczyk #include "spdk/scsi.h" 141dbf53eeSPiotr Pelplinski #include "spdk/vhost.h" 151b93872dSPawel Wodkowski #include "vhost_internal.h" 16ff88449dSPawel Niedzwiecki #include "spdk/bdev.h" 171dbf53eeSPiotr Pelplinski 181dbf53eeSPiotr Pelplinski struct rpc_vhost_scsi_ctrlr { 191dbf53eeSPiotr Pelplinski char *ctrlr; 201dbf53eeSPiotr Pelplinski char *cpumask; 21dc93bd85SHaoqian He bool delay; 221dbf53eeSPiotr Pelplinski }; 231dbf53eeSPiotr Pelplinski 2496e5267bSPawel Wodkowski static void 2596e5267bSPawel Wodkowski free_rpc_vhost_scsi_ctrlr(struct rpc_vhost_scsi_ctrlr *req) 2696e5267bSPawel Wodkowski { 2796e5267bSPawel Wodkowski free(req->ctrlr); 2896e5267bSPawel Wodkowski free(req->cpumask); 2996e5267bSPawel Wodkowski } 3096e5267bSPawel Wodkowski 31c7e05d83SPawel Kaminski static const struct spdk_json_object_decoder rpc_vhost_create_scsi_ctrlr[] = { 321dbf53eeSPiotr Pelplinski {"ctrlr", offsetof(struct rpc_vhost_scsi_ctrlr, ctrlr), spdk_json_decode_string }, 331dbf53eeSPiotr Pelplinski {"cpumask", offsetof(struct rpc_vhost_scsi_ctrlr, cpumask), spdk_json_decode_string, true}, 34dc93bd85SHaoqian He {"delay", offsetof(struct rpc_vhost_scsi_ctrlr, delay), spdk_json_decode_bool, true}, 351dbf53eeSPiotr Pelplinski }; 361dbf53eeSPiotr Pelplinski 371dbf53eeSPiotr Pelplinski static void 38dbaa2c79SSeth Howell rpc_vhost_create_scsi_controller(struct spdk_jsonrpc_request *request, 392bdec64fSDaniel Verkamp const struct spdk_json_val *params) 401dbf53eeSPiotr Pelplinski { 411dbf53eeSPiotr Pelplinski struct rpc_vhost_scsi_ctrlr req = {0}; 421dbf53eeSPiotr Pelplinski int rc; 431dbf53eeSPiotr Pelplinski 44c7e05d83SPawel Kaminski if (spdk_json_decode_object(params, rpc_vhost_create_scsi_ctrlr, 45c7e05d83SPawel Kaminski SPDK_COUNTOF(rpc_vhost_create_scsi_ctrlr), 461dbf53eeSPiotr Pelplinski &req)) { 472172c432STomasz Zawadzki SPDK_DEBUGLOG(vhost_rpc, "spdk_json_decode_object failed\n"); 481dbf53eeSPiotr Pelplinski rc = -EINVAL; 491dbf53eeSPiotr Pelplinski goto invalid; 501dbf53eeSPiotr Pelplinski } 511dbf53eeSPiotr Pelplinski 52dc93bd85SHaoqian He if (req.delay) { 53dc93bd85SHaoqian He rc = spdk_vhost_scsi_dev_construct_no_start(req.ctrlr, req.cpumask); 54dc93bd85SHaoqian He } else { 555aaffa84SDariusz Stojaczyk rc = spdk_vhost_scsi_dev_construct(req.ctrlr, req.cpumask); 56dc93bd85SHaoqian He } 571dbf53eeSPiotr Pelplinski if (rc < 0) { 581dbf53eeSPiotr Pelplinski goto invalid; 591dbf53eeSPiotr Pelplinski } 601dbf53eeSPiotr Pelplinski 6196e5267bSPawel Wodkowski free_rpc_vhost_scsi_ctrlr(&req); 6296e5267bSPawel Wodkowski 63d73077b8Syidong0635 spdk_jsonrpc_send_bool_response(request, true); 642bdec64fSDaniel Verkamp return; 652bdec64fSDaniel Verkamp 661dbf53eeSPiotr Pelplinski invalid: 6796e5267bSPawel Wodkowski free_rpc_vhost_scsi_ctrlr(&req); 68891c12a6SPawel Wodkowski spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, 69891c12a6SPawel Wodkowski spdk_strerror(-rc)); 701dbf53eeSPiotr Pelplinski } 71dbaa2c79SSeth Howell SPDK_RPC_REGISTER("vhost_create_scsi_controller", rpc_vhost_create_scsi_controller, 72e008db08SShuhei Matsumoto SPDK_RPC_RUNTIME) 731dbf53eeSPiotr Pelplinski 74dc93bd85SHaoqian He struct rpc_start_vhost_scsi_ctrlr { 75dc93bd85SHaoqian He char *ctrlr; 76dc93bd85SHaoqian He }; 77dc93bd85SHaoqian He 78dc93bd85SHaoqian He static void 79dc93bd85SHaoqian He free_rpc_start_vhost_scsi_ctrlr(struct rpc_start_vhost_scsi_ctrlr *req) 80dc93bd85SHaoqian He { 81dc93bd85SHaoqian He free(req->ctrlr); 82dc93bd85SHaoqian He } 83dc93bd85SHaoqian He 84dc93bd85SHaoqian He static const struct spdk_json_object_decoder rpc_start_vhost_scsi_ctrlr_decoder[] = { 85dc93bd85SHaoqian He {"ctrlr", offsetof(struct rpc_start_vhost_scsi_ctrlr, ctrlr), spdk_json_decode_string }, 86dc93bd85SHaoqian He }; 87dc93bd85SHaoqian He 88dc93bd85SHaoqian He static void 89dc93bd85SHaoqian He rpc_vhost_start_scsi_controller(struct spdk_jsonrpc_request *request, 90dc93bd85SHaoqian He const struct spdk_json_val *params) 91dc93bd85SHaoqian He { 92dc93bd85SHaoqian He struct rpc_start_vhost_scsi_ctrlr req = {0}; 93dc93bd85SHaoqian He int rc; 94dc93bd85SHaoqian He 95dc93bd85SHaoqian He if (spdk_json_decode_object(params, rpc_start_vhost_scsi_ctrlr_decoder, 96dc93bd85SHaoqian He SPDK_COUNTOF(rpc_start_vhost_scsi_ctrlr_decoder), 97dc93bd85SHaoqian He &req)) { 98dc93bd85SHaoqian He SPDK_DEBUGLOG(vhost_rpc, "spdk_json_decode_object failed\n"); 99dc93bd85SHaoqian He rc = -EINVAL; 100dc93bd85SHaoqian He goto invalid; 101dc93bd85SHaoqian He } 102dc93bd85SHaoqian He 103dc93bd85SHaoqian He rc = vhost_scsi_controller_start(req.ctrlr); 104dc93bd85SHaoqian He if (rc < 0) { 105dc93bd85SHaoqian He goto invalid; 106dc93bd85SHaoqian He } 107dc93bd85SHaoqian He 108dc93bd85SHaoqian He free_rpc_start_vhost_scsi_ctrlr(&req); 109dc93bd85SHaoqian He 110dc93bd85SHaoqian He spdk_jsonrpc_send_bool_response(request, true); 111dc93bd85SHaoqian He return; 112dc93bd85SHaoqian He 113dc93bd85SHaoqian He invalid: 114dc93bd85SHaoqian He free_rpc_start_vhost_scsi_ctrlr(&req); 115dc93bd85SHaoqian He spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, 116dc93bd85SHaoqian He spdk_strerror(-rc)); 117dc93bd85SHaoqian He } 118dc93bd85SHaoqian He SPDK_RPC_REGISTER("vhost_start_scsi_controller", rpc_vhost_start_scsi_controller, 119dc93bd85SHaoqian He SPDK_RPC_RUNTIME) 120dc93bd85SHaoqian He 121d4245df9SPawel Kaminski struct rpc_vhost_scsi_ctrlr_add_target { 1221dbf53eeSPiotr Pelplinski char *ctrlr; 12348834f0dSPawel Wodkowski int32_t scsi_target_num; 124583e9699SShuhei Matsumoto char *bdev_name; 1251dbf53eeSPiotr Pelplinski }; 1261dbf53eeSPiotr Pelplinski 12796e5267bSPawel Wodkowski static void 128d4245df9SPawel Kaminski free_rpc_vhost_scsi_ctrlr_add_target(struct rpc_vhost_scsi_ctrlr_add_target *req) 12996e5267bSPawel Wodkowski { 13096e5267bSPawel Wodkowski free(req->ctrlr); 131583e9699SShuhei Matsumoto free(req->bdev_name); 13296e5267bSPawel Wodkowski } 13396e5267bSPawel Wodkowski 134d4245df9SPawel Kaminski static const struct spdk_json_object_decoder rpc_vhost_scsi_ctrlr_add_target[] = { 135d4245df9SPawel Kaminski {"ctrlr", offsetof(struct rpc_vhost_scsi_ctrlr_add_target, ctrlr), spdk_json_decode_string }, 136d4245df9SPawel Kaminski {"scsi_target_num", offsetof(struct rpc_vhost_scsi_ctrlr_add_target, scsi_target_num), spdk_json_decode_int32}, 137d4245df9SPawel Kaminski {"bdev_name", offsetof(struct rpc_vhost_scsi_ctrlr_add_target, bdev_name), spdk_json_decode_string }, 1381dbf53eeSPiotr Pelplinski }; 1391dbf53eeSPiotr Pelplinski 1401dbf53eeSPiotr Pelplinski static void 141dbaa2c79SSeth Howell rpc_vhost_scsi_controller_add_target(struct spdk_jsonrpc_request *request, 1422bdec64fSDaniel Verkamp const struct spdk_json_val *params) 1431dbf53eeSPiotr Pelplinski { 144d4245df9SPawel Kaminski struct rpc_vhost_scsi_ctrlr_add_target req = {0}; 145dd4f161bSDarek Stojaczyk struct spdk_json_write_ctx *w; 146dd4f161bSDarek Stojaczyk struct spdk_vhost_dev *vdev; 147bb252345SDariusz Stojaczyk int rc; 1481dbf53eeSPiotr Pelplinski 149d4245df9SPawel Kaminski if (spdk_json_decode_object(params, rpc_vhost_scsi_ctrlr_add_target, 150d4245df9SPawel Kaminski SPDK_COUNTOF(rpc_vhost_scsi_ctrlr_add_target), 151244a619fSDarek Stojaczyk &req)) { 1522172c432STomasz Zawadzki SPDK_DEBUGLOG(vhost_rpc, "spdk_json_decode_object failed\n"); 1531dbf53eeSPiotr Pelplinski rc = -EINVAL; 1541dbf53eeSPiotr Pelplinski goto invalid; 1551dbf53eeSPiotr Pelplinski } 1561dbf53eeSPiotr Pelplinski 157dd4f161bSDarek Stojaczyk spdk_vhost_lock(); 158244a619fSDarek Stojaczyk vdev = spdk_vhost_dev_find(req.ctrlr); 159dd4f161bSDarek Stojaczyk if (vdev == NULL) { 160dd4f161bSDarek Stojaczyk spdk_vhost_unlock(); 161dd4f161bSDarek Stojaczyk rc = -ENODEV; 162dd4f161bSDarek Stojaczyk goto invalid; 163dd4f161bSDarek Stojaczyk } 1641dbf53eeSPiotr Pelplinski 165244a619fSDarek Stojaczyk rc = spdk_vhost_scsi_dev_add_tgt(vdev, req.scsi_target_num, req.bdev_name); 166dd4f161bSDarek Stojaczyk spdk_vhost_unlock(); 167dd4f161bSDarek Stojaczyk if (rc < 0) { 168dd4f161bSDarek Stojaczyk goto invalid; 169dd4f161bSDarek Stojaczyk } 170dd4f161bSDarek Stojaczyk 171d4245df9SPawel Kaminski free_rpc_vhost_scsi_ctrlr_add_target(&req); 172dd4f161bSDarek Stojaczyk 173dd4f161bSDarek Stojaczyk w = spdk_jsonrpc_begin_result(request); 174dd4f161bSDarek Stojaczyk spdk_json_write_int32(w, rc); 175dd4f161bSDarek Stojaczyk spdk_jsonrpc_end_result(request, w); 1761dbf53eeSPiotr Pelplinski return; 1772bdec64fSDaniel Verkamp 1781dbf53eeSPiotr Pelplinski invalid: 179d4245df9SPawel Kaminski free_rpc_vhost_scsi_ctrlr_add_target(&req); 180891c12a6SPawel Wodkowski spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, 181891c12a6SPawel Wodkowski spdk_strerror(-rc)); 1821dbf53eeSPiotr Pelplinski } 183dbaa2c79SSeth Howell SPDK_RPC_REGISTER("vhost_scsi_controller_add_target", rpc_vhost_scsi_controller_add_target, 184d4245df9SPawel Kaminski SPDK_RPC_RUNTIME) 185679e2831SDariusz Stojaczyk 1860709cc48SSebastian Basierski struct rpc_remove_vhost_scsi_ctrlr_target { 187679e2831SDariusz Stojaczyk char *ctrlr; 1880709cc48SSebastian Basierski uint32_t scsi_target_num; 189679e2831SDariusz Stojaczyk }; 190679e2831SDariusz Stojaczyk 191679e2831SDariusz Stojaczyk static void 1920709cc48SSebastian Basierski free_rpc_remove_vhost_scsi_ctrlr_target(struct rpc_remove_vhost_scsi_ctrlr_target *req) 193679e2831SDariusz Stojaczyk { 194679e2831SDariusz Stojaczyk free(req->ctrlr); 195679e2831SDariusz Stojaczyk } 196679e2831SDariusz Stojaczyk 1970709cc48SSebastian Basierski static const struct spdk_json_object_decoder rpc_vhost_remove_target[] = { 1980709cc48SSebastian Basierski {"ctrlr", offsetof(struct rpc_remove_vhost_scsi_ctrlr_target, ctrlr), spdk_json_decode_string }, 1990709cc48SSebastian Basierski {"scsi_target_num", offsetof(struct rpc_remove_vhost_scsi_ctrlr_target, scsi_target_num), spdk_json_decode_uint32}, 200679e2831SDariusz Stojaczyk }; 201679e2831SDariusz Stojaczyk 202bb252345SDariusz Stojaczyk static int 203dbaa2c79SSeth Howell rpc_vhost_scsi_controller_remove_target_finish_cb(struct spdk_vhost_dev *vdev, void *arg) 204bb252345SDariusz Stojaczyk { 205244a619fSDarek Stojaczyk struct spdk_jsonrpc_request *request = arg; 206bb252345SDariusz Stojaczyk 207d73077b8Syidong0635 spdk_jsonrpc_send_bool_response(request, true); 208bb252345SDariusz Stojaczyk return 0; 209ad9a842cSDariusz Stojaczyk } 210ad9a842cSDariusz Stojaczyk 211679e2831SDariusz Stojaczyk static void 212dbaa2c79SSeth Howell rpc_vhost_scsi_controller_remove_target(struct spdk_jsonrpc_request *request, 2132bdec64fSDaniel Verkamp const struct spdk_json_val *params) 214679e2831SDariusz Stojaczyk { 215244a619fSDarek Stojaczyk struct rpc_remove_vhost_scsi_ctrlr_target req = {0}; 216dd4f161bSDarek Stojaczyk struct spdk_vhost_dev *vdev; 217679e2831SDariusz Stojaczyk int rc; 218679e2831SDariusz Stojaczyk 2190709cc48SSebastian Basierski if (spdk_json_decode_object(params, rpc_vhost_remove_target, 2200709cc48SSebastian Basierski SPDK_COUNTOF(rpc_vhost_remove_target), 221244a619fSDarek Stojaczyk &req)) { 2222172c432STomasz Zawadzki SPDK_DEBUGLOG(vhost_rpc, "spdk_json_decode_object failed\n"); 223679e2831SDariusz Stojaczyk rc = -EINVAL; 224679e2831SDariusz Stojaczyk goto invalid; 225679e2831SDariusz Stojaczyk } 226679e2831SDariusz Stojaczyk 227dd4f161bSDarek Stojaczyk spdk_vhost_lock(); 228244a619fSDarek Stojaczyk vdev = spdk_vhost_dev_find(req.ctrlr); 229dd4f161bSDarek Stojaczyk if (vdev == NULL) { 230dd4f161bSDarek Stojaczyk spdk_vhost_unlock(); 231dd4f161bSDarek Stojaczyk rc = -ENODEV; 232dd4f161bSDarek Stojaczyk goto invalid; 233dd4f161bSDarek Stojaczyk } 234679e2831SDariusz Stojaczyk 235244a619fSDarek Stojaczyk rc = spdk_vhost_scsi_dev_remove_tgt(vdev, req.scsi_target_num, 236dbaa2c79SSeth Howell rpc_vhost_scsi_controller_remove_target_finish_cb, 237244a619fSDarek Stojaczyk request); 238dd4f161bSDarek Stojaczyk spdk_vhost_unlock(); 239dd4f161bSDarek Stojaczyk if (rc < 0) { 240dd4f161bSDarek Stojaczyk goto invalid; 241dd4f161bSDarek Stojaczyk } 242244a619fSDarek Stojaczyk 243244a619fSDarek Stojaczyk free_rpc_remove_vhost_scsi_ctrlr_target(&req); 244679e2831SDariusz Stojaczyk return; 2452bdec64fSDaniel Verkamp 246679e2831SDariusz Stojaczyk invalid: 247244a619fSDarek Stojaczyk free_rpc_remove_vhost_scsi_ctrlr_target(&req); 248891c12a6SPawel Wodkowski spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, 249891c12a6SPawel Wodkowski spdk_strerror(-rc)); 250679e2831SDariusz Stojaczyk } 251bb252345SDariusz Stojaczyk 25236e04eb4SPawel Kaminski SPDK_RPC_REGISTER("vhost_scsi_controller_remove_target", 253dbaa2c79SSeth Howell rpc_vhost_scsi_controller_remove_target, SPDK_RPC_RUNTIME) 254ff88449dSPawel Niedzwiecki 255ff88449dSPawel Niedzwiecki struct rpc_vhost_blk_ctrlr { 256ff88449dSPawel Niedzwiecki char *ctrlr; 257ff88449dSPawel Niedzwiecki char *dev_name; 258ff88449dSPawel Niedzwiecki char *cpumask; 259b727e804STomasz Zawadzki char *transport; 260ff88449dSPawel Niedzwiecki }; 261ff88449dSPawel Niedzwiecki 262ff88449dSPawel Niedzwiecki static const struct spdk_json_object_decoder rpc_construct_vhost_blk_ctrlr[] = { 263ff88449dSPawel Niedzwiecki {"ctrlr", offsetof(struct rpc_vhost_blk_ctrlr, ctrlr), spdk_json_decode_string }, 264ff88449dSPawel Niedzwiecki {"dev_name", offsetof(struct rpc_vhost_blk_ctrlr, dev_name), spdk_json_decode_string }, 265ff88449dSPawel Niedzwiecki {"cpumask", offsetof(struct rpc_vhost_blk_ctrlr, cpumask), spdk_json_decode_string, true}, 266b727e804STomasz Zawadzki {"transport", offsetof(struct rpc_vhost_blk_ctrlr, transport), spdk_json_decode_string, true}, 267ff88449dSPawel Niedzwiecki }; 268ff88449dSPawel Niedzwiecki 269ff88449dSPawel Niedzwiecki static void 270ff88449dSPawel Niedzwiecki free_rpc_vhost_blk_ctrlr(struct rpc_vhost_blk_ctrlr *req) 271ff88449dSPawel Niedzwiecki { 272ff88449dSPawel Niedzwiecki free(req->ctrlr); 273ff88449dSPawel Niedzwiecki free(req->dev_name); 274ff88449dSPawel Niedzwiecki free(req->cpumask); 275b727e804STomasz Zawadzki free(req->transport); 276ff88449dSPawel Niedzwiecki } 277ff88449dSPawel Niedzwiecki 278ff88449dSPawel Niedzwiecki static void 279dbaa2c79SSeth Howell rpc_vhost_create_blk_controller(struct spdk_jsonrpc_request *request, 2802bdec64fSDaniel Verkamp const struct spdk_json_val *params) 281ff88449dSPawel Niedzwiecki { 282ff88449dSPawel Niedzwiecki struct rpc_vhost_blk_ctrlr req = {0}; 283ff88449dSPawel Niedzwiecki int rc; 284ff88449dSPawel Niedzwiecki 285fd53562aSsberbz if (spdk_json_decode_object_relaxed(params, rpc_construct_vhost_blk_ctrlr, 286ff88449dSPawel Niedzwiecki SPDK_COUNTOF(rpc_construct_vhost_blk_ctrlr), 287ff88449dSPawel Niedzwiecki &req)) { 2882172c432STomasz Zawadzki SPDK_DEBUGLOG(vhost_rpc, "spdk_json_decode_object failed\n"); 289ff88449dSPawel Niedzwiecki rc = -EINVAL; 290ff88449dSPawel Niedzwiecki goto invalid; 291ff88449dSPawel Niedzwiecki } 292ff88449dSPawel Niedzwiecki 293b727e804STomasz Zawadzki rc = spdk_vhost_blk_construct(req.ctrlr, req.cpumask, req.dev_name, req.transport, params); 294ff88449dSPawel Niedzwiecki if (rc < 0) { 295ff88449dSPawel Niedzwiecki goto invalid; 296ff88449dSPawel Niedzwiecki } 297ff88449dSPawel Niedzwiecki 298ff88449dSPawel Niedzwiecki free_rpc_vhost_blk_ctrlr(&req); 299ff88449dSPawel Niedzwiecki 300d73077b8Syidong0635 spdk_jsonrpc_send_bool_response(request, true); 301ff88449dSPawel Niedzwiecki return; 3022bdec64fSDaniel Verkamp 303ff88449dSPawel Niedzwiecki invalid: 304ff88449dSPawel Niedzwiecki free_rpc_vhost_blk_ctrlr(&req); 305891c12a6SPawel Wodkowski spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, 306891c12a6SPawel Wodkowski spdk_strerror(-rc)); 307ff88449dSPawel Niedzwiecki 308ff88449dSPawel Niedzwiecki } 309dbaa2c79SSeth Howell SPDK_RPC_REGISTER("vhost_create_blk_controller", rpc_vhost_create_blk_controller, 310e008db08SShuhei Matsumoto SPDK_RPC_RUNTIME) 311ff88449dSPawel Niedzwiecki 312edb18971SPawel Kaminski struct rpc_delete_vhost_ctrlr { 313ff88449dSPawel Niedzwiecki char *ctrlr; 314ff88449dSPawel Niedzwiecki }; 315ff88449dSPawel Niedzwiecki 316edb18971SPawel Kaminski static const struct spdk_json_object_decoder rpc_delete_vhost_ctrlr_decoder[] = { 317edb18971SPawel Kaminski {"ctrlr", offsetof(struct rpc_delete_vhost_ctrlr, ctrlr), spdk_json_decode_string }, 318ff88449dSPawel Niedzwiecki }; 319ff88449dSPawel Niedzwiecki 320ff88449dSPawel Niedzwiecki static void 321edb18971SPawel Kaminski free_rpc_delete_vhost_ctrlr(struct rpc_delete_vhost_ctrlr *req) 322ff88449dSPawel Niedzwiecki { 323ff88449dSPawel Niedzwiecki free(req->ctrlr); 324ff88449dSPawel Niedzwiecki } 325ff88449dSPawel Niedzwiecki 326*840a5d2eSxupeng-mingtu struct vhost_delete_ctrlr_context { 327*840a5d2eSxupeng-mingtu struct spdk_jsonrpc_request *request; 328*840a5d2eSxupeng-mingtu const struct spdk_json_val *params; 329*840a5d2eSxupeng-mingtu }; 330*840a5d2eSxupeng-mingtu 331*840a5d2eSxupeng-mingtu static void _rpc_vhost_delete_controller(void *arg); 332*840a5d2eSxupeng-mingtu 333bb252345SDariusz Stojaczyk static void 334dbaa2c79SSeth Howell rpc_vhost_delete_controller(struct spdk_jsonrpc_request *request, 335bb252345SDariusz Stojaczyk const struct spdk_json_val *params) 336bb252345SDariusz Stojaczyk { 337edb18971SPawel Kaminski struct rpc_delete_vhost_ctrlr req = {0}; 338dd4f161bSDarek Stojaczyk struct spdk_vhost_dev *vdev; 339bb252345SDariusz Stojaczyk int rc; 340bb252345SDariusz Stojaczyk 341edb18971SPawel Kaminski if (spdk_json_decode_object(params, rpc_delete_vhost_ctrlr_decoder, 342edb18971SPawel Kaminski SPDK_COUNTOF(rpc_delete_vhost_ctrlr_decoder), &req)) { 3432172c432STomasz Zawadzki SPDK_DEBUGLOG(vhost_rpc, "spdk_json_decode_object failed\n"); 344bb252345SDariusz Stojaczyk rc = -EINVAL; 345bb252345SDariusz Stojaczyk goto invalid; 346bb252345SDariusz Stojaczyk } 347bb252345SDariusz Stojaczyk 348dd4f161bSDarek Stojaczyk spdk_vhost_lock(); 349244a619fSDarek Stojaczyk vdev = spdk_vhost_dev_find(req.ctrlr); 350dd4f161bSDarek Stojaczyk if (vdev == NULL) { 351dd4f161bSDarek Stojaczyk spdk_vhost_unlock(); 352dd4f161bSDarek Stojaczyk rc = -ENODEV; 353dd4f161bSDarek Stojaczyk goto invalid; 354dd4f161bSDarek Stojaczyk } 355376c25edSChangpeng Liu spdk_vhost_unlock(); 356dd4f161bSDarek Stojaczyk 357dd4f161bSDarek Stojaczyk rc = spdk_vhost_dev_remove(vdev); 358dd4f161bSDarek Stojaczyk if (rc < 0) { 359*840a5d2eSxupeng-mingtu if (rc == -EBUSY) { 360*840a5d2eSxupeng-mingtu struct vhost_delete_ctrlr_context *ctx; 361*840a5d2eSxupeng-mingtu 362*840a5d2eSxupeng-mingtu ctx = calloc(1, sizeof(*ctx)); 363*840a5d2eSxupeng-mingtu if (ctx == NULL) { 364*840a5d2eSxupeng-mingtu SPDK_ERRLOG("Failed to allocate memory for vhost_delete_ctrlr context\n"); 365*840a5d2eSxupeng-mingtu rc = -ENOMEM; 366*840a5d2eSxupeng-mingtu goto invalid; 367*840a5d2eSxupeng-mingtu } 368*840a5d2eSxupeng-mingtu ctx->request = request; 369*840a5d2eSxupeng-mingtu ctx->params = params; 370*840a5d2eSxupeng-mingtu spdk_thread_send_msg(spdk_get_thread(), _rpc_vhost_delete_controller, ctx); 371*840a5d2eSxupeng-mingtu free_rpc_delete_vhost_ctrlr(&req); 372*840a5d2eSxupeng-mingtu return; 373*840a5d2eSxupeng-mingtu } 374dd4f161bSDarek Stojaczyk goto invalid; 375dd4f161bSDarek Stojaczyk } 376dd4f161bSDarek Stojaczyk 377edb18971SPawel Kaminski free_rpc_delete_vhost_ctrlr(&req); 378dd4f161bSDarek Stojaczyk 379d73077b8Syidong0635 spdk_jsonrpc_send_bool_response(request, true); 380ff88449dSPawel Niedzwiecki return; 3812bdec64fSDaniel Verkamp 382ff88449dSPawel Niedzwiecki invalid: 383edb18971SPawel Kaminski free_rpc_delete_vhost_ctrlr(&req); 384891c12a6SPawel Wodkowski spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, 385891c12a6SPawel Wodkowski spdk_strerror(-rc)); 386ff88449dSPawel Niedzwiecki 387ff88449dSPawel Niedzwiecki } 388dbaa2c79SSeth Howell SPDK_RPC_REGISTER("vhost_delete_controller", rpc_vhost_delete_controller, SPDK_RPC_RUNTIME) 389ff88449dSPawel Niedzwiecki 390*840a5d2eSxupeng-mingtu static void _rpc_vhost_delete_controller(void *arg) 391*840a5d2eSxupeng-mingtu { 392*840a5d2eSxupeng-mingtu struct vhost_delete_ctrlr_context *ctx = arg; 393*840a5d2eSxupeng-mingtu 394*840a5d2eSxupeng-mingtu rpc_vhost_delete_controller(ctx->request, ctx->params); 395*840a5d2eSxupeng-mingtu free(ctx); 396*840a5d2eSxupeng-mingtu } 397*840a5d2eSxupeng-mingtu 3988323be7dSDariusz Stojaczyk struct rpc_get_vhost_ctrlrs { 39974a28c19Swuzhouhui char *name; 4008323be7dSDariusz Stojaczyk }; 4018323be7dSDariusz Stojaczyk 40274a28c19Swuzhouhui static void 403dbaa2c79SSeth Howell _rpc_get_vhost_controller(struct spdk_json_write_ctx *w, struct spdk_vhost_dev *vdev) 40474a28c19Swuzhouhui { 40574a28c19Swuzhouhui uint32_t delay_base_us, iops_threshold; 40674a28c19Swuzhouhui 40774a28c19Swuzhouhui spdk_vhost_get_coalescing(vdev, &delay_base_us, &iops_threshold); 40874a28c19Swuzhouhui 40974a28c19Swuzhouhui spdk_json_write_object_begin(w); 41074a28c19Swuzhouhui 41174a28c19Swuzhouhui spdk_json_write_named_string(w, "ctrlr", spdk_vhost_dev_get_name(vdev)); 412baf3e12cSShuhei Matsumoto spdk_json_write_named_string_fmt(w, "cpumask", "0x%s", 413baf3e12cSShuhei Matsumoto spdk_cpuset_fmt(spdk_thread_get_cpumask(vdev->thread))); 41474a28c19Swuzhouhui spdk_json_write_named_uint32(w, "delay_base_us", delay_base_us); 41574a28c19Swuzhouhui spdk_json_write_named_uint32(w, "iops_threshold", iops_threshold); 41674a28c19Swuzhouhui spdk_json_write_named_string(w, "socket", vdev->path); 417216991edSzhipeng Lu spdk_json_write_named_array_begin(w, "sessions"); 418216991edSzhipeng Lu vhost_session_info_json(vdev, w); 419216991edSzhipeng Lu spdk_json_write_array_end(w); 42074a28c19Swuzhouhui 42174a28c19Swuzhouhui spdk_json_write_named_object_begin(w, "backend_specific"); 4220cf5d516SDarek Stojaczyk vhost_dump_info_json(vdev, w); 42374a28c19Swuzhouhui spdk_json_write_object_end(w); 42474a28c19Swuzhouhui 42574a28c19Swuzhouhui spdk_json_write_object_end(w); 42674a28c19Swuzhouhui } 42774a28c19Swuzhouhui 42874a28c19Swuzhouhui static const struct spdk_json_object_decoder rpc_get_vhost_ctrlrs_decoders[] = { 42974a28c19Swuzhouhui {"name", offsetof(struct rpc_get_vhost_ctrlrs, name), spdk_json_decode_string, true}, 43074a28c19Swuzhouhui }; 4318323be7dSDariusz Stojaczyk 432ff88449dSPawel Niedzwiecki static void 433dd4f161bSDarek Stojaczyk free_rpc_get_vhost_ctrlrs(struct rpc_get_vhost_ctrlrs *req) 434dd4f161bSDarek Stojaczyk { 435dd4f161bSDarek Stojaczyk free(req->name); 436dd4f161bSDarek Stojaczyk } 437dd4f161bSDarek Stojaczyk 438dd4f161bSDarek Stojaczyk static void 439dbaa2c79SSeth Howell rpc_vhost_get_controllers(struct spdk_jsonrpc_request *request, 4402bdec64fSDaniel Verkamp const struct spdk_json_val *params) 441ff88449dSPawel Niedzwiecki { 442244a619fSDarek Stojaczyk struct rpc_get_vhost_ctrlrs req = {0}; 443ff88449dSPawel Niedzwiecki struct spdk_json_write_ctx *w; 444dd4f161bSDarek Stojaczyk struct spdk_vhost_dev *vdev; 445dd4f161bSDarek Stojaczyk int rc; 446ff88449dSPawel Niedzwiecki 44774a28c19Swuzhouhui if (params && spdk_json_decode_object(params, rpc_get_vhost_ctrlrs_decoders, 448244a619fSDarek Stojaczyk SPDK_COUNTOF(rpc_get_vhost_ctrlrs_decoders), &req)) { 44974a28c19Swuzhouhui SPDK_ERRLOG("spdk_json_decode_object failed\n"); 450dd4f161bSDarek Stojaczyk rc = -EINVAL; 451dd4f161bSDarek Stojaczyk goto invalid; 45274a28c19Swuzhouhui } 45374a28c19Swuzhouhui 454dd4f161bSDarek Stojaczyk spdk_vhost_lock(); 455244a619fSDarek Stojaczyk if (req.name != NULL) { 456244a619fSDarek Stojaczyk vdev = spdk_vhost_dev_find(req.name); 457dd4f161bSDarek Stojaczyk if (vdev == NULL) { 458dd4f161bSDarek Stojaczyk spdk_vhost_unlock(); 459dd4f161bSDarek Stojaczyk rc = -ENODEV; 460dd4f161bSDarek Stojaczyk goto invalid; 46174a28c19Swuzhouhui } 46274a28c19Swuzhouhui 463244a619fSDarek Stojaczyk free_rpc_get_vhost_ctrlrs(&req); 464dd4f161bSDarek Stojaczyk 46533aa9948Swuzhouhui w = spdk_jsonrpc_begin_result(request); 46633aa9948Swuzhouhui spdk_json_write_array_begin(w); 46733aa9948Swuzhouhui 468dbaa2c79SSeth Howell _rpc_get_vhost_controller(w, vdev); 469dd4f161bSDarek Stojaczyk spdk_vhost_unlock(); 470dd4f161bSDarek Stojaczyk 471dd4f161bSDarek Stojaczyk spdk_json_write_array_end(w); 472dd4f161bSDarek Stojaczyk spdk_jsonrpc_end_result(request, w); 473dd4f161bSDarek Stojaczyk return; 474dd4f161bSDarek Stojaczyk } 475dd4f161bSDarek Stojaczyk 476244a619fSDarek Stojaczyk free_rpc_get_vhost_ctrlrs(&req); 477dd4f161bSDarek Stojaczyk 478dd4f161bSDarek Stojaczyk w = spdk_jsonrpc_begin_result(request); 479dd4f161bSDarek Stojaczyk spdk_json_write_array_begin(w); 480dd4f161bSDarek Stojaczyk 481dd4f161bSDarek Stojaczyk vdev = spdk_vhost_dev_next(NULL); 482dd4f161bSDarek Stojaczyk while (vdev != NULL) { 483dbaa2c79SSeth Howell _rpc_get_vhost_controller(w, vdev); 484dd4f161bSDarek Stojaczyk vdev = spdk_vhost_dev_next(vdev); 485dd4f161bSDarek Stojaczyk } 486dd4f161bSDarek Stojaczyk spdk_vhost_unlock(); 487dd4f161bSDarek Stojaczyk 488dd4f161bSDarek Stojaczyk spdk_json_write_array_end(w); 489dd4f161bSDarek Stojaczyk spdk_jsonrpc_end_result(request, w); 490dd4f161bSDarek Stojaczyk return; 491dd4f161bSDarek Stojaczyk 492dd4f161bSDarek Stojaczyk invalid: 493244a619fSDarek Stojaczyk free_rpc_get_vhost_ctrlrs(&req); 494dd4f161bSDarek Stojaczyk spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, 495dd4f161bSDarek Stojaczyk spdk_strerror(-rc)); 496ff88449dSPawel Niedzwiecki } 497dbaa2c79SSeth Howell SPDK_RPC_REGISTER("vhost_get_controllers", rpc_vhost_get_controllers, SPDK_RPC_RUNTIME) 498932a186bSDaniel Verkamp 499ff1863f4SPawel Wodkowski 500ff1863f4SPawel Wodkowski struct rpc_vhost_ctrlr_coalescing { 501ff1863f4SPawel Wodkowski char *ctrlr; 502ff1863f4SPawel Wodkowski uint32_t delay_base_us; 503ff1863f4SPawel Wodkowski uint32_t iops_threshold; 504ff1863f4SPawel Wodkowski }; 505ff1863f4SPawel Wodkowski 506ff1863f4SPawel Wodkowski static const struct spdk_json_object_decoder rpc_set_vhost_ctrlr_coalescing[] = { 507ff1863f4SPawel Wodkowski {"ctrlr", offsetof(struct rpc_vhost_ctrlr_coalescing, ctrlr), spdk_json_decode_string }, 508ff1863f4SPawel Wodkowski {"delay_base_us", offsetof(struct rpc_vhost_ctrlr_coalescing, delay_base_us), spdk_json_decode_uint32}, 509ff1863f4SPawel Wodkowski {"iops_threshold", offsetof(struct rpc_vhost_ctrlr_coalescing, iops_threshold), spdk_json_decode_uint32}, 510ff1863f4SPawel Wodkowski }; 511ff1863f4SPawel Wodkowski 512ff1863f4SPawel Wodkowski static void 513ff1863f4SPawel Wodkowski free_rpc_set_vhost_controllers_event_coalescing(struct rpc_vhost_ctrlr_coalescing *req) 514ff1863f4SPawel Wodkowski { 515ff1863f4SPawel Wodkowski free(req->ctrlr); 516ff1863f4SPawel Wodkowski } 517ff1863f4SPawel Wodkowski 518ff1863f4SPawel Wodkowski static void 519dbaa2c79SSeth Howell rpc_vhost_controller_set_coalescing(struct spdk_jsonrpc_request *request, 520ff1863f4SPawel Wodkowski const struct spdk_json_val *params) 521ff1863f4SPawel Wodkowski { 522244a619fSDarek Stojaczyk struct rpc_vhost_ctrlr_coalescing req = {0}; 523dd4f161bSDarek Stojaczyk struct spdk_vhost_dev *vdev; 524ff1863f4SPawel Wodkowski int rc; 525ff1863f4SPawel Wodkowski 526ff1863f4SPawel Wodkowski if (spdk_json_decode_object(params, rpc_set_vhost_ctrlr_coalescing, 527244a619fSDarek Stojaczyk SPDK_COUNTOF(rpc_set_vhost_ctrlr_coalescing), &req)) { 5282172c432STomasz Zawadzki SPDK_DEBUGLOG(vhost_rpc, "spdk_json_decode_object failed\n"); 529ff1863f4SPawel Wodkowski rc = -EINVAL; 530ff1863f4SPawel Wodkowski goto invalid; 531ff1863f4SPawel Wodkowski } 532ff1863f4SPawel Wodkowski 533dd4f161bSDarek Stojaczyk spdk_vhost_lock(); 534244a619fSDarek Stojaczyk vdev = spdk_vhost_dev_find(req.ctrlr); 535dd4f161bSDarek Stojaczyk if (vdev == NULL) { 536dd4f161bSDarek Stojaczyk spdk_vhost_unlock(); 537dd4f161bSDarek Stojaczyk rc = -ENODEV; 538dd4f161bSDarek Stojaczyk goto invalid; 539dd4f161bSDarek Stojaczyk } 540dd4f161bSDarek Stojaczyk 541244a619fSDarek Stojaczyk rc = spdk_vhost_set_coalescing(vdev, req.delay_base_us, req.iops_threshold); 542dd4f161bSDarek Stojaczyk spdk_vhost_unlock(); 543dd4f161bSDarek Stojaczyk if (rc) { 544dd4f161bSDarek Stojaczyk goto invalid; 545dd4f161bSDarek Stojaczyk } 546dd4f161bSDarek Stojaczyk 547244a619fSDarek Stojaczyk free_rpc_set_vhost_controllers_event_coalescing(&req); 548dd4f161bSDarek Stojaczyk 549d73077b8Syidong0635 spdk_jsonrpc_send_bool_response(request, true); 550ff1863f4SPawel Wodkowski return; 551ff1863f4SPawel Wodkowski 552ff1863f4SPawel Wodkowski invalid: 553244a619fSDarek Stojaczyk free_rpc_set_vhost_controllers_event_coalescing(&req); 554891c12a6SPawel Wodkowski spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, 555891c12a6SPawel Wodkowski spdk_strerror(-rc)); 556ff1863f4SPawel Wodkowski } 557dbaa2c79SSeth Howell SPDK_RPC_REGISTER("vhost_controller_set_coalescing", rpc_vhost_controller_set_coalescing, 558e008db08SShuhei Matsumoto SPDK_RPC_RUNTIME) 559ff1863f4SPawel Wodkowski 560537929e1SKrystyna Szybalska struct rpc_get_transport { 561537929e1SKrystyna Szybalska char *name; 562537929e1SKrystyna Szybalska }; 563537929e1SKrystyna Szybalska 564537929e1SKrystyna Szybalska static const struct spdk_json_object_decoder rpc_get_transport_decoders[] = { 565537929e1SKrystyna Szybalska {"name", offsetof(struct rpc_get_transport, name), spdk_json_decode_string, true}, 566537929e1SKrystyna Szybalska }; 567537929e1SKrystyna Szybalska 568537929e1SKrystyna Szybalska static void 569537929e1SKrystyna Szybalska rpc_virtio_blk_get_transports(struct spdk_jsonrpc_request *request, 570537929e1SKrystyna Szybalska const struct spdk_json_val *params) 571537929e1SKrystyna Szybalska { 572537929e1SKrystyna Szybalska struct rpc_get_transport req = { 0 }; 573537929e1SKrystyna Szybalska struct spdk_json_write_ctx *w; 574537929e1SKrystyna Szybalska struct spdk_virtio_blk_transport *transport = NULL; 575537929e1SKrystyna Szybalska 576537929e1SKrystyna Szybalska if (params) { 577537929e1SKrystyna Szybalska if (spdk_json_decode_object(params, rpc_get_transport_decoders, 578537929e1SKrystyna Szybalska SPDK_COUNTOF(rpc_get_transport_decoders), 579537929e1SKrystyna Szybalska &req)) { 580537929e1SKrystyna Szybalska SPDK_ERRLOG("spdk_json_decode_object failed\n"); 581537929e1SKrystyna Szybalska spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, "Invalid parameters"); 582537929e1SKrystyna Szybalska return; 583537929e1SKrystyna Szybalska } 584537929e1SKrystyna Szybalska } 585537929e1SKrystyna Szybalska 586537929e1SKrystyna Szybalska if (req.name) { 587537929e1SKrystyna Szybalska transport = virtio_blk_tgt_get_transport(req.name); 588537929e1SKrystyna Szybalska if (transport == NULL) { 589537929e1SKrystyna Szybalska SPDK_ERRLOG("transport '%s' does not exist\n", req.name); 590537929e1SKrystyna Szybalska spdk_jsonrpc_send_error_response(request, -ENODEV, spdk_strerror(ENODEV)); 591537929e1SKrystyna Szybalska free(req.name); 592537929e1SKrystyna Szybalska return; 593537929e1SKrystyna Szybalska } 594537929e1SKrystyna Szybalska } 595537929e1SKrystyna Szybalska 596537929e1SKrystyna Szybalska w = spdk_jsonrpc_begin_result(request); 597537929e1SKrystyna Szybalska spdk_json_write_array_begin(w); 598537929e1SKrystyna Szybalska 599537929e1SKrystyna Szybalska if (transport) { 600537929e1SKrystyna Szybalska virtio_blk_transport_dump_opts(transport, w); 601537929e1SKrystyna Szybalska } else { 602537929e1SKrystyna Szybalska for (transport = virtio_blk_transport_get_first(); transport != NULL; 603537929e1SKrystyna Szybalska transport = virtio_blk_transport_get_next(transport)) { 604537929e1SKrystyna Szybalska virtio_blk_transport_dump_opts(transport, w); 605537929e1SKrystyna Szybalska } 606537929e1SKrystyna Szybalska } 607537929e1SKrystyna Szybalska 608537929e1SKrystyna Szybalska spdk_json_write_array_end(w); 609537929e1SKrystyna Szybalska spdk_jsonrpc_end_result(request, w); 610537929e1SKrystyna Szybalska free(req.name); 611537929e1SKrystyna Szybalska } 612537929e1SKrystyna Szybalska SPDK_RPC_REGISTER("virtio_blk_get_transports", rpc_virtio_blk_get_transports, SPDK_RPC_RUNTIME) 613537929e1SKrystyna Szybalska 614b727e804STomasz Zawadzki struct rpc_virtio_blk_create_transport { 615b727e804STomasz Zawadzki char *name; 616b727e804STomasz Zawadzki }; 617b727e804STomasz Zawadzki 618b727e804STomasz Zawadzki static const struct spdk_json_object_decoder rpc_create_virtio_blk_transport[] = { 619b727e804STomasz Zawadzki {"name", offsetof(struct rpc_virtio_blk_create_transport, name), spdk_json_decode_string}, 620b727e804STomasz Zawadzki }; 621b727e804STomasz Zawadzki 622b727e804STomasz Zawadzki static void 623b727e804STomasz Zawadzki free_rpc_virtio_blk_create_transport(struct rpc_virtio_blk_create_transport *req) 624b727e804STomasz Zawadzki { 625b727e804STomasz Zawadzki free(req->name); 626b727e804STomasz Zawadzki } 627b727e804STomasz Zawadzki 628b727e804STomasz Zawadzki static void 629b727e804STomasz Zawadzki rpc_virtio_blk_create_transport(struct spdk_jsonrpc_request *request, 630b727e804STomasz Zawadzki const struct spdk_json_val *params) 631b727e804STomasz Zawadzki { 632b727e804STomasz Zawadzki struct rpc_virtio_blk_create_transport req = {0}; 633b727e804STomasz Zawadzki int rc; 634b727e804STomasz Zawadzki 635b727e804STomasz Zawadzki if (spdk_json_decode_object_relaxed(params, rpc_create_virtio_blk_transport, 636b727e804STomasz Zawadzki SPDK_COUNTOF(rpc_create_virtio_blk_transport), &req)) { 637b727e804STomasz Zawadzki SPDK_DEBUGLOG(vhost_rpc, "spdk_json_decode_object failed\n"); 638b727e804STomasz Zawadzki rc = -EINVAL; 639b727e804STomasz Zawadzki goto invalid; 640b727e804STomasz Zawadzki } 641b727e804STomasz Zawadzki 642b727e804STomasz Zawadzki spdk_vhost_lock(); 643b727e804STomasz Zawadzki rc = virtio_blk_transport_create(req.name, params); 644b727e804STomasz Zawadzki spdk_vhost_unlock(); 645b727e804STomasz Zawadzki if (rc != 0) { 646b727e804STomasz Zawadzki goto invalid; 647b727e804STomasz Zawadzki } 648b727e804STomasz Zawadzki 649b727e804STomasz Zawadzki free_rpc_virtio_blk_create_transport(&req); 650b727e804STomasz Zawadzki spdk_jsonrpc_send_bool_response(request, true); 651b727e804STomasz Zawadzki return; 652b727e804STomasz Zawadzki 653b727e804STomasz Zawadzki invalid: 654b727e804STomasz Zawadzki free_rpc_virtio_blk_create_transport(&req); 655ee3ec3f7SKonrad Sztyber spdk_jsonrpc_send_error_response(request, rc, spdk_strerror(-rc)); 656b727e804STomasz Zawadzki } 657b727e804STomasz Zawadzki SPDK_RPC_REGISTER("virtio_blk_create_transport", rpc_virtio_blk_create_transport, 658b727e804STomasz Zawadzki SPDK_RPC_RUNTIME) 659b727e804STomasz Zawadzki 6602172c432STomasz Zawadzki SPDK_LOG_REGISTER_COMPONENT(vhost_rpc) 661