From 50ece425718c52dc9aa0cb6ba984f0c64ecbc97a Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Mon, 29 Dec 2025 16:16:12 +0900 Subject: [PATCH] nvme: add delay option for nvme top This is to monitor the system changes. Signed-off-by: Tokunori Ikegami --- nvme.c | 33 ++++++++++++++++++++++++++++++--- nvme.h | 3 +++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/nvme.c b/nvme.c index 58849c5cb8..ea125ce725 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); @@ -11011,6 +11013,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 +11051,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..f53f1b0025 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; }; /* @@ -76,6 +77,7 @@ struct nvme_config { "disable retry logic on errors\n"), \ OPT_UINT("output-format-version", 0, &nvme_cfg.output_format_ver, \ "output format version: 1|2"), \ + OPT_DOUBLE("delay", 'd', &nvme_cfg.delay, delay), \ OPT_END() \ } @@ -109,6 +111,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);