With a later patch, this will produce output like | :/ cp -v /mnt/tftp/tmp /tmp/ | [########...#########] 29138411 bytes, 127413 bytes/s Signed-off-by: Enrico Scholz <enrico.scholz@xxxxxxxxxxxxxxxxx> --- include/progress.h | 1 + lib/show_progress.c | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/include/progress.h b/include/progress.h index 7230bd3a9bd5..219d772201bf 100644 --- a/include/progress.h +++ b/include/progress.h @@ -16,6 +16,7 @@ void init_progression_bar(loff_t max); * spinner is printed. */ void show_progress(loff_t now); +void close_progress(loff_t total); extern struct notifier_head progress_notifier; diff --git a/lib/show_progress.c b/lib/show_progress.c index 1b624bcb9af8..5b42a2d74b8f 100644 --- a/lib/show_progress.c +++ b/lib/show_progress.c @@ -24,6 +24,7 @@ static loff_t printed; static loff_t progress_max; static unsigned spin; +static uint64_t start_tm; void show_progress(loff_t now) { @@ -47,11 +48,35 @@ void show_progress(loff_t now) } } +void close_progress(loff_t total) +{ + uint64_t now = get_time_ns(); + unsigned long speed; + unsigned long delta; + + if (now <= start_tm) { + pr_crit("tm mismatch"); + return; + } + + if (total < 0) + return; + + /* convert to ms and add '1' to avoid div-by-zero */ + delta = div_u64(now - start_tm, 1000000) + 1; + + /* speed is bytes/s */ + speed = div_u64(total * 1000, delta); + + printf("] %llu bytes, %lu bytes/s", (unsigned long long)total, speed); +} + void init_progression_bar(loff_t max) { printed = 0; progress_max = max; spin = 0; + start_tm = get_time_ns(); if (progress_max && progress_max != FILESIZE_MAX) printf("\t[%*s]\r\t[", HASHES_PER_LINE, ""); else -- 2.36.1