interrupt_tgt: add RPC to set interrupt mode
Plugin RPC method 'reactor_set_interrupt_mode' is added to set specific reactor run in interrupt mode or back to poll mode. Based on this RPC, scenarios later can be implemented to verify interrupt mode functionality. Change-Id: I9785e6942299bab7c949780faf18216e293f0b1d Signed-off-by: Liu Xiaodong <xiaodong.liu@intel.com> Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/7347 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Community-CI: Mellanox Build Bot Reviewed-by: Changpeng Liu <changpeng.liu@intel.com> Reviewed-by: <dongx.yi@intel.com> Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
This commit is contained in:
parent
6c9b7d0896
commit
74db63dcda
15
examples/interrupt_tgt/interrupt_plugin.py
Normal file
15
examples/interrupt_tgt/interrupt_plugin.py
Normal file
@ -0,0 +1,15 @@
|
||||
from rpc.client import print_json
|
||||
|
||||
|
||||
def reactor_set_interrupt_mode(args):
|
||||
params = {'lcore': args.lcore, 'disable_interrupt': args.disable_interrupt}
|
||||
return args.client.call('reactor_set_interrupt_mode', params)
|
||||
|
||||
|
||||
def spdk_rpc_plugin_initialize(subparsers):
|
||||
p = subparsers.add_parser('reactor_set_interrupt_mode',
|
||||
help="""Set reactor to interrupt or back to poll mode.""")
|
||||
p.add_argument('lcore', type=int, help='lcore of the reactor')
|
||||
p.add_argument('-d', '--disable-interrupt', dest='disable_interrupt', action='store_true',
|
||||
help='Set reactor back to poll mode')
|
||||
p.set_defaults(func=reactor_set_interrupt_mode)
|
@ -35,6 +35,69 @@
|
||||
#include "spdk/conf.h"
|
||||
#include "spdk/event.h"
|
||||
#include "spdk/vhost.h"
|
||||
#include "spdk/json.h"
|
||||
#include "spdk/jsonrpc.h"
|
||||
#include "spdk/rpc.h"
|
||||
#include "spdk/env.h"
|
||||
|
||||
#include "spdk_internal/event.h"
|
||||
|
||||
struct rpc_reactor_set_interrupt_mode {
|
||||
int32_t lcore;
|
||||
bool disable_interrupt;
|
||||
};
|
||||
|
||||
static const struct spdk_json_object_decoder rpc_reactor_set_interrupt_mode_decoders[] = {
|
||||
{"lcore", offsetof(struct rpc_reactor_set_interrupt_mode, lcore), spdk_json_decode_int32},
|
||||
{"disable_interrupt", offsetof(struct rpc_reactor_set_interrupt_mode, disable_interrupt), spdk_json_decode_bool},
|
||||
};
|
||||
|
||||
static void
|
||||
rpc_reactor_set_interrupt_mode_cb(void *cb_arg)
|
||||
{
|
||||
struct spdk_jsonrpc_request *request = cb_arg;
|
||||
|
||||
SPDK_NOTICELOG("complete reactor switch\n");
|
||||
|
||||
spdk_jsonrpc_send_bool_response(request, true);
|
||||
}
|
||||
|
||||
static void
|
||||
rpc_reactor_set_interrupt_mode(struct spdk_jsonrpc_request *request,
|
||||
const struct spdk_json_val *params)
|
||||
{
|
||||
struct rpc_reactor_set_interrupt_mode req = {};
|
||||
int rc;
|
||||
|
||||
if (spdk_json_decode_object(params, rpc_reactor_set_interrupt_mode_decoders,
|
||||
SPDK_COUNTOF(rpc_reactor_set_interrupt_mode_decoders),
|
||||
&req)) {
|
||||
SPDK_ERRLOG("spdk_json_decode_object failed\n");
|
||||
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
|
||||
"spdk_json_decode_object failed");
|
||||
return;
|
||||
}
|
||||
|
||||
SPDK_NOTICELOG("RPC Start to %s interrupt mode on reactor %d.\n",
|
||||
req.disable_interrupt ? "disable" : "enable", req.lcore);
|
||||
if (req.lcore >= (int64_t)spdk_env_get_first_core() &&
|
||||
req.lcore <= (int64_t)spdk_env_get_last_core()) {
|
||||
rc = spdk_reactor_set_interrupt_mode(req.lcore, !req.disable_interrupt,
|
||||
rpc_reactor_set_interrupt_mode_cb, request);
|
||||
if (rc) {
|
||||
goto err;
|
||||
}
|
||||
} else {
|
||||
goto err;
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
err:
|
||||
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
|
||||
"Invalid parameters");
|
||||
}
|
||||
SPDK_RPC_REGISTER("reactor_set_interrupt_mode", rpc_reactor_set_interrupt_mode, SPDK_RPC_RUNTIME)
|
||||
|
||||
static void
|
||||
interrupt_tgt_usage(void)
|
||||
|
Loading…
Reference in New Issue
Block a user