[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH QEMU-XEN v3 6/8] xen: Use stable library interfaces when they are available.
In Xen 4.7 we are refactoring parts libxenctrl into a number of separate libraries which will provide backward and forward API and ABI compatiblity. Specifically libxenevtchn, libxengnttab and libxenforeignmemory. Previous patches have already laid the groundwork for using these by switching the existing compatibility shims to reflect the intefaces to these libraries. So all which remains is to update configure to detect the libraries and enable their use. Although they are notionally independent we take an all or nothing approach to the three libraries since they were added at the same time. The only non-obvious bit is that we now open a proper xenforeignmemory handle for xen_fmem instead of reusing the xen_xc handle. Build tested with 4.0, 4.5 and the patches targetting 4.7 which adds these libraries. Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx> --- configure | 98 ++++++++++++++++++++++++++++++++++++++++++++- include/hw/xen/xen_common.h | 42 ++++++++++++++++++- xen-common.c | 9 +++++ 3 files changed, 145 insertions(+), 4 deletions(-) diff --git a/configure b/configure index 779623a..508b157 100755 --- a/configure +++ b/configure @@ -1839,6 +1839,52 @@ fi # xen probe if test "$xen" != "no" ; then + xenevtchn_libs="-lxenevtchn" + + cat > $TMPC <<EOF +#include <xenevtchn.h> +int main(void) { return 0; } +EOF + if compile_prog "" "$xenevtchn_libs" ; then + xenevtchn=yes + else + xenevtchn=no + fi + + xengnttab_libs="-lxengnttab" + + cat > $TMPC <<EOF +#include <xengnttab.h> +int main(void) { return 0; } +EOF + if compile_prog "" "$xengnttab_libs" ; then + xengnttab=yes + else + xengnttab=no + fi + + xenforeignmemory_libs="-lxenforeignmemory" + + cat > $TMPC <<EOF +#include <xenforeignmemory.h> +int main(void) { return 0; } +EOF + if compile_prog "" "$xenforeignmemory_libs" ; then + xenforeignmemory=yes + else + xenforeignmemory=no + fi + + # These libraries were all introduced in the same release, to + # simplify things we therefore assume its either all or nothing and + # treat any other mix as an error + case $xenevtchn$xengnttab$xenforeignmemory in + yesyesyes) xenstablelibs=yes;; + nonono) xenstablelibs=no;; + *) error_exit "Inconsistent set of xen libraries found" + ;; + esac + xen_libs="-lxenstore -lxenctrl -lxenguest" # First we test whether Xen headers and libraries are available. @@ -1859,7 +1905,46 @@ EOF fi xen=no - # Xen unstable + # Xen unstable (with stable libs) + elif + # If we have stable libs the we don't want the libxc compat + # layers, regardless of what CFLAGS we may have been given. + test "$xenstablelibs" = "yes" && + cat > $TMPC <<EOF && +#undef XC_WANT_COMPAT_EVTCHN_API +#undef XC_WANT_COMPAT_GNTTAB_API +#undef XC_WANT_COMPAT_MAP_FOREIGN_API +#include <xenctrl.h> +#include <xenstore.h> +#include <stdint.h> +#include <xen/hvm/hvm_info_table.h> +#if !defined(HVM_MAX_VCPUS) +# error HVM_MAX_VCPUS not defined +#endif +int main(void) { + xc_interface *xc; + xs_daemon_open(); + xc = xc_interface_open(0, 0, 0); + xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0); + xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0); + xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000); + xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL); + return 0; +} +EOF + compile_prog "" "$xen_libs" + then + xen_ctrl_version=470 + xen=yes + + # Xen unstable (without stable libs) + elif + test "$xenstablelibs" = "yes" + then + # Inconsistent result, split libs but an older libxenctrl interface? + xen=no + + # Xen 4.6 elif cat > $TMPC <<EOF && #include <xenctrl.h> @@ -2037,6 +2122,11 @@ EOF fi if test "$xen" = yes; then + if test "$xenstablelibs" = yes; then + libs_softmmu="$xenevtchn_libs $libs_softmmu" + libs_softmmu="$xengnttab_libs $libs_softmmu" + libs_softmmu="$xenforeignmemory_libs $libs_softmmu" + fi libs_softmmu="$xen_libs $libs_softmmu" fi fi @@ -4337,7 +4427,8 @@ if test -n "$sparc_cpu"; then fi echo "xen support $xen" if test "$xen" = "yes" ; then - echo "xen ctrl version $xen_ctrl_version" + echo " stable libs $xenstablelibs" + echo " ctrl version $xen_ctrl_version" fi echo "brlapi support $brlapi" echo "bluez support $bluez" @@ -4670,6 +4761,9 @@ 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 "$xenstablelibs" = "yes" ; then + echo "CONFIG_XEN_STABLE_LIBS=y" >> $config_host_mak + fi fi if test "$linux_aio" = "yes" ; then echo "CONFIG_LINUX_AIO=y" >> $config_host_mak diff --git a/include/hw/xen/xen_common.h b/include/hw/xen/xen_common.h index 28f3fb1..1b824aa 100644 --- a/include/hw/xen/xen_common.h +++ b/include/hw/xen/xen_common.h @@ -6,6 +6,17 @@ #include <stddef.h> #include <inttypes.h> +#ifdef CONFIG_XEN_STABLE_LIBS +/* + * If we have new enough libxenctrl then we do not want/need these compat + * interfaces, despite what the user supplied cflags might say. They + * must be undefined before including xenctrl.h + */ +#undef XC_WANT_COMPAT_EVTCHN_API +#undef XC_WANT_COMPAT_GNTTAB_API +#undef XC_WANT_COMPAT_MAP_FOREIGN_API +#endif + #include <xenctrl.h> #if CONFIG_XEN_CTRL_INTERFACE_VERSION < 420 # include <xs.h> @@ -146,8 +157,8 @@ static inline void xs_close(struct xs_handle *xsh) } -/* Xen 4.1 */ -#else +/* Xen 4.1 thru 4.6 */ +#elif CONFIG_XEN_CTRL_INTERFACE_VERSION < 470 typedef xc_interface *XenXC; typedef xc_interface *xenforeignmemory_handle; @@ -187,6 +198,33 @@ static inline int xc_fd(xc_interface *xen_xc) { return -1; } +#else /* CONFIG_XEN_CTRL_INTERFACE_VERSION >= 470 */ + +#ifndef CONFIG_XEN_STABLE_LIBS +#error XEN_CTRL_INTERFACE_VERSION >= 470, but no stable libs? +#endif + +typedef xc_interface *XenXC; + +# define XC_INTERFACE_FMT "%p" +# define XC_HANDLER_INITIAL_VALUE NULL + +#include <xenevtchn.h> +#include <xengnttab.h> +#include <xenforeignmemory.h> + +static inline XenXC xen_xc_interface_open(void *logger, void *dombuild_logger, + unsigned int open_flags) +{ + return xc_interface_open(logger, dombuild_logger, open_flags); +} + +/* FIXME There is now way to have the xen fd */ +static inline int xc_fd(xc_interface *xen_xc) +{ + return -1; +} + #endif /* Xen before 4.2 */ diff --git a/xen-common.c b/xen-common.c index d319dcb..f689758 100644 --- a/xen-common.c +++ b/xen-common.c @@ -117,7 +117,16 @@ static int xen_init(MachineState *ms) xen_be_printf(NULL, 0, "can't open xen interface\n"); return -1; } +#ifdef CONFIG_XEN_STABLE_LIBS /* We have libxenforeignmemory */ + xen_fmem = xenforeignmemory_open(0, 0); + if (xen_fmem == NULL) { + xen_be_printf(NULL, 0, "can't open xen fmem interface\n"); + xc_interface_close(xen_xc); + return -1; + } +#else xen_fmem = &xen_xc; +#endif qemu_add_vm_change_state_handler(xen_change_state_handler, NULL); return 0; -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |