Commit ca8e6d23 authored by Krzysztof Karas's avatar Krzysztof Karas Committed by Tomasz Zawadzki
Browse files

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: default avatarKrzysztof Karas <krzysztof.karas@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/11449


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
parent 32da7015
Loading
Loading
Loading
Loading
+19 −4
Original line number Diff line number Diff line
@@ -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,9 +483,10 @@ 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,
	ret = spdk_json_decode_object_relaxed(params, rpc_set_scheduler_decoders,
					      SPDK_COUNTOF(rpc_set_scheduler_decoders),
					      &req);
	if (ret) {
@@ -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);
}
+7 −1
Original line number Diff line number Diff line
@@ -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):
+8 −1
Original line number Diff line number Diff line
@@ -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)