* [PATCH v2 0/1] avoid failing to load modules after upgrades @ 2020-03-10 14:58 Christian Ehrhardt 2020-03-10 14:58 ` [PATCH v2 1/1] modules: load modules from versioned /var/run dir Christian Ehrhardt 0 siblings, 1 reply; 4+ messages in thread From: Christian Ehrhardt @ 2020-03-10 14:58 UTC (permalink / raw) To: qemu-devel Cc: Daniel P . Berrangé, Christian Ehrhardt, pkg-qemu-devel, Cole Robinson, Paolo Bonzini, Miroslav Rezanina Hi, this is a continuation of a discussion at KVM Forum eventually becoming [1] and the v1 of the patch [2]. Overall it is about qemu providing some way for distribution packaging to allow loading shared objects for a qemu binary that was upgraded. I also refreshed the qemu test build for Ubuntu [3] and have started a libvirt change [4] to allow to read from there through apparmor protection. Upstreaming of that will follow once we agree and merge the qemu change. Updates since v1: - make the feature configurable and default off [1]: https://lists.gnu.org/archive/html/qemu-devel/2019-11/msg00005.html [2]: https://lists.nongnu.org/archive/html/qemu-devel/2020-03/msg01593.html [3]: https://launchpad.net/~ci-train-ppa-service/+archive/ubuntu/3961 [4]: https://code.launchpad.net/~paelzer/ubuntu/+source/libvirt/+git/libvirt/+merge/380469 Christian Ehrhardt (1): modules: load modules from versioned /var/run dir configure | 15 +++++++++++++++ util/module.c | 14 ++++++++++++++ 2 files changed, 29 insertions(+) -- 2.25.1 ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v2 1/1] modules: load modules from versioned /var/run dir 2020-03-10 14:58 [PATCH v2 0/1] avoid failing to load modules after upgrades Christian Ehrhardt @ 2020-03-10 14:58 ` Christian Ehrhardt 2020-03-10 15:47 ` Daniel P. Berrangé 0 siblings, 1 reply; 4+ messages in thread From: Christian Ehrhardt @ 2020-03-10 14:58 UTC (permalink / raw) To: qemu-devel Cc: Daniel P . Berrangé, Christian Ehrhardt, pkg-qemu-devel, Cole Robinson, Paolo Bonzini, Miroslav Rezanina On upgrades the old .so files usually are replaced. But on the other hand since a qemu process represents a guest instance it is usually kept around. That makes late addition of dynamic features e.g. 'hot-attach of a ceph disk' fail by trying to load a new version of e.f. block-rbd.so into an old still running qemu binary. This adds a fallback to also load modules from a versioned directory in the temporary /var/run path. That way qemu is providing a way for packaging to store modules of an upgraded qemu package as needed until the next reboot. An example how that can then be used in packaging can be seen in: https://git.launchpad.net/~paelzer/ubuntu/+source/qemu/log/?h=bug-1847361-miss-old-so-on-upgrade-UBUNTU Fixes: https://bugs.launchpad.net/ubuntu/+source/qemu/+bug/1847361 Signed-off-by: Christian Ehrhardt <christian.ehrhardt@canonical.com> --- configure | 15 +++++++++++++++ util/module.c | 14 ++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/configure b/configure index cbf864bff1..5911bf1a82 100755 --- a/configure +++ b/configure @@ -405,6 +405,7 @@ EXESUF="" DSOSUF=".so" LDFLAGS_SHARED="-shared" modules="no" +module_upgrades="no" prefix="/usr/local" mandir="\${prefix}/share/man" datadir="\${prefix}/share" @@ -1032,6 +1033,10 @@ for opt do --disable-modules) modules="no" ;; + --disable-module-upgrades) module_upgrades="no" + ;; + --enable-module-upgrades) module_upgrades="yes" + ;; --cpu=*) ;; --target-list=*) target_list="$optarg" @@ -1786,6 +1791,7 @@ disabled with --disable-FEATURE, default is enabled if available: guest-agent-msi build guest agent Windows MSI installation package pie Position Independent Executables modules modules support (non-Windows) + module-upgrades try to load modules from alternate paths for upgrades debug-tcg TCG debugging (default is disabled) debug-info debugging information sparse sparse checker @@ -2049,6 +2055,11 @@ if test "$modules" = "yes" && test "$mingw32" = "yes" ; then error_exit "Modules are not available for Windows" fi +# module_upgrades is only reasonable if modules are enabled +if test "$modules" = "no" && test "$module_upgrades" = "yes" ; then + error_exit "Can't enable module-upgrades as Modules are not enabled" +fi + # Static linking is not possible with modules or PIE if test "$static" = "yes" ; then if test "$modules" = "yes" ; then @@ -6584,6 +6595,7 @@ if test "$slirp" != "no" ; then echo "smbd $smbd" fi echo "module support $modules" +echo "alt path mod load $module_upgrades" echo "host CPU $cpu" echo "host big endian $bigendian" echo "target list $target_list" @@ -6937,6 +6949,9 @@ if test "$modules" = "yes"; then echo "CONFIG_STAMP=_$( (echo $qemu_version; echo $pkgversion; cat $0) | $shacmd - | cut -f1 -d\ )" >> $config_host_mak echo "CONFIG_MODULES=y" >> $config_host_mak fi +if test "$module_upgrades" = "yes"; then + echo "CONFIG_MODULE_UPGRADES=y" >> $config_host_mak +fi if test "$have_x11" = "yes" && test "$need_x11" = "yes"; then echo "CONFIG_X11=y" >> $config_host_mak echo "X11_CFLAGS=$x11_cflags" >> $config_host_mak diff --git a/util/module.c b/util/module.c index 236a7bb52a..5f7896870a 100644 --- a/util/module.c +++ b/util/module.c @@ -19,6 +19,9 @@ #endif #include "qemu/queue.h" #include "qemu/module.h" +#ifdef CONFIG_MODULE_UPGRADES +#include "qemu-version.h" +#endif typedef struct ModuleEntry { @@ -170,6 +173,9 @@ bool module_load_one(const char *prefix, const char *lib_name) #ifdef CONFIG_MODULES char *fname = NULL; char *exec_dir; +#ifdef CONFIG_MODULE_UPGRADES + char *version_dir; +#endif const char *search_dir; char *dirs[4]; char *module_name; @@ -201,6 +207,14 @@ bool module_load_one(const char *prefix, const char *lib_name) dirs[n_dirs++] = g_strdup_printf("%s", CONFIG_QEMU_MODDIR); dirs[n_dirs++] = g_strdup_printf("%s/..", exec_dir ? : ""); dirs[n_dirs++] = g_strdup_printf("%s", exec_dir ? : ""); + +#ifdef CONFIG_MODULE_UPGRADES + version_dir = g_strcanon(g_strdup(QEMU_PKGVERSION), + G_CSET_A_2_Z G_CSET_a_2_z G_CSET_DIGITS "+-.~", + '_'); + dirs[n_dirs++] = g_strdup_printf("/var/run/qemu/%s", version_dir); +#endif + assert(n_dirs <= ARRAY_SIZE(dirs)); g_free(exec_dir); -- 2.25.1 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v2 1/1] modules: load modules from versioned /var/run dir 2020-03-10 14:58 ` [PATCH v2 1/1] modules: load modules from versioned /var/run dir Christian Ehrhardt @ 2020-03-10 15:47 ` Daniel P. Berrangé 2020-03-11 18:33 ` Paolo Bonzini 0 siblings, 1 reply; 4+ messages in thread From: Daniel P. Berrangé @ 2020-03-10 15:47 UTC (permalink / raw) To: Christian Ehrhardt Cc: Paolo Bonzini, Miroslav Rezanina, Cole Robinson, qemu-devel, pkg-qemu-devel On Tue, Mar 10, 2020 at 03:58:06PM +0100, Christian Ehrhardt wrote: > On upgrades the old .so files usually are replaced. But on the other > hand since a qemu process represents a guest instance it is usually kept > around. > > That makes late addition of dynamic features e.g. 'hot-attach of a ceph > disk' fail by trying to load a new version of e.f. block-rbd.so into an > old still running qemu binary. > > This adds a fallback to also load modules from a versioned directory in the > temporary /var/run path. That way qemu is providing a way for packaging > to store modules of an upgraded qemu package as needed until the next reboot. > > An example how that can then be used in packaging can be seen in: > https://git.launchpad.net/~paelzer/ubuntu/+source/qemu/log/?h=bug-1847361-miss-old-so-on-upgrade-UBUNTU > > Fixes: https://bugs.launchpad.net/ubuntu/+source/qemu/+bug/1847361 > Signed-off-by: Christian Ehrhardt <christian.ehrhardt@canonical.com> > --- > configure | 15 +++++++++++++++ > util/module.c | 14 ++++++++++++++ > 2 files changed, 29 insertions(+) Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :| ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v2 1/1] modules: load modules from versioned /var/run dir 2020-03-10 15:47 ` Daniel P. Berrangé @ 2020-03-11 18:33 ` Paolo Bonzini 0 siblings, 0 replies; 4+ messages in thread From: Paolo Bonzini @ 2020-03-11 18:33 UTC (permalink / raw) To: Daniel P. Berrangé, Christian Ehrhardt Cc: pkg-qemu-devel, Miroslav Rezanina, qemu-devel, Cole Robinson On 10/03/20 16:47, Daniel P. Berrangé wrote: > On Tue, Mar 10, 2020 at 03:58:06PM +0100, Christian Ehrhardt wrote: >> On upgrades the old .so files usually are replaced. But on the other >> hand since a qemu process represents a guest instance it is usually kept >> around. >> >> That makes late addition of dynamic features e.g. 'hot-attach of a ceph >> disk' fail by trying to load a new version of e.f. block-rbd.so into an >> old still running qemu binary. >> >> This adds a fallback to also load modules from a versioned directory in the >> temporary /var/run path. That way qemu is providing a way for packaging >> to store modules of an upgraded qemu package as needed until the next reboot. >> >> An example how that can then be used in packaging can be seen in: >> https://git.launchpad.net/~paelzer/ubuntu/+source/qemu/log/?h=bug-1847361-miss-old-so-on-upgrade-UBUNTU >> >> Fixes: https://bugs.launchpad.net/ubuntu/+source/qemu/+bug/1847361 >> Signed-off-by: Christian Ehrhardt <christian.ehrhardt@canonical.com> >> --- >> configure | 15 +++++++++++++++ >> util/module.c | 14 ++++++++++++++ >> 2 files changed, 29 insertions(+) > > Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> > > > Regards, > Daniel > Queued, thanks. Paolo ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2020-03-11 18:34 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2020-03-10 14:58 [PATCH v2 0/1] avoid failing to load modules after upgrades Christian Ehrhardt 2020-03-10 14:58 ` [PATCH v2 1/1] modules: load modules from versioned /var/run dir Christian Ehrhardt 2020-03-10 15:47 ` Daniel P. Berrangé 2020-03-11 18:33 ` Paolo Bonzini
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.