From: Hannes Reinecke Date: Tue, 13 Apr 2021 07:28:30 +0000 (+0200) Subject: tree,fabrics: per-controller configuration X-Git-Tag: v1.0-rc0~129^2~7 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=df97aa957b67425d46b3184bbb414c8480c9c65c;p=users%2Fsagi%2Flibnvme.git tree,fabrics: per-controller configuration Make the fabrics configuration settings per-controller and implement nvme_ctrl_disable_sqflow(). Signed-off-by: Hannes Reinecke --- diff --git a/examples/discover-loop.c b/examples/discover-loop.c index 02816091..4a8d140c 100644 --- a/examples/discover-loop.c +++ b/examples/discover-loop.c @@ -70,7 +70,7 @@ int main() fprintf(stderr, "Failed to allocate memory\n"); return ENOMEM; } - ret = nvmf_add_ctrl(h, c, &cfg); + ret = nvmf_add_ctrl(h, c, &cfg, false); if (ret < 0) { fprintf(stderr, "no controller found\n"); return errno; diff --git a/src/nvme/fabrics.c b/src/nvme/fabrics.c index ac5daa1b..c9016ed4 100644 --- a/src/nvme/fabrics.c +++ b/src/nvme/fabrics.c @@ -136,6 +136,30 @@ const char *nvmf_cms_str(__u8 cm) return arg_str(cms, ARRAY_SIZE(cms), cm); } +#define UPDATE_CFG_OPTION(c, n, o, d) \ + if ((c)->o == d) (c)->o = (n)->o +static struct nvme_fabrics_config *merge_config(nvme_ctrl_t c, + const struct nvme_fabrics_config *cfg) +{ + struct nvme_fabrics_config *ctrl_cfg = nvme_ctrl_get_config(c); + + UPDATE_CFG_OPTION(ctrl_cfg, cfg, nr_io_queues, 0); + UPDATE_CFG_OPTION(ctrl_cfg, cfg, nr_write_queues, 0); + UPDATE_CFG_OPTION(ctrl_cfg, cfg, nr_poll_queues, 0); + UPDATE_CFG_OPTION(ctrl_cfg, cfg, queue_size, 0); + UPDATE_CFG_OPTION(ctrl_cfg, cfg, keep_alive_tmo, 0); + 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, tos, -1); + UPDATE_CFG_OPTION(ctrl_cfg, cfg, duplicate_connect, false); + UPDATE_CFG_OPTION(ctrl_cfg, cfg, disable_sqflow, false); + UPDATE_CFG_OPTION(ctrl_cfg, cfg, hdr_digest, false); + UPDATE_CFG_OPTION(ctrl_cfg, cfg, data_digest, false); + + return ctrl_cfg; +} + static int add_bool_argument(char **argstr, char *tok, bool arg) { char *nstr; @@ -184,9 +208,9 @@ static int add_argument(char **argstr, const char *tok, const char *arg) return 0; } -static int build_options(nvme_ctrl_t c, char **argstr, - const struct nvme_fabrics_config *cfg) +static int build_options(nvme_ctrl_t c, char **argstr) { + struct nvme_fabrics_config *cfg = nvme_ctrl_get_config(c); const char *transport = nvme_ctrl_get_transport(c); /* always specify nqn as first arg - this will init the string */ @@ -276,12 +300,14 @@ out_close: return ret; } -int nvmf_add_ctrl_opts(nvme_ctrl_t c, const struct nvme_fabrics_config *cfg) +int nvmf_add_ctrl_opts(nvme_ctrl_t c, struct nvme_fabrics_config *cfg) { char *argstr; int ret; - ret = build_options(c, &argstr, cfg); + cfg = merge_config(c, cfg); + + ret = build_options(c, &argstr); if (ret) return ret; @@ -291,12 +317,16 @@ int nvmf_add_ctrl_opts(nvme_ctrl_t c, const struct nvme_fabrics_config *cfg) } int nvmf_add_ctrl(nvme_host_t h, nvme_ctrl_t c, - const struct nvme_fabrics_config *cfg) + const struct nvme_fabrics_config *cfg, + bool disable_sqflow) { char *argstr; int ret; - ret = build_options(c, &argstr, cfg); + cfg = merge_config(c, cfg); + nvme_ctrl_disable_sqflow(c, disable_sqflow); + + ret = build_options(c, &argstr); if (ret) return ret; @@ -310,16 +340,15 @@ int nvmf_add_ctrl(nvme_host_t h, nvme_ctrl_t c, nvme_ctrl_t nvmf_connect_disc_entry(nvme_host_t h, struct nvmf_disc_log_entry *e, - const struct nvme_fabrics_config *defcfg, + const struct nvme_fabrics_config *cfg, bool *discover) { - struct nvme_fabrics_config cfg = { 0 }; const char *transport; char *traddr = NULL, *trsvcid = NULL; nvme_ctrl_t c; + bool disable_sqflow = false; int ret; - memcpy(&cfg, defcfg, sizeof(cfg)); switch (e->subtype) { case NVME_NQN_DISC: if (discover) @@ -364,25 +393,24 @@ nvme_ctrl_t nvmf_connect_disc_entry(nvme_host_t h, } transport = nvmf_trtype_str(e->trtype); - c = nvme_create_ctrl(e->subnqn, transport, traddr, - NULL, trsvcid); + c = nvme_create_ctrl(e->subnqn, transport, traddr, NULL, trsvcid); if (!c) { errno = ENOMEM; return NULL; } if (e->treq & NVMF_TREQ_DISABLE_SQFLOW) - cfg.disable_sqflow = true; + disable_sqflow = true; - ret = nvmf_add_ctrl(h, c, &cfg); + ret = nvmf_add_ctrl(h, c, cfg, disable_sqflow); if (!ret) return c; - if (errno == EINVAL && cfg.disable_sqflow) { + if (errno == EINVAL && disable_sqflow) { errno = 0; /* disable_sqflow is unrecognized option on older kernels */ - cfg.disable_sqflow = false; - ret = nvmf_add_ctrl(h, c, &cfg); + disable_sqflow = false; + ret = nvmf_add_ctrl(h, c, cfg, disable_sqflow); if (!ret) return c; } diff --git a/src/nvme/fabrics.h b/src/nvme/fabrics.h index cfab4b51..c130339b 100644 --- a/src/nvme/fabrics.h +++ b/src/nvme/fabrics.h @@ -118,18 +118,20 @@ const char *nvmf_cms_str(__u8 cms); * * Return: */ -int nvmf_add_ctrl_opts(nvme_ctrl_t c, const struct nvme_fabrics_config *cfg); +int nvmf_add_ctrl_opts(nvme_ctrl_t c, struct nvme_fabrics_config *cfg); /** * nvmf_add_ctrl() - * @h: * @c: * @cfg: + * @disable_sqflow: * * Return: */ int nvmf_add_ctrl(nvme_host_t h, nvme_ctrl_t c, - const struct nvme_fabrics_config *cfg); + const struct nvme_fabrics_config *cfg, + bool disable_sqflow); /** * nvmf_get_discovery_log() - diff --git a/src/nvme/tree.c b/src/nvme/tree.c index 5643075f..5805b447 100644 --- a/src/nvme/tree.c +++ b/src/nvme/tree.c @@ -105,6 +105,7 @@ struct nvme_ctrl { char *traddr; char *trsvcid; char *host_traddr; + struct nvme_fabrics_config cfg; }; struct nvme_subsystem { @@ -681,6 +682,16 @@ const char *nvme_ctrl_get_hostid(nvme_ctrl_t c) return c->s->h->hostid; } +struct nvme_fabrics_config *nvme_ctrl_get_config(nvme_ctrl_t c) +{ + return &c->cfg; +} + +void nvme_ctrl_disable_sqflow(nvme_ctrl_t c, bool disable_sqflow) +{ + c->cfg.disable_sqflow = disable_sqflow; +} + int nvme_ctrl_identify(nvme_ctrl_t c, struct nvme_id_ctrl *id) { return nvme_identify_ctrl(nvme_ctrl_get_fd(c), id); @@ -789,6 +800,7 @@ struct nvme_ctrl *nvme_create_ctrl(const char *subsysnqn, return NULL; c = calloc(1, sizeof(*c)); c->fd = -1; + c->cfg.tos = -1; list_head_init(&c->namespaces); list_head_init(&c->paths); list_node_init(&c->entry); diff --git a/src/nvme/tree.h b/src/nvme/tree.h index f27daa43..419bfeba 100644 --- a/src/nvme/tree.h +++ b/src/nvme/tree.h @@ -783,6 +783,23 @@ const char *nvme_ctrl_get_trsvcid(nvme_ctrl_t c); */ const char *nvme_ctrl_get_host_traddr(nvme_ctrl_t c); +/** + * nvme_ctrl_get_config() - + * @c: + * + * Return: + */ +struct nvme_fabrics_config *nvme_ctrl_get_config(nvme_ctrl_t c); + +/** + * nvme_ctrl_disable_sqflow() - + * @c: + * @disable_sqflow: + * + * Return: + */ +void nvme_ctrl_disable_sqflow(nvme_ctrl_t c, bool disable_sqflow); + /** * nvme_ctrl_identify() - * @c: