[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v3 1/6] hypertrace: Add documentation
From: |
Daniel P. Berrange |
Subject: |
Re: [Qemu-devel] [PATCH v3 1/6] hypertrace: Add documentation |
Date: |
Wed, 28 Sep 2016 14:14:52 +0100 |
User-agent: |
Mutt/1.7.0 (2016-08-17) |
On Wed, Sep 28, 2016 at 03:05:36PM +0200, Lluís Vilanova wrote:
> Signed-off-by: Lluís Vilanova <address@hidden>
> ---
> docs/hypertrace.txt | 232
> +++++++++++++++++++++++++++++++++++++++++++++++++++
> docs/tracing.txt | 3 +
> 2 files changed, 235 insertions(+)
> create mode 100644 docs/hypertrace.txt
> +== Quick guide ==
> +
> +This shows an example of using the hypertrace channel to trace the guest
> memory
> +accesses only in a specific guest code region, which is identified by calls
> to
> +the hypertrace channel.
> +
> +We are going to trace memory accesses to disk using QEMU's "log" backend, and
> +will use QEMU's "dtrace" (SystemTap) backend to ensure memory accesses are
> only
> +traced in the guest code region of interest. The first time the guest code
> +invokes the hypertrace channel, we will start tracing the
> +"guest_mem_before_exec" event using dtrace, and then will disable it the
> second
> +time around.
> +
> +Tracing is done with "log" because it is more efficient than using "dtrace"
> in
> +high-volume events like memory accesses. If the event rate is low, you can
> +ignore the "log" backend and simply use "dtrace"'s printf, while still using
> the
> +hypertrace events to identify guest semantics.
> +
> +1. Set the tracing backends and number of arguments for the hypertrace
> events:
> +
> + mkdir /tmp/qemu-build
> + cd /tmp/qemu-build
> + /path/to/qemu-source/configure \
> + --enable-trace-backends=dtrace,log \
> + --with-hypertrace-args=4 \
> + --prefix=/tmp/qemu-install
> + make -j install
> +
> +2. Enable the event "guest_mem_before_exec":
> +
> + sed -i -e 's/disable vcpu tcg guest_mem_before/vcpu tcg
> guest_mem_before/g' /path/to/qemu-source/trace-events
> +
> +3. Compile the guest support code:
> +
> + make -C /tmp/qemu-build/x86_64-linux-user/hypertrace/guest/user
> + make -C /tmp/qemu-build/x86_64-softmmu/hypertrace/guest/user
> + make -C /tmp/qemu-build/x86_64-softmmu/hypertrace/guest/linux-module
> +
> + If you need to cross-compile the guest library, set the 'CC' variable:
> +
> + make -C /tmp/qemu-build/mipsel-linux-user/hypertrace/guest/user
> CC=mipsel-gnu-linux-gcc
> +
> +3. Create a guest application using "qemu-hypertrace.h" to interact with the
> + hypertrace channel:
> +
> + cat > /tmp/my-hypertrace.c <<\EOF
> + #include <stdio.h>
> + #include <errno.h>
> + #include <stdlib.h>
> + #include <string.h>
> + #include <qemu-hypertrace.h>
> +
> +
> + int main(int argc, char **argv)
> + {
> + char *base = NULL;
> + if (argc > 1) {
> + base = argv[1];
> + }
> +
> + /* In 'user' mode this path must be the same we will use to start
> QEMU. */
> + if (qemu_hypertrace_init(base) != 0) {
> + perror("error: qemu_hypertrace_init");
> + abort();
> + }
> +
> + /* Set additional event arguments */
> + uint64_t client = 0;
IIUC, 'client' is the field that the host uses to distinguish
between different guest applications or different guest threads.
How are applications expected to assign themselves a unique
value for this field ?
It feels that life would be easier if you made this field be
128-bits instead of 64-bit, as then you could encode a UUID
in it, making it much easier to guarnatee uniqueness without
having to have a central authority.
> + uint64_t *data = qemu_hypertrace_data(client);
> + data[0] = 0xcafe;
> + data[1] = 0xdead;
> + data[2] = 0xbeef;
> +
> + /* Emit event to start tracing */
> + qemu_hypertrace(client, 1);
> +
> + /* Computation in between */
> + printf("Some computation...\n");
> +
> + /* Emit event to stop tracing */
> + qemu_hypertrace(client, 0);
> + }
> + EOF
> +
> + gcc -o /tmp/my-hypertrace-user /tmp/my-hypertrace.c
> \
> +
> /tmp/qemu-build/x86_64-linux-user/hypertrace/guest/user/libqemu-hypertrace-guest.a
> \
> + -I/tmp/qemu-install/include -lpthread
> +
> + gcc -o /tmp/my-hypertrace-softmmu /tmp/my-hypertrace.c
> \
> +
> /tmp/qemu-build/x86_64-softmmu/hypertrace/guest/user/libqemu-hypertrace-guest.a
> \
> + -I/tmp/qemu-install/include -lpthread
Regards,
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://entangle-photo.org -o- http://search.cpan.org/~danberr/ :|
- [Qemu-devel] [PATCH v3 0/6] hypertrace: Lightweight guest-to-QEMU trace channel, Lluís Vilanova, 2016/09/28
- [Qemu-devel] [PATCH v3 1/6] hypertrace: Add documentation, Lluís Vilanova, 2016/09/28
- Re: [Qemu-devel] [PATCH v3 1/6] hypertrace: Add documentation,
Daniel P. Berrange <=
- [Qemu-devel] [PATCH v3 2/6] hypertrace: Add tracing event "guest_hypertrace", Lluís Vilanova, 2016/09/28
- [Qemu-devel] [PATCH v3 5/6] hypertrace: Add guest-side user-level library, Lluís Vilanova, 2016/09/28
- [Qemu-devel] [PATCH v3 3/6] hypertrace: [*-user] Add QEMU-side proxy to "guest_hypertrace" event, Lluís Vilanova, 2016/09/28
- [Qemu-devel] [PATCH v3 4/6] hypertrace: [softmmu] Add QEMU-side proxy to "guest_hypertrace" event, Lluís Vilanova, 2016/09/28
- [Qemu-devel] [PATCH v3 6/6] hypertrace: Add guest-side Linux module, Lluís Vilanova, 2016/09/28
- Re: [Qemu-devel] [PATCH v3 0/6] hypertrace: Lightweight guest-to-QEMU trace channel, no-reply, 2016/09/28