From: Hannes Reinecke Date: Wed, 16 Jun 2021 07:56:07 +0000 (+0200) Subject: fabrics: add fast_io_fail_tmo option X-Git-Tag: v1.0-rc0~127^2~1 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=0130570f900bb30d46194bc3acb6244966025ee9;p=users%2Fsagi%2Flibnvme.git fabrics: add fast_io_fail_tmo option Option to fail fast I/O when connecting to a controller. It is useful to set a fast-fail timeout for nvme in case upper layer SW wants to detect unresponsive controllers early (e.g. mdraid). Ported from nvme-cli. Signed-off-by: Hannes Reinecke --- diff --git a/src/nvme/fabrics.c b/src/nvme/fabrics.c index 83fbc64b..64845644 100644 --- a/src/nvme/fabrics.c +++ b/src/nvme/fabrics.c @@ -154,6 +154,7 @@ static struct nvme_fabrics_config *merge_config(nvme_ctrl_t c, UPDATE_CFG_OPTION(ctrl_cfg, cfg, reconnect_delay, 0); UPDATE_CFG_OPTION(ctrl_cfg, cfg, ctrl_loss_tmo, NVMF_DEF_CTRL_LOSS_TMO); + UPDATE_CFG_OPTION(ctrl_cfg, cfg, fast_io_fail_tmo, 0); UPDATE_CFG_OPTION(ctrl_cfg, cfg, tos, -1); UPDATE_CFG_OPTION(ctrl_cfg, cfg, duplicate_connect, false); UPDATE_CFG_OPTION(ctrl_cfg, cfg, disable_sqflow, false); @@ -273,6 +274,9 @@ static int build_options(nvme_ctrl_t c, char **argstr) (strcmp(transport, "loop") && add_int_argument(argstr, "ctrl_loss_tmo", cfg->ctrl_loss_tmo, false)) || + (strcmp(transport, "loop") && + add_int_argument(argstr, "fast_io_fail_tmo", + cfg->fast_io_fail_tmo, false)) || (strcmp(transport, "loop") && add_int_argument(argstr, "tos", cfg->tos, true)) || add_bool_argument(argstr, "duplicate_connect", diff --git a/src/nvme/fabrics.h b/src/nvme/fabrics.h index c130339b..10ac2e29 100644 --- a/src/nvme/fabrics.h +++ b/src/nvme/fabrics.h @@ -22,6 +22,7 @@ * @nr_io_queues: Number of controller IO queues to establish * @reconnect_delay: Time between two consecutive reconnect attempts. * @ctrl_loss_tmo: Override the default controller reconnect attempt timeout in seconds + * @fast_io_fail_tmo: Set the fast I/O fail timeout in seconds. * @keep_alive_tmo: Override the default keep-alive-timeout to this value in seconds * @nr_write_queues: Number of queues to use for exclusively for writing * @nr_poll_queues: Number of queues to reserve for polling completions @@ -36,6 +37,7 @@ struct nvme_fabrics_config { int nr_io_queues; int reconnect_delay; int ctrl_loss_tmo; + int fast_io_fail_tmo; int keep_alive_tmo; int nr_write_queues; int nr_poll_queues; diff --git a/src/nvme/json.c b/src/nvme/json.c index c902a3e9..307dc7fd 100644 --- a/src/nvme/json.c +++ b/src/nvme/json.c @@ -50,6 +50,8 @@ static void json_update_attributes(nvme_ctrl_t c, if (!strcmp("ctrl_loss_tmo", key_str) && cfg->ctrl_loss_tmo != NVMF_DEF_CTRL_LOSS_TMO) cfg->ctrl_loss_tmo = json_object_get_int(val_obj); + JSON_UPDATE_INT_OPTION(cfg, key_str, + fast_io_fail_tmo, val_obj); if (!strcmp("tos", key_str) && cfg->tos != -1) cfg->tos = json_object_get_int(val_obj); JSON_UPDATE_BOOL_OPTION(cfg, key_str, @@ -189,9 +191,11 @@ static void json_update_port(struct json_object *ctrl_array, nvme_ctrl_t c) JSON_INT_OPTION(cfg, port_obj, queue_size, 0); JSON_INT_OPTION(cfg, port_obj, keep_alive_tmo, 0); JSON_INT_OPTION(cfg, port_obj, reconnect_delay, 0); - if (strcmp(transport, "loop")) + if (strcmp(transport, "loop")) { JSON_INT_OPTION(cfg, port_obj, ctrl_loss_tmo, NVMF_DEF_CTRL_LOSS_TMO); + JSON_INT_OPTION(cfg, port_obj, fast_io_fail_tmo, 0); + } JSON_INT_OPTION(cfg, port_obj, tos, -1); JSON_BOOL_OPTION(cfg, port_obj, duplicate_connect); JSON_BOOL_OPTION(cfg, port_obj, disable_sqflow);