diff --git a/nvme.c b/nvme.c index 58849c5cb8..906319f514 100644 --- a/nvme.c +++ b/nvme.c @@ -191,6 +191,7 @@ const char *output_format = "Output format: normal|binary"; const char *timeout = "timeout value, in milliseconds"; const char *verbose = "Increase output verbosity"; const char *dry_run = "show command instead of sending"; +const char *delay = "iterative delay as SECS [.TENTHS]"; static const char *app_tag = "app tag for end-to-end PI"; static const char *app_tag_mask = "app tag mask for end-to-end PI"; @@ -262,6 +263,7 @@ struct nvme_config nvme_cfg = { .output_format = "normal", .output_format_ver = 1, .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .delay = 0, }; static void *mmap_registers(struct nvme_transport_handle *hdl, bool writable); @@ -10096,7 +10098,8 @@ static int show_topology_cmd(int argc, char **argv, struct command *acmd, struct }; NVME_ARGS(opts, - OPT_FMT("ranking", 'r', &cfg.ranking, ranking)); + OPT_FMT("ranking", 'r', &cfg.ranking, ranking), + OPT_DOUBLE("delay", 'd', &nvme_cfg.delay, delay)); err = argconfig_parse(argc, argv, desc, opts); if (err) @@ -11011,6 +11014,29 @@ void register_extension(struct plugin *plugin) nvme.extensions->tail = plugin; } +static bool handle_delay(int err) +{ + struct timespec ts; + double delay_f; + double delay_i; + + if (err || !nvme_cfg.delay) + return false; + + delay_f = modf(nvme_cfg.delay, &delay_i); + ts.tv_sec = delay_i; + ts.tv_nsec = delay_f * 1000000000; + err = pselect(0, NULL, NULL, NULL, &ts, NULL); + if (err < 0) + return false; + + err = system("clear"); + if (err < 0) + return false; + + return true; +} + int main(int argc, char **argv) { int err; @@ -11026,9 +11052,11 @@ int main(int argc, char **argv) if (err) return err; - err = handle_plugin(argc - 1, &argv[1], nvme.extensions); - if (err == -ENOTTY) - general_help(&builtin, NULL); + do { + err = handle_plugin(argc - 1, &argv[1], nvme.extensions); + if (err == -ENOTTY) + general_help(&builtin, NULL); + } while (handle_delay(err)); return err ? 1 : 0; } diff --git a/nvme.h b/nvme.h index 054976d1bf..88c7ac0ab5 100644 --- a/nvme.h +++ b/nvme.h @@ -59,6 +59,7 @@ struct nvme_config { bool dry_run; bool no_retries; unsigned int output_format_ver; + double delay; }; /* @@ -109,6 +110,7 @@ extern const char *output_format; extern const char *timeout; extern const char *verbose; extern const char *dry_run; +extern const char *delay; extern struct nvme_config nvme_cfg; int validate_output_format(const char *format, nvme_print_flags_t *flags);