[libvirt] [PATCH] build: fix binary location in stap files --with-driver-modules

Laine Stump laine at laine.org
Fri Aug 10 21:29:54 UTC 2012


libvirt_qemu_probes.stp stopped working after switching to a build
that used --with-driver-modules. This was because the symbols listed
int libvirt_qemu_probes.stp are no longer in $(bindir)/libvirtd, but
are now in $(libdir)/connection-driver/libvirt_driver_qemu.so.

This patch enhances dtrace2systemtap.pl (which generates the .stp
files from .d files) to look for a new "module" setting in the
comments of the .d file (similar to the existing "binary" setting),
and to look for a --with-modules option. If the --with-modules option
is set *and* a "module" setting is present in the .d file, the process
name for the stap line is set to

   $libdir/$module

If either of these isn't true, it reverts to the old behavior.

src/Makefile.am was also modified to add the --with-modules option
when the build calls for it, and src/libvirt_qemu_probes.d has added a
"module" line pointing to the correct .so file for the qemu driver.
---
 src/Makefile.am           |  7 +++++--
 src/dtrace2systemtap.pl   | 12 ++++++++++++
 src/libvirt_qemu_probes.d |  1 +
 3 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/src/Makefile.am b/src/Makefile.am
index 6ed4a41..79b4e59 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1393,6 +1393,9 @@ nodist_libvirt_la_SOURCES = libvirt_probes.h
 if WITH_REMOTE
 nodist_libvirt_driver_remote_la_SOURCES = libvirt_probes.h
 endif WITH_REMOTE
+if WITH_DRIVER_MODULES
+DTRACE2SYSTEMTAP_FLAGS = --with-modules
+endif
 
 BUILT_SOURCES += libvirt_probes.h libvirt_probes.stp libvirt_functions.stp
 
@@ -1429,9 +1432,9 @@ RPC_PROBE_FILES = $(srcdir)/rpc/virnetprotocol.x \
 libvirt_functions.stp: $(RPC_PROBE_FILES) $(srcdir)/rpc/gensystemtap.pl
 	$(AM_V_GEN)$(PERL) -w $(srcdir)/rpc/gensystemtap.pl $(RPC_PROBE_FILES) > $@
 
-%_probes.stp: %_probes.d $(srcdir)/dtrace2systemtap.pl
+%_probes.stp: %_probes.d $(srcdir)/dtrace2systemtap.pl $(top_builddir)/config.status
 	$(AM_V_GEN)$(PERL) -w $(srcdir)/dtrace2systemtap.pl \
-	  $(bindir) $(sbindir) $(libdir) $< > $@
+	  $(DTRACE2SYSTEMTAP_FLAGS) $(bindir) $(sbindir) $(libdir) $< > $@
 
 CLEANFILES += libvirt_probes.h libvirt_probes.o libvirt_probes.lo \
               libvirt_qemu_probes.h libvirt_qemu_probes.o \
diff --git a/src/dtrace2systemtap.pl b/src/dtrace2systemtap.pl
index c8d42d7..d57de68 100755
--- a/src/dtrace2systemtap.pl
+++ b/src/dtrace2systemtap.pl
@@ -31,6 +31,13 @@ my $file;
 my @files;
 my %files;
 
+my $with_modules = 0;
+if ($ARGV[0] eq "--with-modules") {
+    # set if we want to honor the "module" setting in the .d file
+    $with_modules = 1;
+    shift @ARGV;
+}
+
 my $bindir = shift @ARGV;
 my $sbindir = shift @ARGV;
 my $libdir = shift @ARGV;
@@ -54,6 +61,8 @@ while (<>) {
             $files{$file}->{prefix} = $1;
         } elsif (m,^\s*\#\s*binary:\s*(\S+)\s*$,) {
             $files{$file}->{binary} = $1;
+        } elsif (m,^\s*\#\s*module:\s*(\S+)\s*$,) {
+            $files{$file}->{module} = $1;
         } else {
             # ignore unknown comments
         }
@@ -98,6 +107,9 @@ foreach my $file (@files) {
         if (exists $files{$file}->{binary}) {
             $binary = $sbindir . "/" . $files{$file}->{binary};
         }
+        if ($with_modules && exists $files{$file}->{module}) {
+            $binary = $libdir . "/" . $files{$file}->{module};
+        }
 
         print "probe $pname = process(\"$binary\").mark(\"$name\") {\n";
 
diff --git a/src/libvirt_qemu_probes.d b/src/libvirt_qemu_probes.d
index 6916778..e4449a9 100644
--- a/src/libvirt_qemu_probes.d
+++ b/src/libvirt_qemu_probes.d
@@ -2,6 +2,7 @@ provider libvirt {
         # file: src/qemu/qemu_monitor.c
         # prefix: qemu
         # binary: libvirtd
+        # module: libvirt/connection-driver/libvirt_driver_qemu.so
         # Monitor lifecycle
         probe qemu_monitor_new(void *mon, int refs, int fd);
         probe qemu_monitor_ref(void *mon, int refs);
-- 
1.7.11.2




More information about the libvir-list mailing list