From: Andrey Drobyshev <andrey.drobyshev@virtuozzo.com>
To: qemu-devel@nongnu.org
Cc: kwolf@redhat.com, peterx@redhat.com, stefanha@redhat.com,
vsementsov@yandex-team.ru, den@virtuozzo.com,
andrey.drobyshev@virtuozzo.com
Subject: [PATCH v2 3/4] scripts/qemugdb: timers: Improve 'qemu timers' command readability
Date: Tue, 2 Dec 2025 18:31:18 +0200 [thread overview]
Message-ID: <20251202163119.363969-4-andrey.drobyshev@virtuozzo.com> (raw)
In-Reply-To: <20251202163119.363969-1-andrey.drobyshev@virtuozzo.com>
* Add the 'attributes' field from QEMUTimer;
* Stringify the field's value in accordance with macros from
include/qemu/timer.h;
* Make timer expiration times human-readable by converting from nanoseconds
to appropriate units (ms/s/min/hrs/days) and showing the scale factor
(ns/us/ms/s).
Signed-off-by: Andrey Drobyshev <andrey.drobyshev@virtuozzo.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
scripts/qemugdb/timers.py | 49 +++++++++++++++++++++++++++++++++++----
1 file changed, 44 insertions(+), 5 deletions(-)
diff --git a/scripts/qemugdb/timers.py b/scripts/qemugdb/timers.py
index 1219a96b32..916c71b74a 100644
--- a/scripts/qemugdb/timers.py
+++ b/scripts/qemugdb/timers.py
@@ -21,14 +21,53 @@ def __init__(self):
gdb.Command.__init__(self, 'qemu timers', gdb.COMMAND_DATA,
gdb.COMPLETE_NONE)
+ def _format_expire_time(self, expire_time, scale):
+ "Return human-readable expiry time (ns) with scale info."
+ secs = expire_time / 1e9
+
+ # Select unit and compute value
+ if secs < 1:
+ val, unit = secs * 1000, "ms"
+ elif secs < 60:
+ val, unit = secs, "s"
+ elif secs < 3600:
+ val, unit = secs / 60, "min"
+ elif secs < 86400:
+ val, unit = secs / 3600, "hrs"
+ else:
+ val, unit = secs / 86400, "days"
+
+ scale_map = {1: "ns", 1000: "us", 1000000: "ms",
+ 1000000000: "s"}
+ scale_str = scale_map.get(scale, f"scale={scale}")
+ return f"{val:.2f} {unit} [{scale_str}]"
+
+ def _format_attribute(self, attr):
+ "Given QEMUTimer attributes value, return a human-readable string"
+
+ # From include/qemu/timer.h
+ if attr == 0:
+ value = 'NONE'
+ elif attr == 1 << 0:
+ value = 'ATTR_EXTERNAL'
+ elif attr == int(0xffffffff):
+ value = 'ATTR_ALL'
+ else:
+ value = 'UNKNOWN'
+ return f'{attr} <{value}>'
+
def dump_timers(self, timer):
"Follow a timer and recursively dump each one in the list."
# timer should be of type QemuTimer
- gdb.write(" timer %s/%s (cb:%s,opq:%s)\n" % (
- timer['expire_time'],
- timer['scale'],
- timer['cb'],
- timer['opaque']))
+ scale = int(timer['scale'])
+ expire_time = int(timer['expire_time'])
+ attributes = int(timer['attributes'])
+
+ time_str = self._format_expire_time(expire_time, scale)
+ attr_str = self._format_attribute(attributes)
+
+ gdb.write(f" timer at {time_str} (attr:{attr_str}, "
+ f"cb:{timer['cb']}, opq:{timer['opaque']})\n")
if int(timer['next']) > 0:
self.dump_timers(timer['next'])
--
2.43.5
next prev parent reply other threads:[~2025-12-02 16:33 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-12-02 16:31 [PATCH v2 0/4] Fixes and improvements for scripts/qemugdb commands Andrey Drobyshev
2025-12-02 16:31 ` [PATCH v2 1/4] scripts/qemugdb: mtree: Fix OverflowError in mtree with 128-bit addresses Andrey Drobyshev
2025-12-02 16:31 ` [PATCH v2 2/4] scripts/qemugdb: timers: Fix KeyError in 'qemu timers' command Andrey Drobyshev
2025-12-02 16:31 ` Andrey Drobyshev [this message]
2025-12-02 16:31 ` [PATCH v2 4/4] scripts/qemugdb: coroutine: Add option for obtaining detailed trace in coredump Andrey Drobyshev
2025-12-02 19:30 ` Stefan Hajnoczi
2025-12-03 9:39 ` Andrey Drobyshev
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20251202163119.363969-4-andrey.drobyshev@virtuozzo.com \
--to=andrey.drobyshev@virtuozzo.com \
--cc=den@virtuozzo.com \
--cc=kwolf@redhat.com \
--cc=peterx@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
--cc=vsementsov@yandex-team.ru \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).