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 <krzysztof.karas@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/11449
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Community-CI: Mellanox Build Bot
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
This commit is contained in:
Krzysztof Karas 2022-02-07 12:19:24 +00:00 committed by Tomasz Zawadzki
parent 32da70152f
commit ca8e6d2361
3 changed files with 34 additions and 6 deletions

View File

@ -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);
}

View File

@ -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):

View File

@ -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)