From mboxrd@z Thu Jan 1 00:00:00 1970 From: jsmart2021@gmail.com (James Smart) Date: Fri, 19 Jul 2019 15:52:57 -0700 Subject: [PATCH v2 02/10] nvme-cli: support persistent connections to a discovery controller In-Reply-To: <20190719225305.11397-1-jsmart2021@gmail.com> References: <20190719225305.11397-1-jsmart2021@gmail.com> Message-ID: <20190719225305.11397-3-jsmart2021@gmail.com> From: Sagi Grimberg Simply don't destroy the discovery controller after getting the log pages. Note that persistent connection to a discovery subsystem require to pass in a non-zero kato value, so if not provided we simply use a default of 30 seconds kato. Example: nvme connect-all ... --persistent Signed-off-by: Sagi Grimberg Reviewed-by: James Smart Reviewed-by: Hannes Reinecke Reviewed-by: Max Gurtovoy Reviewed-by: Minwoo Im --- fabrics.c | 15 ++++++++++++--- fabrics.h | 2 ++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/fabrics.c b/fabrics.c index 5757aaf..75dedf8 100644 --- a/fabrics.c +++ b/fabrics.c @@ -66,6 +66,7 @@ static struct config { int disable_sqflow; int hdr_digest; int data_digest; + bool persistent; } cfg = { NULL }; #define BUF_SIZE 4096 @@ -872,9 +873,11 @@ static int do_discover(char *argstr, bool connect) return -errno; ret = nvmf_get_log_page_discovery(dev_name, &log, &numrec, &status); free(dev_name); - err = remove_ctrl(instance); - if (err) - return err; + if (!cfg.persistent) { + err = remove_ctrl(instance); + if (err) + return err; + } switch (ret) { case DISC_OK: @@ -957,6 +960,9 @@ static int discover_from_conf_file(const char *desc, char *argstr, if (err) continue; + if (cfg.persistent && !cfg.keep_alive_tmo) + cfg.keep_alive_tmo = NVMF_DEF_DISC_TMO; + err = build_options(argstr, BUF_SIZE); if (err) { ret = err; @@ -999,6 +1005,7 @@ int discover(const char *desc, int argc, char **argv, bool connect) {"nr-write-queues", 'W', "LIST", CFG_INT, &cfg.nr_write_queues, required_argument, "number of write queues to use (default 0)" }, {"nr-poll-queues", 'P', "LIST", CFG_INT, &cfg.nr_poll_queues, required_argument, "number of poll queues to use (default 0)" }, {"queue-size", 'Q', "LIST", CFG_INT, &cfg.queue_size, required_argument, "number of io queue elements to use (default 128)" }, + {"persistent", 'p', "LIST", CFG_NONE, &cfg.persistent, no_argument, "persistent discovery connection" }, {NULL}, }; @@ -1013,6 +1020,8 @@ int discover(const char *desc, int argc, char **argv, bool connect) ret = discover_from_conf_file(desc, argstr, command_line_options, connect); } else { + if (cfg.persistent && !cfg.keep_alive_tmo) + cfg.keep_alive_tmo = NVMF_DEF_DISC_TMO; ret = build_options(argstr, BUF_SIZE); if (ret) goto out; diff --git a/fabrics.h b/fabrics.h index 988f3ef..7c1664b 100644 --- a/fabrics.h +++ b/fabrics.h @@ -1,6 +1,8 @@ #ifndef _DISCOVER_H #define _DISCOVER_H +#define NVMF_DEF_DISC_TMO 30 + extern int discover(const char *desc, int argc, char **argv, bool connect); extern int connect(const char *desc, int argc, char **argv); extern int disconnect(const char *desc, int argc, char **argv); -- 2.13.7