git: 350c1232a57a - main - nvmecontrol: telemetry-log --verbose

From: Warner Losh <imp_at_FreeBSD.org>
Date: Mon, 02 Feb 2026 13:31:25 UTC
The branch main has been updated by imp:

URL: https://cgit.FreeBSD.org/src/commit/?id=350c1232a57a64b955a3ae7f9b92dde164d1eb65

commit 350c1232a57a64b955a3ae7f9b92dde164d1eb65
Author:     Warner Losh <imp@FreeBSD.org>
AuthorDate: 2026-02-02 13:30:28 +0000
Commit:     Warner Losh <imp@FreeBSD.org>
CommitDate: 2026-02-02 13:31:21 +0000

    nvmecontrol: telemetry-log --verbose
    
    Add -v / --verbose to report status report since these things can take
    minutes to retrieve.
    
    Sponsored by:           Netflix
    Differential Revision:  https://reviews.freebsd.org/D55019
---
 sbin/nvmecontrol/nvmecontrol.8 |  6 +++++-
 sbin/nvmecontrol/telemetry.c   | 24 +++++++++++++++++++++---
 2 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/sbin/nvmecontrol/nvmecontrol.8 b/sbin/nvmecontrol/nvmecontrol.8
index dc757bcf90c3..61574715a26c 100644
--- a/sbin/nvmecontrol/nvmecontrol.8
+++ b/sbin/nvmecontrol/nvmecontrol.8
@@ -33,7 +33,7 @@
 .\"
 .\" Author: Jim Harris <jimharris@FreeBSD.org>
 .\"
-.Dd July 9, 2025
+.Dd January 31, 2026
 .Dt NVMECONTROL 8
 .Os
 .Sh NAME
@@ -256,6 +256,7 @@
 .Ic telemetry-log
 .Fl O Ar output-file
 .Op Fl d Ar data-area
+.Op Fl v
 .Aq Ar device-id
 .Sh DESCRIPTION
 NVM Express (NVMe) is a storage protocol standard for SSDs and other
@@ -875,6 +876,9 @@ Output file for the data.
 This parameter is mandatory.
 .It Fl d Ar data-area
 The data area is either 1, 2 or 3.
+.It Fl v
+Verbose output reporing progress.
+This log can be quite large and take minutes to retrieve.
 .El
 .Sh DEVICE NAMES
 Where
diff --git a/sbin/nvmecontrol/telemetry.c b/sbin/nvmecontrol/telemetry.c
index c22d53ecdfed..60bd3e025f3d 100644
--- a/sbin/nvmecontrol/telemetry.c
+++ b/sbin/nvmecontrol/telemetry.c
@@ -51,6 +51,7 @@ static struct options {
 	const char *outfn;
 	const char *dev;
 	uint8_t da;
+	bool verbose;
 } opt = {
 	.outfn = NULL,
 	.dev = NULL,
@@ -63,6 +64,8 @@ static const struct opts telemetry_log_opts[] = {
 	    "output file for telemetry data"),
 	OPT("data-area", 'd', arg_uint8, opt, da,
 	    "output file for telemetry data"),
+	OPT("verbose", 'v', arg_none, opt, verbose,
+	    "Be verbose about process"),
 	{ NULL, 0, arg_none, NULL, NULL }
 };
 #undef OPT
@@ -96,7 +99,7 @@ telemetry_log(const struct cmd *f, int argc, char *argv[])
 	int				fd, fdout;
 	char				*path;
 	uint32_t			nsid;
-	ssize_t				size;
+	ssize_t				size, blocks;
 	uint64_t			off;
 	ssize_t				chunk;
 	struct nvme_controller_data	cdata;
@@ -151,13 +154,23 @@ telemetry_log(const struct cmd *f, int argc, char *argv[])
 	default:
 		errx(EX_USAGE, "Impossible data area %d", opt.da);
 	}
-	size = (size + 1) * 512; /* The count of additional pages */
+	blocks = size + 1;
+	size = blocks * 512; /* The count of additional pages */
 	chunk = 4096;
 
-	printf("Extracting %llu bytes\n", (unsigned long long)size);
+	if (opt.verbose)
+		printf("Extracting %llu bytes %llu blocks\n", (unsigned long long)size,
+		    (unsigned long long)size / 512);
+	else
+		printf("Extracting %llu bytes\n", (unsigned long long)size);
 	do {
 		if (chunk > size)
 			chunk = size;
+		if (opt.verbose && off % 10240 == 0) {
+			printf("%s: %llu / %llu\r", opt.dev, (unsigned long long)off / 512,
+			    (unsigned long long)blocks);
+			fflush(stdout);
+		}
 		read_logpage(fd, NVME_LOG_TELEMETRY_HOST_INITIATED, nsid, 0, 0, true,
 		    off, 0, 0, 0, &buf, chunk);
 		if (write(fdout, &buf, chunk) != chunk)
@@ -165,6 +178,11 @@ telemetry_log(const struct cmd *f, int argc, char *argv[])
 		off += chunk;
 		size -= chunk;
 	} while (size > 0);
+	if (opt.verbose) {
+		printf("%s: %llu / %llu\n", opt.dev, (unsigned long long)off / 512,
+		    (unsigned long long)blocks);
+		fflush(stdout);
+	}
 
 	close(fdout);
 	close(fd);