]> www.infradead.org Git - users/sagi/libnvme.git/commitdiff
tree,fabrics: per-controller configuration
authorHannes Reinecke <hare@suse.de>
Tue, 13 Apr 2021 07:28:30 +0000 (09:28 +0200)
committerHannes Reinecke <hare@suse.de>
Fri, 11 Jun 2021 10:13:13 +0000 (12:13 +0200)
Make the fabrics configuration settings per-controller and implement
nvme_ctrl_disable_sqflow().

Signed-off-by: Hannes Reinecke <hare@suse.de>
examples/discover-loop.c
src/nvme/fabrics.c
src/nvme/fabrics.h
src/nvme/tree.c
src/nvme/tree.h

index 028160912205c09a0f7df19802674037e567e838..4a8d140c00518f39e6f4f489d0b763c4be7ffc06 100644 (file)
@@ -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;
index ac5daa1ba36e48a894675105d2d131cbc22914c3..c9016ed4077f85f41dd3b1f30bdff0725cd33d5f 100644 (file)
@@ -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;
        }
index cfab4b515ff7bc623d2bc8115626ce13463cb97b..c130339b15a9b2727ccbdab2878f81ceaeebe131 100644 (file)
@@ -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() -
index 5643075fa05b8476843798b2bbad83517b77dcca..5805b44723888d69cb0bf87dc7ab39da6109f883 100644 (file)
@@ -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);
index f27daa43a72a156750dfec118f313c3b77b3bfdf..419bfeba76b5e1625a7a31d7e5bf5a1f034ef45b 100644 (file)
@@ -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: