Message ID | 1489449360-14411-1-git-send-email-sstabellini@kernel.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 14/03/2017 00:55, Stefano Stabellini wrote: > CONFIG_XEN_BACKEND is currently set when the host supports Xen, > regardless of the chosen targets. As a consequence, Xen backends can be > enabled even on targets that don't support Xen. > > Fix the issue by setting CONFIG_XEN_BACKEND only for targets that > support Xen. > > Signed-off-by: Stefano Stabellini <stefano@aporeto.com> > CC: groug@kaod.org > CC: groug@kaod.org > CC: pbonzini@redhat.com > CC: peter.maydell@linaro.org > CC: rth@twiddle.net > CC: stefanha@redhat.com > --- > configure | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/configure b/configure > index 6c21975..6d8f752 100755 > --- a/configure > +++ b/configure > @@ -5442,7 +5442,6 @@ if test "$virglrenderer" = "yes" ; then > echo "VIRGL_LIBS=$virgl_libs" >> $config_host_mak > fi > if test "$xen" = "yes" ; then > - echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak > echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak > if test "$xen_pv_domain_build" = "yes" ; then > echo "CONFIG_XEN_PV_DOMAIN_BUILD=y" >> $config_host_mak > @@ -6028,6 +6027,7 @@ case "$target_name" in > i386|x86_64) > if test "$xen" = "yes" -a "$target_softmmu" = "yes" ; then > echo "CONFIG_XEN=y" >> $config_target_mak > + echo "CONFIG_XEN_BACKEND=y" >> $config_target_mak > if test "$xen_pci_passthrough" = yes; then > echo "CONFIG_XEN_PCI_PASSTHROUGH=y" >> "$config_target_mak" > fi > This messes up a bit the way xen_nic.o and friends are compiled, I think, because they are common-obj-y but they are only found when compiling in the target subdirectories. So you end up building x86_64-softmmu/../hw/net/xen_nic.o If you're unlucky, I believe this can lead to a link failure where a target is building xen_nic.o, while the other tries to link to a partially written object file. I think the files should be changed from common-obj-$(CONFIG_XEN_BACKEND) to common-obj-$(CONFIG_XEN). Then you add to Makefile: CONFIG_SOFTMMU := $(if $(filter %-softmmu,$(TARGET_DIRS)),y) CONFIG_USER_ONLY := $(if $(filter %-user,$(TARGET_DIRS)),y) +CONFIG_XEN := $(CONFIG_XEN_BACKEND) CONFIG_ALL=y -include config-all-devices.mak -include config-all-disas.mak The Makefile change ensures that they are built before descending in the target-specific directories. The Makefile.objs change ensures that Xen backends are not enabled on targets that support Xen. Paolo
On Tue, 14 Mar 2017, Paolo Bonzini wrote: > On 14/03/2017 00:55, Stefano Stabellini wrote: > > CONFIG_XEN_BACKEND is currently set when the host supports Xen, > > regardless of the chosen targets. As a consequence, Xen backends can be > > enabled even on targets that don't support Xen. > > > > Fix the issue by setting CONFIG_XEN_BACKEND only for targets that > > support Xen. > > > > Signed-off-by: Stefano Stabellini <stefano@aporeto.com> > > CC: groug@kaod.org > > CC: groug@kaod.org > > CC: pbonzini@redhat.com > > CC: peter.maydell@linaro.org > > CC: rth@twiddle.net > > CC: stefanha@redhat.com > > --- > > configure | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > diff --git a/configure b/configure > > index 6c21975..6d8f752 100755 > > --- a/configure > > +++ b/configure > > @@ -5442,7 +5442,6 @@ if test "$virglrenderer" = "yes" ; then > > echo "VIRGL_LIBS=$virgl_libs" >> $config_host_mak > > fi > > if test "$xen" = "yes" ; then > > - echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak > > echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak > > if test "$xen_pv_domain_build" = "yes" ; then > > echo "CONFIG_XEN_PV_DOMAIN_BUILD=y" >> $config_host_mak > > @@ -6028,6 +6027,7 @@ case "$target_name" in > > i386|x86_64) > > if test "$xen" = "yes" -a "$target_softmmu" = "yes" ; then > > echo "CONFIG_XEN=y" >> $config_target_mak > > + echo "CONFIG_XEN_BACKEND=y" >> $config_target_mak > > if test "$xen_pci_passthrough" = yes; then > > echo "CONFIG_XEN_PCI_PASSTHROUGH=y" >> "$config_target_mak" > > fi > > > > This messes up a bit the way xen_nic.o and friends are compiled, I > think, because they are common-obj-y but they are only found when > compiling in the target subdirectories. So you end up building > x86_64-softmmu/../hw/net/xen_nic.o > > If you're unlucky, I believe this can lead to a link failure where a > target is building xen_nic.o, while the other tries to link to a > partially written object file. > > I think the files should be changed from > common-obj-$(CONFIG_XEN_BACKEND) to common-obj-$(CONFIG_XEN). > > The Makefile.objs change ensures that Xen backends are not enabled on > targets that support Xen. Actually I thought about doing that instead of the configure change. It makes sense to me. > Then you add to Makefile: > > CONFIG_SOFTMMU := $(if $(filter %-softmmu,$(TARGET_DIRS)),y) > CONFIG_USER_ONLY := $(if $(filter %-user,$(TARGET_DIRS)),y) > +CONFIG_XEN := $(CONFIG_XEN_BACKEND) > CONFIG_ALL=y > -include config-all-devices.mak > -include config-all-disas.mak > > The Makefile change ensures that they are built before descending in the > target-specific directories. But I don't understand this. Please correct me if I am wrong, but this change looks like it would end up setting CONFIG_XEN every time that CONFIG_XEN_BACKEND is set. Without the configure change at the top, it would end up setting CONFIG_XEN whenever the host supports Xen, even for non-x86 and non-ARM targets. What am I missing?
diff --git a/configure b/configure index 6c21975..6d8f752 100755 --- a/configure +++ b/configure @@ -5442,7 +5442,6 @@ if test "$virglrenderer" = "yes" ; then echo "VIRGL_LIBS=$virgl_libs" >> $config_host_mak fi if test "$xen" = "yes" ; then - echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak if test "$xen_pv_domain_build" = "yes" ; then echo "CONFIG_XEN_PV_DOMAIN_BUILD=y" >> $config_host_mak @@ -6028,6 +6027,7 @@ case "$target_name" in i386|x86_64) if test "$xen" = "yes" -a "$target_softmmu" = "yes" ; then echo "CONFIG_XEN=y" >> $config_target_mak + echo "CONFIG_XEN_BACKEND=y" >> $config_target_mak if test "$xen_pci_passthrough" = yes; then echo "CONFIG_XEN_PCI_PASSTHROUGH=y" >> "$config_target_mak" fi
CONFIG_XEN_BACKEND is currently set when the host supports Xen, regardless of the chosen targets. As a consequence, Xen backends can be enabled even on targets that don't support Xen. Fix the issue by setting CONFIG_XEN_BACKEND only for targets that support Xen. Signed-off-by: Stefano Stabellini <stefano@aporeto.com> CC: groug@kaod.org CC: groug@kaod.org CC: pbonzini@redhat.com CC: peter.maydell@linaro.org CC: rth@twiddle.net CC: stefanha@redhat.com --- configure | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)