Mirror of the lttng-dev mailing list
 help / color / mirror / Atom feed
* [ltt-dev] UST use case: Tracing QEMU/KVM
@ 2010-05-23 19:54 Stefan Hajnoczi
  2010-05-24  3:57 ` Pierre-Marc Fournier
  0 siblings, 1 reply; 10+ messages in thread
From: Stefan Hajnoczi @ 2010-05-23 19:54 UTC (permalink / raw)


Here is feedback from adding UST tracing to QEMU/KVM.  Hopefully this
will be useful to developers and maybe I can learn a more about LTTng
UST from discussing hurdles I encountered.

The architecture of UST looks good: pure userspace tracing support,
tracepoints can be enumerated, enabled, and disabled at runtime.  The
manual at http://lttng.org/files/ust/manual/ust.html is a nice
quickstart although I suspect it only scratches the surface.

One note about the manual: the TP_PROTO() versus TPPROTO() change was
confusing.  Perhaps a note can be added to the manual that ust.git
uses TP_PROTO() but libust 0.4 uses TPPROTO()?

When running the instrumented binary, the listener thread outputs
noisy error messages:
libust[28133/28134]: Error: poll: Interrupted system call (in
multipoll_poll() at ../libustcomm/multipoll.c:84)
libust[28133/28134]: Error: error in multipoll_poll (in
listener_main() at tracectl.c:1015)

Strace shows:
poll([{fd=3, events=POLLIN}], 1, -1)    = ? ERESTART_RESTARTBLOCK (To
be restarted)
restart_syscall(<... resuming interrupted call ...>) = ?
ERESTART_RESTARTBLOCK (To be restarted)

Finally, I had to add #undefs to get QEMU to build after including UST
headers.  Unfortunately the UST headers include headers that pollute
the (macro) namespace.

Any thoughts on these issues?

My patch enabling UST sent to the QEMU mailing list:
http://www.mail-archive.com/kvm at vger.kernel.org/msg34830.html

Stefan



^ permalink raw reply	[flat|nested] 10+ messages in thread
* [ltt-dev] UST use case: Tracing QEMU/KVM
@ 2010-05-24  8:41 Stefan Hajnoczi
  2010-05-27 16:08 ` Pierre-Marc Fournier
  0 siblings, 1 reply; 10+ messages in thread
From: Stefan Hajnoczi @ 2010-05-24  8:41 UTC (permalink / raw)


/*
 * This example demonstrates the UST listener thread receiving signals and
 * returning from poll().
 *
 * $ gcc -o poll_eintr poll_eintr.c -lust -lpthread
 * $ ./poll_eintr
 * main thread id=0x7f9c31a766a0
 * ^CSIGINT handled in thread id=0x7f9c30ed7910
 * libust[2615/2616]: Error: poll: Interrupted system call (in multipoll_poll() at ../libustcomm/multipoll.c:84)
 * libust[2615/2616]: Error: error in multipoll_poll (in listener_main() at tracectl.c:1015)
 *
 * This happens because all other threads have SIGINT blocked, whereas libust
 * does not block signals in the client thread.  Therefore the signal is
 * handled in the client thread, poll() is interrupted, and an error is
 * printed.
 *
 * I think the correct behavior is to block signals in the client thread so it
 * will not interfere with signal handling of the main program.
 */

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <pthread.h>

static void sigint_handler(int signo)
{
	fprintf(stderr, "SIGINT handled in thread id=0x%lx\n", pthread_self());
}

int main(int argc, char **argv)
{
	sigset_t newmask;

	fprintf(stderr, "main thread id=0x%lx\n", pthread_self());

	/* Block SIGINT in this thread */
	sigemptyset(&newmask);
	sigaddset(&newmask, SIGINT);
	pthread_sigmask(SIG_SETMASK, &newmask, NULL);

	/* Set up a handler for SIGINT */
	signal(SIGINT, sigint_handler);

	/* Now wait for signals, the UST listener thread will receive it */
	for (;;) {
		pause();
		fprintf(stderr, "pause returned in main thread\n");
	}
	return 0;
}




^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2010-05-27 20:26 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-05-23 19:54 [ltt-dev] UST use case: Tracing QEMU/KVM Stefan Hajnoczi
2010-05-24  3:57 ` Pierre-Marc Fournier
2010-05-24  9:00   ` Stefan Hajnoczi
2010-05-26 22:46     ` Pierre-Marc Fournier
2010-05-27  5:21       ` Stefan Hajnoczi
2010-05-27 19:36         ` Pierre-Marc Fournier
2010-05-27 20:22           ` Stefan Hajnoczi
2010-05-27 20:26             ` Mathieu Desnoyers
2010-05-24  8:41 Stefan Hajnoczi
2010-05-27 16:08 ` Pierre-Marc Fournier

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox