On Thu, Oct 29, 2026 at 09:35:38AM +0100, Markus Armbruster wrote:
> Daniel P. Berrangé <[email protected]> writes:
>
> > While the data recorder is designed to dump its contents in
> > response to various signals that result in a QEMU crash, it
> > is also interesting to explicitly request dump.
> >
> > This could be simply as an adhoc debugging activity, or could
> > be in response to a specific event like a guest OS panic
> > notification.
> >
> > Signed-off-by: Daniel P. Berrangé <[email protected]>
> > ---
> > MAINTAINERS | 1 +
> > qapi/meson.build | 1 +
> > qapi/qapi-schema.json | 1 +
> > qapi/tldr.json | 28 ++++++++++++++++++++++++++++
> > qemu-options.hx | 2 ++
> > util/tldr.c | 32 ++++++++++++++++++++++++++++++++
> > 6 files changed, 65 insertions(+)
> > create mode 100644 qapi/tldr.json
> >
> > diff --git a/MAINTAINERS b/MAINTAINERS
> > index 4fa68810c1e..54265d987cb 100644
> > --- a/MAINTAINERS
> > +++ b/MAINTAINERS
> > @@ -4780,3 +4780,4 @@ F: util/tldr.c
> > F: util/tldr-internal.h
> > F: include/qemu/tldr.h
> > F: tests/unit/test-util-tldr.c
> > +F: qapi/tldr.json
> > diff --git a/qapi/meson.build b/qapi/meson.build
> > index a46269b5a0c..f8aecb61284 100644
> > --- a/qapi/meson.build
> > +++ b/qapi/meson.build
> > @@ -49,6 +49,7 @@ qapi_all_modules = [
> > 'run-state',
> > 'sockets',
> > 'stats',
> > + 'tldr',
> > 'trace',
> > 'transaction',
> > 'vfio',
> > diff --git a/qapi/qapi-schema.json b/qapi/qapi-schema.json
> > index b93dd68d94c..b36777970d1 100644
> > --- a/qapi/qapi-schema.json
> > +++ b/qapi/qapi-schema.json
> > @@ -76,3 +76,4 @@
> > { 'include': 'cryptodev.json' }
> > { 'include': 'cxl.json' }
> > { 'include': 'uefi.json' }
> > +{ 'include': 'tldr.json' }
> > diff --git a/qapi/tldr.json b/qapi/tldr.json
> > new file mode 100644
> > index 00000000000..8e2b7cda324
> > --- /dev/null
> > +++ b/qapi/tldr.json
> > @@ -0,0 +1,28 @@
> > +# -*- Mode: Python -*-
> > +# vim: filetype=python
> > +# SPDX-License-Identifier: GPL-2.0-or-later
> > +
> > +##
> > +# @QTLDRDumpOptions:
> > +# Options for `tldr-dump`.
> > +#
> > +# @target: the fully qualified file path to dump
> > +# the data recorder to
>
> We're not dumping the data recorder, we're dumping recorded data.
Yes.
>
> > +#
> > +# Since: 11.2.0
> > +##
> > +{ 'struct': 'QTLDRDumpOptions',
> > + 'data': { 'target': 'str' } }
> > +
> > +##
> > +# @tldr-dump:
> > +# Dump the data recorder to a file
> > +#
> > +# Since: 11.2.0
> > +#
> > +# .. qmp-example::
> > +#
> > +# -> { "execute": "tldr-dump", "arguments": { "target":
> > "/tmp/qemu.txt" } }
> > +# <- { "return": {} }
> > +##
> > +{ 'command': 'tldr-dump', 'data': 'QTLDRDumpOptions' }
>
> Why do you use a separate type for the arguments?
Original iterations of this patch were passing
around more complex data, so this struct type
is redundant now.
> > diff --git a/util/tldr.c b/util/tldr.c
> > index 13e9881bc9b..ea7c26b8e9b 100644
> > --- a/util/tldr.c
> > +++ b/util/tldr.c
> > @@ -12,6 +12,7 @@
> > #include "qom/object.h"
> > #include "qom/object_interfaces.h"
> > #include "qapi/error.h"
> > +#include "qapi/qapi-commands-tldr.h"
> >
> > struct QTLDRConfig {
> > Object parent;
> > @@ -436,3 +437,34 @@ qtldr_crash_dump_signal(siginfo_t *si)
> > close(fd);
> > }
> > }
> > +
> > +
> > +/*
> > + * WARNING: Code below this marker provides a QMP handler
> > + * WARNING: for use in normal execution. It calls into
> > + * WARNING: the common crash report outputting APIs, but
> > + * WARNING: this specific method is not restricted to async
> > + * WARNING: signal safe POSIX functions.
> > + */
>
> Why is this a WARNING WARNING WARNING? Looks scary, then isn't.
>
> Put it elsewhere, so the comment isn't needed?
Hmm, yes, we could split the file into separate pieces for
different contexts.
>
> > +
> > +
> > +void
> > +qmp_tldr_dump(const char *target, Error **errp)
> > +{
> > + int fd;
> > +
> > + if (!qatomic_read(&qtldr_active)) {
> > + error_setg(errp, "No 'tldr-config' object has been creted");
> > + return;
> > + }
> > +
> > + fd = qemu_create(target, O_WRONLY | O_TRUNC, 0600, errp);
> > + if (fd < 0) {
> > + return;
> > + }
> > +
> > + qtldr_crash_dump_internal(fd, NULL);
> > +
> > + qemu_fdatasync(fd);
> > + close(fd);
> > +}
>
With regards,
Daniel
--
|: https://berrange.com ~~ https://hachyderm.io/@berrange :|
|: https://libvirt.org ~~ https://entangle-photo.org :|
|: https://pixelfed.art/berrange ~~ https://fstop138.berrange.com :|