Pino Toscano
2015-Jun-25 09:24 UTC
[Libguestfs] [PATCH] launch: rework handling of --enable-valgrind-daemon
Instead of forcing valgrind to be run when --enable-valgrind-daemon is passed to configure, enable it only when the backend setting "valgrind_daemon" is set. This allows developers to keep building with --enable-valgrind-daemon, which unconditionally adds valgrind in the appliance but using only when requested. When --enable-valgrind-daemon is not passed (typical for release builds), then no valgrind-related code is built at all, and "valgrind_daemon" is ignored. --- src/guestfs-internal.h | 1 + src/launch-direct.c | 4 ++++ src/launch-libvirt.c | 4 ++++ src/launch-uml.c | 14 ++++++++------ src/launch.c | 12 +++++++++--- 5 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/guestfs-internal.h b/src/guestfs-internal.h index bbd7fb4..d07b61d 100644 --- a/src/guestfs-internal.h +++ b/src/guestfs-internal.h @@ -767,6 +767,7 @@ extern void guestfs_int_print_timestamped_message (guestfs_h *g, const char *fs, extern void guestfs_int_launch_send_progress (guestfs_h *g, int perdozen); extern char *guestfs_int_appliance_command_line (guestfs_h *g, const char *appliance_dev, int flags); #define APPLIANCE_COMMAND_LINE_IS_TCG 1 +#define APPLIANCE_COMMAND_LINE_VALGRIND_DAEMON 2 const char *guestfs_int_get_cpu_model (int kvm); extern void guestfs_int_register_backend (const char *name, const struct backend_ops *); extern int guestfs_int_set_backend (guestfs_h *g, const char *method); diff --git a/src/launch-direct.c b/src/launch-direct.c index ea67ec9..f6e90da 100644 --- a/src/launch-direct.c +++ b/src/launch-direct.c @@ -630,6 +630,10 @@ launch_direct (guestfs_h *g, void *datav, const char *arg) flags = 0; if (!has_kvm || force_tcg) flags |= APPLIANCE_COMMAND_LINE_IS_TCG; +#ifdef VALGRIND_DAEMON + if (guestfs_int_get_backend_setting_bool (g, "valgrind_daemon") > 0) + flags |= APPLIANCE_COMMAND_LINE_VALGRIND_DAEMON; +#endif ADD_CMDLINE_STRING_NODUP (guestfs_int_appliance_command_line (g, appliance_dev, flags)); diff --git a/src/launch-libvirt.c b/src/launch-libvirt.c index f46782c..92f2922 100644 --- a/src/launch-libvirt.c +++ b/src/launch-libvirt.c @@ -1160,6 +1160,10 @@ construct_libvirt_xml_boot (guestfs_h *g, flags = 0; if (!params->data->is_kvm) flags |= APPLIANCE_COMMAND_LINE_IS_TCG; +#ifdef VALGRIND_DAEMON + if (guestfs_int_get_backend_setting_bool (g, "valgrind_daemon") > 0) + flags |= APPLIANCE_COMMAND_LINE_VALGRIND_DAEMON; +#endif cmdline = guestfs_int_appliance_command_line (g, params->appliance_dev, flags); start_element ("os") { diff --git a/src/launch-uml.c b/src/launch-uml.c index 785548c..1d92b5e 100644 --- a/src/launch-uml.c +++ b/src/launch-uml.c @@ -269,12 +269,14 @@ launch_uml (guestfs_h *g, void *datav, const char *arg) #if 0 /* XXX This could be made to work. */ #ifdef VALGRIND_DAEMON - /* Set up virtio-serial channel for valgrind messages. */ - ADD_CMDLINE ("-chardev"); - ADD_CMDLINE_PRINTF ("file,path=%s/valgrind.log.%d,id=valgrind", - VALGRIND_LOG_PATH, getpid ()); - ADD_CMDLINE ("-device"); - ADD_CMDLINE ("virtserialport,chardev=valgrind,name=org.libguestfs.valgrind"); + if (guestfs_int_get_backend_setting_bool (g, "valgrind_daemon") > 0) { + /* Set up virtio-serial channel for valgrind messages. */ + ADD_CMDLINE ("-chardev"); + ADD_CMDLINE_PRINTF ("file,path=%s/valgrind.log.%d,id=valgrind", + VALGRIND_LOG_PATH, getpid ()); + ADD_CMDLINE ("-device"); + ADD_CMDLINE ("virtserialport,chardev=valgrind,name=org.libguestfs.valgrind"); + } #endif #endif diff --git a/src/launch.c b/src/launch.c index fd5479e..bfc2dea 100644 --- a/src/launch.c +++ b/src/launch.c @@ -319,6 +319,9 @@ guestfs_int_appliance_command_line (guestfs_h *g, const char *appliance_dev, char *ret; bool tcg = flags & APPLIANCE_COMMAND_LINE_IS_TCG; char lpj_s[64] = ""; +#ifdef VALGRIND_DAEMON + int valgrind_daemon = flags & APPLIANCE_COMMAND_LINE_VALGRIND_DAEMON; +#endif if (appliance_dev) snprintf (root, sizeof root, " root=%s", appliance_dev); @@ -335,9 +338,6 @@ guestfs_int_appliance_command_line (guestfs_h *g, const char *appliance_dev, #ifdef __arm__ " mem=%dM" #endif -#ifdef VALGRIND_DAEMON - " guestfs_valgrind_daemon=1" -#endif #ifdef __i386__ " noapic" /* workaround for RHBZ#857026 */ #endif @@ -363,6 +363,9 @@ guestfs_int_appliance_command_line (guestfs_h *g, const char *appliance_dev, " %s" /* selinux */ "%s" /* verbose */ "%s" /* network */ +#ifdef VALGRIND_DAEMON + "%s" /* valgrind */ +#endif " TERM=%s" /* TERM environment variable */ "%s%s", /* append */ #ifdef __arm__ @@ -373,6 +376,9 @@ guestfs_int_appliance_command_line (guestfs_h *g, const char *appliance_dev, g->selinux ? "selinux=1 enforcing=0" : "selinux=0", g->verbose ? " guestfs_verbose=1" : "", g->enable_network ? " guestfs_network=1" : "", +#ifdef VALGRIND_DAEMON + valgrind_daemon ? " guestfs_valgrind_daemon=1" : "", +#endif term ? term : "linux", g->append ? " " : "", g->append ? g->append : ""); -- 2.1.0
Richard W.M. Jones
2015-Jun-25 13:50 UTC
Re: [Libguestfs] [PATCH] launch: rework handling of --enable-valgrind-daemon
We had a chat about this on IRC, and I'm not very happy about any patch that requires a special ./configure flag. We should find a way to enable this functionality for everyone in all builds, without impacting anyone who doesn't want to use it. I think: - remove the --enable-valgrind-daemon, for reasons outlined above (I posted a patch to do that yesterday) - have a new backend setting, just like you proposed, except it wouldn't be conditional on any configure setting - when (1) the backend setting is true and (2) valgrind is present in the appliance, the init script should run `valgrind guestfsd' - output from valgrind would go to stderr, where it is picked up by the normal verbose output (so we don't need a special socket) This doesn't handle the guestfsd shutdown case (but nor does the current code, which is both racy on shutdown and introduces separate shutdown paths for --enable-valgrind-daemon and ordinary configurations). But we can punt on that until later. The above would detect all memory errors except for memory leaks. Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com virt-top is 'top' for virtual machines. Tiny program with many powerful monitoring features, net stats, disk stats, logging, etc. http://people.redhat.com/~rjones/virt-top
Pino Toscano
2015-Jun-25 14:16 UTC
Re: [Libguestfs] [PATCH] launch: rework handling of --enable-valgrind-daemon
In data giovedì 25 giugno 2015 14:50:03, Richard W.M. Jones ha scritto:> We had a chat about this on IRC, and I'm not very happy about any > patch that requires a special ./configure flag.I'm not sure where you see any special ./configure flag, other than what is already there (and not used much because makes things cumbersome).> We should find a way > to enable this functionality for everyone in all builds, without > impacting anyone who doesn't want to use it. > > I think: > > - remove the --enable-valgrind-daemon, for reasons outlined above > (I posted a patch to do that yesterday) > > - have a new backend setting, just like you proposed, except it > wouldn't be conditional on any configure setting > > - when (1) the backend setting is true and (2) valgrind is present > in the appliance, the init script should run `valgrind guestfsd' > > - output from valgrind would go to stderr, where it is picked up by > the normal verbose output (so we don't need a special socket)This could be okay for me, ...> This doesn't handle the guestfsd shutdown case (but nor does the > current code, which is both racy on shutdown and introduces separate > shutdown paths for --enable-valgrind-daemon and ordinary > configurations). But we can punt on that until later. The above > would detect all memory errors except for memory leaks.... although losing the leaks detection would be a no-go for me, since that's something I've been using from time to time, even if not often. Can you expand a bit more on the parts you consider racy? Thanks, -- Pino Toscano
Maybe Matching Threads
- [PATCH v2 1/9] build: Remove ./configure --enable-valgrind-daemon.
- [PATCH] launch: direct: Add DAX root filesystem support.
- [PATCH] Enable running the daemon under valgrind.
- [PATCH] [repost] build: Remove ./configure --enable-valgrind-daemon.
- [PATCH] lib: direct: Remove support for virtio-blk as the default.