summaryrefslogtreecommitdiffstats
path: root/util/cutils.c
diff options
context:
space:
mode:
authorRichard Henderson2022-06-16 16:13:04 +0200
committerRichard Henderson2022-06-16 16:13:04 +0200
commitdef6fd6c9ce9e00a30cdd0066e0fde206b3f3d2f (patch)
treedc547432f542e829ed0e770beca1dbb13e2223ef /util/cutils.c
parentMerge tag 'block-pull-request' of https://gitlab.com/stefanha/qemu into staging (diff)
parentbuild: include pc-bios/ part in the ROMS variable (diff)
downloadqemu-def6fd6c9ce9e00a30cdd0066e0fde206b3f3d2f.tar.gz
qemu-def6fd6c9ce9e00a30cdd0066e0fde206b3f3d2f.tar.xz
qemu-def6fd6c9ce9e00a30cdd0066e0fde206b3f3d2f.zip
Merge tag 'for-upstream' of https://gitlab.com/bonzini/qemu into staging
* statistics subsystem * virtio reset cleanups * build system cleanups * fix Cirrus CI # -----BEGIN PGP SIGNATURE----- # # iQFIBAABCAAyFiEE8TM4V0tmI4mGbHaCv/vSX3jHroMFAmKpooQUHHBib256aW5p # QHJlZGhhdC5jb20ACgkQv/vSX3jHroNlFwf+OugLGRZl3KVc7akQwUJe9gg2T31h # VkC+7Tei8FAwe8vDppVd+CYEIi0M3acxD2amRrv2etCCGSuySN1PbkfRcSfPBX01 # pRWpasdhfqnZR8Iidi7YW1Ou5CcGqKH49nunBhW10+osb/mu5sVscMuOJgTDj/lK # CpsmDyk6572yGmczjNLlmhYcTU36clHpAZgazZHwk1PU+B3fCKlYYyvUpT3ItJvd # cK92aIUWrfofl3yTy0k4IwvZwNjTBirlstOIomZ333xzSA+mm5TR+mTvGRTZ69+a # v+snpMp4ILDMoB5kxQ42kK5WpdiN//LnriA9CBFDtOidsDDn8kx7gJe2RA== # =Dxwa # -----END PGP SIGNATURE----- # gpg: Signature made Wed 15 Jun 2022 02:12:36 AM PDT # gpg: using RSA key F13338574B662389866C7682BFFBD25F78C7AE83 # gpg: issuer "pbonzini@redhat.com" # gpg: Good signature from "Paolo Bonzini <bonzini@gnu.org>" [undefined] # gpg: aka "Paolo Bonzini <pbonzini@redhat.com>" [undefined] # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: 46F5 9FBD 57D6 12E7 BFD4 E2F7 7E15 100C CD36 69B1 # Subkey fingerprint: F133 3857 4B66 2389 866C 7682 BFFB D25F 78C7 AE83 * tag 'for-upstream' of https://gitlab.com/bonzini/qemu: (21 commits) build: include pc-bios/ part in the ROMS variable meson: put cross compiler info in a separate section q35:Enable TSEG only when G_SMRAME and TSEG_EN both enabled build: fix check for -fsanitize-coverage-allowlist tests/vm: allow running tests in an unconfigured source tree configure: cleanup -fno-pie detection configure: update list of preserved environment variables virtio-mmio: cleanup reset virtio: stop ioeventfd on reset virtio-mmio: stop ioeventfd on legacy reset s390x: simplify virtio_ccw_reset_virtio block: add more commands to preconfig mode hmp: add filtering of statistics by name qmp: add filtering of statistics by name hmp: add filtering of statistics by provider qmp: add filtering of statistics by provider hmp: add basic "info stats" implementation cutils: add functions for IEC and SI prefixes qmp: add filtering of statistics by target vCPU kvm: Support for querying fd-based stats ... Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Diffstat (limited to 'util/cutils.c')
-rw-r--r--util/cutils.c34
1 files changed, 25 insertions, 9 deletions
diff --git a/util/cutils.c b/util/cutils.c
index a58bcfd80e..6d04e52907 100644
--- a/util/cutils.c
+++ b/util/cutils.c
@@ -872,6 +872,25 @@ int parse_debug_env(const char *name, int max, int initial)
return debug;
}
+const char *si_prefix(unsigned int exp10)
+{
+ static const char *prefixes[] = {
+ "a", "f", "p", "n", "u", "m", "", "K", "M", "G", "T", "P", "E"
+ };
+
+ exp10 += 18;
+ assert(exp10 % 3 == 0 && exp10 / 3 < ARRAY_SIZE(prefixes));
+ return prefixes[exp10 / 3];
+}
+
+const char *iec_binary_prefix(unsigned int exp2)
+{
+ static const char *prefixes[] = { "", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei" };
+
+ assert(exp2 % 10 == 0 && exp2 / 10 < ARRAY_SIZE(prefixes));
+ return prefixes[exp2 / 10];
+}
+
/*
* Return human readable string for size @val.
* @val can be anything that uint64_t allows (no more than "16 EiB").
@@ -880,7 +899,6 @@ int parse_debug_env(const char *name, int max, int initial)
*/
char *size_to_str(uint64_t val)
{
- static const char *suffixes[] = { "", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei" };
uint64_t div;
int i;
@@ -891,25 +909,23 @@ char *size_to_str(uint64_t val)
* (see e41b509d68afb1f for more info)
*/
frexp(val / (1000.0 / 1024.0), &i);
- i = (i - 1) / 10;
- div = 1ULL << (i * 10);
+ i = (i - 1) / 10 * 10;
+ div = 1ULL << i;
- return g_strdup_printf("%0.3g %sB", (double)val / div, suffixes[i]);
+ return g_strdup_printf("%0.3g %sB", (double)val / div, iec_binary_prefix(i));
}
char *freq_to_str(uint64_t freq_hz)
{
- static const char *const suffixes[] = { "", "K", "M", "G", "T", "P", "E" };
double freq = freq_hz;
- size_t idx = 0;
+ size_t exp10 = 0;
while (freq >= 1000.0) {
freq /= 1000.0;
- idx++;
+ exp10 += 3;
}
- assert(idx < ARRAY_SIZE(suffixes));
- return g_strdup_printf("%0.3g %sHz", freq, suffixes[idx]);
+ return g_strdup_printf("%0.3g %sHz", freq, si_prefix(exp10));
}
int qemu_pstrcmp0(const char **str1, const char **str2)