lib/nvmf: custom admin handler config
This commit disables the custom identify handler by default. The user has to explictly enable this handler via the set_nvmf_config RPC or conf file. Change-Id: I767816ba7639ebe78683993408ce6db02c7620fe Signed-off-by: Michael Haeuptle <michael.haeuptle@hpe.com> Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/479603 Community-CI: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
parent
e93902a03d
commit
c9874b91a7
@ -33,9 +33,8 @@ in `spdk_internal/nvmf.h` expose this functionality. There is an example custom
|
|||||||
for the NVMe IDENTIFY CTRLR in `lib/nvmf/custom_cmd_hdlr.c`. This handler gets the SN, MN, FR, IEEE, FGUID
|
for the NVMe IDENTIFY CTRLR in `lib/nvmf/custom_cmd_hdlr.c`. This handler gets the SN, MN, FR, IEEE, FGUID
|
||||||
attributes from the first NVMe drive in the NVMF subsystem and returns it to the NVMF initiator (sn and mn attributes
|
attributes from the first NVMe drive in the NVMF subsystem and returns it to the NVMF initiator (sn and mn attributes
|
||||||
specified during NVMF subsystem creation RPC will be overwritten).
|
specified during NVMF subsystem creation RPC will be overwritten).
|
||||||
|
This handler can be enabled via the `nvmf_set_config` RPC.
|
||||||
This handler is enabled by default and can be disabled by adding
|
Note: In a future version of SPDK, this handler will be enabled by default.
|
||||||
`spdk_nvmf_set_custom_admin_cmd_hdlr(SPDK_NVME_OPC_IDENTIFY, NULL);` to a target application.
|
|
||||||
|
|
||||||
### sock
|
### sock
|
||||||
|
|
||||||
|
@ -4313,6 +4313,13 @@ have been initialized.
|
|||||||
Name | Optional | Type | Description
|
Name | Optional | Type | Description
|
||||||
----------------------- | -------- | ----------- | -----------
|
----------------------- | -------- | ----------- | -----------
|
||||||
acceptor_poll_rate | Optional | number | Polling interval of the acceptor for incoming connections (microseconds)
|
acceptor_poll_rate | Optional | number | Polling interval of the acceptor for incoming connections (microseconds)
|
||||||
|
admin_cmd_passthru | Optional | object | Admin command passthru configuration
|
||||||
|
|
||||||
|
### admin_cmd_passthru {#spdk_nvmf_admin_passthru_conf}
|
||||||
|
|
||||||
|
Name | Optional | Type | Description
|
||||||
|
----------------------- | -------- | ----------- | -----------
|
||||||
|
identify_ctrlr | Required | bool | If true, enables custom identify handler that reports some identify attributes from the underlying NVMe drive
|
||||||
|
|
||||||
### Example
|
### Example
|
||||||
|
|
||||||
|
@ -136,6 +136,9 @@ spdk_nvmf_read_config_file_tgt_conf(struct spdk_conf_section *sp,
|
|||||||
"we will use RoundRobin as the default scheduler\n");
|
"we will use RoundRobin as the default scheduler\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
conf->admin_passthru.identify_ctrlr = spdk_conf_section_get_boolval(sp,
|
||||||
|
"AdminCmdPassthruIdentifyCtrlr", false);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -168,6 +171,7 @@ spdk_nvmf_parse_tgt_conf(void)
|
|||||||
|
|
||||||
conf->acceptor_poll_rate = ACCEPT_TIMEOUT_US;
|
conf->acceptor_poll_rate = ACCEPT_TIMEOUT_US;
|
||||||
conf->conn_sched = DEFAULT_CONN_SCHED;
|
conf->conn_sched = DEFAULT_CONN_SCHED;
|
||||||
|
conf->admin_passthru.identify_ctrlr = false;
|
||||||
|
|
||||||
sp = spdk_conf_find_section(NULL, "Nvmf");
|
sp = spdk_conf_find_section(NULL, "Nvmf");
|
||||||
if (sp != NULL) {
|
if (sp != NULL) {
|
||||||
|
@ -51,9 +51,14 @@ enum spdk_nvmf_connect_sched {
|
|||||||
CONNECT_SCHED_TRANSPORT_OPTIMAL_GROUP,
|
CONNECT_SCHED_TRANSPORT_OPTIMAL_GROUP,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct spdk_nvmf_admin_passthru_conf {
|
||||||
|
bool identify_ctrlr;
|
||||||
|
};
|
||||||
|
|
||||||
struct spdk_nvmf_tgt_conf {
|
struct spdk_nvmf_tgt_conf {
|
||||||
uint32_t acceptor_poll_rate;
|
uint32_t acceptor_poll_rate;
|
||||||
enum spdk_nvmf_connect_sched conn_sched;
|
enum spdk_nvmf_connect_sched conn_sched;
|
||||||
|
struct spdk_nvmf_admin_passthru_conf admin_passthru;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct spdk_nvmf_tgt_conf *g_spdk_nvmf_tgt_conf;
|
extern struct spdk_nvmf_tgt_conf *g_spdk_nvmf_tgt_conf;
|
||||||
|
@ -92,9 +92,28 @@ static int decode_conn_sched(const struct spdk_json_val *val, void *out)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const struct spdk_json_object_decoder admin_passthru_decoder[] = {
|
||||||
|
{"identify_ctrlr", offsetof(struct spdk_nvmf_admin_passthru_conf, identify_ctrlr), spdk_json_decode_bool}
|
||||||
|
};
|
||||||
|
|
||||||
|
static int decode_admin_passthru(const struct spdk_json_val *val, void *out)
|
||||||
|
{
|
||||||
|
struct spdk_nvmf_admin_passthru_conf *req = (struct spdk_nvmf_admin_passthru_conf *)out;
|
||||||
|
|
||||||
|
if (spdk_json_decode_object(val, admin_passthru_decoder,
|
||||||
|
SPDK_COUNTOF(admin_passthru_decoder),
|
||||||
|
req)) {
|
||||||
|
SPDK_ERRLOG("spdk_json_decode_object failed\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static const struct spdk_json_object_decoder nvmf_rpc_subsystem_tgt_conf_decoder[] = {
|
static const struct spdk_json_object_decoder nvmf_rpc_subsystem_tgt_conf_decoder[] = {
|
||||||
{"acceptor_poll_rate", offsetof(struct spdk_nvmf_tgt_conf, acceptor_poll_rate), spdk_json_decode_uint32, true},
|
{"acceptor_poll_rate", offsetof(struct spdk_nvmf_tgt_conf, acceptor_poll_rate), spdk_json_decode_uint32, true},
|
||||||
{"conn_sched", offsetof(struct spdk_nvmf_tgt_conf, conn_sched), decode_conn_sched, true},
|
{"conn_sched", offsetof(struct spdk_nvmf_tgt_conf, conn_sched), decode_conn_sched, true},
|
||||||
|
{"admin_cmd_passthru", offsetof(struct spdk_nvmf_tgt_conf, admin_passthru), decode_admin_passthru, true}
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -121,6 +140,7 @@ spdk_rpc_nvmf_set_config(struct spdk_jsonrpc_request *request,
|
|||||||
|
|
||||||
conf->acceptor_poll_rate = ACCEPT_TIMEOUT_US;
|
conf->acceptor_poll_rate = ACCEPT_TIMEOUT_US;
|
||||||
conf->conn_sched = DEFAULT_CONN_SCHED;
|
conf->conn_sched = DEFAULT_CONN_SCHED;
|
||||||
|
conf->admin_passthru.identify_ctrlr = false;
|
||||||
|
|
||||||
if (params != NULL) {
|
if (params != NULL) {
|
||||||
if (spdk_json_decode_object(params, nvmf_rpc_subsystem_tgt_conf_decoder,
|
if (spdk_json_decode_object(params, nvmf_rpc_subsystem_tgt_conf_decoder,
|
||||||
|
@ -438,7 +438,6 @@ nvmf_tgt_advance_state(void)
|
|||||||
|
|
||||||
switch (g_tgt_state) {
|
switch (g_tgt_state) {
|
||||||
case NVMF_TGT_INIT_NONE: {
|
case NVMF_TGT_INIT_NONE: {
|
||||||
spdk_nvmf_set_custom_admin_cmd_hdlr(SPDK_NVME_OPC_IDENTIFY, spdk_nvmf_custom_identify_hdlr);
|
|
||||||
g_tgt_state = NVMF_TGT_INIT_PARSE_CONFIG;
|
g_tgt_state = NVMF_TGT_INIT_PARSE_CONFIG;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -449,6 +448,11 @@ nvmf_tgt_advance_state(void)
|
|||||||
spdk_thread_send_msg(spdk_get_thread(), nvmf_tgt_parse_conf_start, NULL);
|
spdk_thread_send_msg(spdk_get_thread(), nvmf_tgt_parse_conf_start, NULL);
|
||||||
break;
|
break;
|
||||||
case NVMF_TGT_INIT_CREATE_POLL_GROUPS:
|
case NVMF_TGT_INIT_CREATE_POLL_GROUPS:
|
||||||
|
/* Config parsed */
|
||||||
|
if (g_spdk_nvmf_tgt_conf->admin_passthru.identify_ctrlr) {
|
||||||
|
SPDK_NOTICELOG("Custom identify ctrlr handler enabled\n");
|
||||||
|
spdk_nvmf_set_custom_admin_cmd_hdlr(SPDK_NVME_OPC_IDENTIFY, spdk_nvmf_custom_identify_hdlr);
|
||||||
|
}
|
||||||
/* Send a message to each thread and create a poll group */
|
/* Send a message to each thread and create a poll group */
|
||||||
spdk_for_each_thread(nvmf_tgt_create_poll_group,
|
spdk_for_each_thread(nvmf_tgt_create_poll_group,
|
||||||
NULL,
|
NULL,
|
||||||
@ -542,6 +546,10 @@ spdk_nvmf_subsystem_write_config_json(struct spdk_json_write_ctx *w)
|
|||||||
spdk_json_write_named_uint32(w, "acceptor_poll_rate", g_spdk_nvmf_tgt_conf->acceptor_poll_rate);
|
spdk_json_write_named_uint32(w, "acceptor_poll_rate", g_spdk_nvmf_tgt_conf->acceptor_poll_rate);
|
||||||
spdk_json_write_named_string(w, "conn_sched",
|
spdk_json_write_named_string(w, "conn_sched",
|
||||||
get_conn_sched_string(g_spdk_nvmf_tgt_conf->conn_sched));
|
get_conn_sched_string(g_spdk_nvmf_tgt_conf->conn_sched));
|
||||||
|
spdk_json_write_named_object_begin(w, "admin_cmd_passthru");
|
||||||
|
spdk_json_write_named_bool(w, "identify_ctrlr",
|
||||||
|
g_spdk_nvmf_tgt_conf->admin_passthru.identify_ctrlr);
|
||||||
|
spdk_json_write_object_end(w);
|
||||||
spdk_json_write_object_end(w);
|
spdk_json_write_object_end(w);
|
||||||
spdk_json_write_object_end(w);
|
spdk_json_write_object_end(w);
|
||||||
|
|
||||||
|
@ -1651,7 +1651,8 @@ Format: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 mse
|
|||||||
def nvmf_set_config(args):
|
def nvmf_set_config(args):
|
||||||
rpc.nvmf.nvmf_set_config(args.client,
|
rpc.nvmf.nvmf_set_config(args.client,
|
||||||
acceptor_poll_rate=args.acceptor_poll_rate,
|
acceptor_poll_rate=args.acceptor_poll_rate,
|
||||||
conn_sched=args.conn_sched)
|
conn_sched=args.conn_sched,
|
||||||
|
passthru_identify_ctrlr=args.passthru_identify_ctrlr)
|
||||||
|
|
||||||
p = subparsers.add_parser('nvmf_set_config', aliases=['set_nvmf_target_config'],
|
p = subparsers.add_parser('nvmf_set_config', aliases=['set_nvmf_target_config'],
|
||||||
help='Set NVMf target config')
|
help='Set NVMf target config')
|
||||||
@ -1660,6 +1661,8 @@ Format: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 mse
|
|||||||
on the cores in a round robin manner (Default). 'hostip' - Schedule all the incoming connections from a
|
on the cores in a round robin manner (Default). 'hostip' - Schedule all the incoming connections from a
|
||||||
specific host IP on to the same core. Connections from different IP will be assigned to cores in a round
|
specific host IP on to the same core. Connections from different IP will be assigned to cores in a round
|
||||||
robin manner. 'transport' - Schedule the connection according to the transport characteristics.""")
|
robin manner. 'transport' - Schedule the connection according to the transport characteristics.""")
|
||||||
|
p.add_argument('-i', '--passthru-identify-ctrlr', help="""Passthrough fields like serial number and model number
|
||||||
|
when the controller has a single namespace that is an NVMe bdev""", action='store_true')
|
||||||
p.set_defaults(func=nvmf_set_config)
|
p.set_defaults(func=nvmf_set_config)
|
||||||
|
|
||||||
def nvmf_create_transport(args):
|
def nvmf_create_transport(args):
|
||||||
|
@ -21,7 +21,8 @@ def nvmf_set_max_subsystems(client,
|
|||||||
@deprecated_alias('set_nvmf_target_config')
|
@deprecated_alias('set_nvmf_target_config')
|
||||||
def nvmf_set_config(client,
|
def nvmf_set_config(client,
|
||||||
acceptor_poll_rate=None,
|
acceptor_poll_rate=None,
|
||||||
conn_sched=None):
|
conn_sched=None,
|
||||||
|
passthru_identify_ctrlr=None):
|
||||||
"""Set NVMe-oF target subsystem configuration.
|
"""Set NVMe-oF target subsystem configuration.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
@ -37,6 +38,11 @@ def nvmf_set_config(client,
|
|||||||
params['acceptor_poll_rate'] = acceptor_poll_rate
|
params['acceptor_poll_rate'] = acceptor_poll_rate
|
||||||
if conn_sched:
|
if conn_sched:
|
||||||
params['conn_sched'] = conn_sched
|
params['conn_sched'] = conn_sched
|
||||||
|
if passthru_identify_ctrlr:
|
||||||
|
admin_cmd_passthru = {}
|
||||||
|
admin_cmd_passthru['identify_ctrlr'] = passthru_identify_ctrlr
|
||||||
|
params['admin_cmd_passthru'] = admin_cmd_passthru
|
||||||
|
|
||||||
return client.call('nvmf_set_config', params)
|
return client.call('nvmf_set_config', params)
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user