From ca8e6d236146f567f6d85d4d3ff0f677659549ec Mon Sep 17 00:00:00 2001 From: Krzysztof Karas Date: Mon, 7 Feb 2022 12:19:24 +0000 Subject: [PATCH] event: use implemented set/get methods in RPC calls Make use of code implemented in previous patches in the series to get and set dynamic scheduler values. Modifiy app.py and rpc.py to accomodate new changes and allow user to specify scheduler parameters in the RPC calls. Change-Id: I6173aefbf1d774b91b80ee5bce67eea80a2ab23d Signed-off-by: Krzysztof Karas Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/11449 Tested-by: SPDK CI Jenkins Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Reviewed-by: Jim Harris Reviewed-by: Tomasz Zawadzki --- lib/event/app_rpc.c | 23 +++++++++++++++++++---- scripts/rpc.py | 8 +++++++- scripts/rpc/app.py | 9 ++++++++- 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/lib/event/app_rpc.c b/lib/event/app_rpc.c index 22ea71f99..c30df7a02 100644 --- a/lib/event/app_rpc.c +++ b/lib/event/app_rpc.c @@ -475,7 +475,7 @@ free_rpc_framework_set_scheduler(struct rpc_set_scheduler_ctx *r) static const struct spdk_json_object_decoder rpc_set_scheduler_decoders[] = { {"name", offsetof(struct rpc_set_scheduler_ctx, name), spdk_json_decode_string}, - {"period", offsetof(struct rpc_set_scheduler_ctx, period), spdk_json_decode_uint64, true} + {"period", offsetof(struct rpc_set_scheduler_ctx, period), spdk_json_decode_uint64, true}, }; static void @@ -483,11 +483,12 @@ rpc_framework_set_scheduler(struct spdk_jsonrpc_request *request, const struct spdk_json_val *params) { struct rpc_set_scheduler_ctx req = {NULL}; + struct spdk_scheduler *scheduler = NULL; int ret; - ret = spdk_json_decode_object(params, rpc_set_scheduler_decoders, - SPDK_COUNTOF(rpc_set_scheduler_decoders), - &req); + ret = spdk_json_decode_object_relaxed(params, rpc_set_scheduler_decoders, + SPDK_COUNTOF(rpc_set_scheduler_decoders), + &req); if (ret) { spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, "Invalid parameters"); @@ -505,6 +506,15 @@ rpc_framework_set_scheduler(struct spdk_jsonrpc_request *request, goto end; } + scheduler = spdk_scheduler_get(); + if (scheduler != NULL && scheduler->set_opts != NULL) { + ret = scheduler->set_opts(params); + } + if (ret) { + spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, spdk_strerror(ret)); + goto end; + } + spdk_jsonrpc_send_bool_response(request, true); end: @@ -537,6 +547,11 @@ rpc_framework_get_scheduler(struct spdk_jsonrpc_request *request, if (governor != NULL) { spdk_json_write_named_string(w, "governor_name", governor->name); } + + if (scheduler != NULL && scheduler->get_opts != NULL) { + scheduler->get_opts(w); + } + spdk_json_write_object_end(w); spdk_jsonrpc_end_result(request, w); } diff --git a/scripts/rpc.py b/scripts/rpc.py index 616d4a7f2..371e08fc9 100755 --- a/scripts/rpc.py +++ b/scripts/rpc.py @@ -160,12 +160,18 @@ if __name__ == "__main__": def framework_set_scheduler(args): rpc.app.framework_set_scheduler(args.client, name=args.name, - period=args.period) + period=args.period, + load_limit=args.load_limit, + core_limit=args.core_limit, + core_busy=args.core_busy) p = subparsers.add_parser( 'framework_set_scheduler', help='Select thread scheduler that will be activated and its period (experimental)') p.add_argument('name', help="Name of a scheduler") p.add_argument('-p', '--period', help="Scheduler period in microseconds", type=int) + p.add_argument('--load-limit', help="Scheduler load limit. Reserved for dynamic scheduler", type=int, required=False) + p.add_argument('--core-limit', help="Scheduler core limit. Reserved for dynamic scheduler", type=int, required=False) + p.add_argument('--core-busy', help="Scheduler core busy limit. Reserved for dynamic schedler", type=int, required=False) p.set_defaults(func=framework_set_scheduler) def framework_get_scheduler(args): diff --git a/scripts/rpc/app.py b/scripts/rpc/app.py index 9ad5cdc2f..9efac27d2 100644 --- a/scripts/rpc/app.py +++ b/scripts/rpc/app.py @@ -37,7 +37,8 @@ def framework_get_reactors(client): return client.call('framework_get_reactors') -def framework_set_scheduler(client, name, period=None): +def framework_set_scheduler(client, name, period=None, load_limit=None, core_limit=None, + core_busy=None): """Select threads scheduler that will be activated and its period. Args: @@ -49,6 +50,12 @@ def framework_set_scheduler(client, name, period=None): params = {'name': name} if period is not None: params['period'] = period + if load_limit is not None: + params['load_limit'] = load_limit + if core_limit is not None: + params['core_limit'] = core_limit + if core_busy is not None: + params['core_busy'] = core_busy return client.call('framework_set_scheduler', params)