[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH QEMU-XEN v5 7/9] xen: Use stable library interfa
From: |
Stefano Stabellini |
Subject: |
Re: [Qemu-devel] [PATCH QEMU-XEN v5 7/9] xen: Use stable library interfaces when they are available. |
Date: |
Tue, 10 Nov 2015 14:00:30 +0000 |
User-agent: |
Alpine 2.02 (DEB 1266 2009-07-14) |
On Mon, 9 Nov 2015, Ian Campbell wrote:
> 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.6 (inclusive) and the patches targetting
> 4.7 which adds these libraries.
>
> Signed-off-by: Ian Campbell <address@hidden>
Reviewed-by: Stefano Stabellini <address@hidden>
Two formatting issues below:
> v5: Remove ifdef check when undeffing the compat stuff.
> s/now way/no way/
>
> v4: xenforeignmemory_open is now a compat wrapper, so no ifdef.
>
> Simplify configury by asserting that interface version 470 will
> always have the libraries (lack of them makes it 460).
>
> Ran checkpatch and fixed everything except:
>
> ERROR: need consistent spacing around '*' (ctx:WxV)
> +typedef xc_interface *XenXC;
>
> Which I think is a false +ve.
>
> Simpler configure stuff
> ---
> configure | 55
> +++++++++++++++++++++++++++++++++++++++++++++
> include/hw/xen/xen_common.h | 36 +++++++++++++++++++++++++++--
> 2 files changed, 89 insertions(+), 2 deletions(-)
>
> diff --git a/configure b/configure
> index b4a3488..0253cc9 100755
> --- a/configure
> +++ b/configure
> @@ -1898,6 +1898,7 @@ fi
>
> if test "$xen" != "no" ; then
> xen_libs="-lxenstore -lxenctrl -lxenguest"
> + xen_stable_libs="-lxenforeignmemory -lxengnttab -lxenevtchn"
>
> # First we test whether Xen headers and libraries are available.
> # If no, we are done and there is no Xen support.
> @@ -1920,6 +1921,57 @@ EOF
> # Xen unstable
> elif
> cat > $TMPC <<EOF &&
> +/*
> + * If we have stable libs the we don't want the libxc compat
> + * layers, regardless of what CFLAGS we may have been given.
> + */
> +#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 <xenevtchn.h>
> +#include <xengnttab.h>
> +#include <xenforeignmemory.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;
> + xenforeignmemory_handle *xfmem;
> + xenevtchn_handle *xe;
> + xengnttab_handle *xg;
> +
> + 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);
> +
> + xfmem = xenforeignmemory_open(0, 0);
> + xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
> +
> + xe = xenevtchn_open(0, 0);
> + xenevtchn_fd(xe);
> +
> + xg = xengnttab_open(0, 0);
> + xengnttab_map_grant_ref(xg, 0, 0, 0);
> +
> + return 0;
> +}
> +EOF
> + compile_prog "" "$xen_libs $xen_stable_libs"
> + then
> + xen_ctrl_version=470
> + xen=yes
> +
> + # Xen 4.6
> + elif
> + cat > $TMPC <<EOF &&
> #include <xenctrl.h>
> #include <xenstore.h>
> #include <stdint.h>
> @@ -2096,6 +2148,9 @@ EOF
> fi
>
> if test "$xen" = yes; then
> + if test $xen_ctrl_version -ge 470 ; then
> + libs_softmmu="$xen_stable_libs $libs_softmmu"
tab
> + fi
> libs_softmmu="$xen_libs $libs_softmmu"
> fi
> fi
> diff --git a/include/hw/xen/xen_common.h b/include/hw/xen/xen_common.h
> index 323c76c..a758ac4 100644
> --- a/include/hw/xen/xen_common.h
> +++ b/include/hw/xen/xen_common.h
> @@ -6,6 +6,15 @@
> #include <stddef.h>
> #include <inttypes.h>
>
> +/*
> + * 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
> +
> #include <xenctrl.h>
> #if CONFIG_XEN_CTRL_INTERFACE_VERSION < 420
> # include <xs.h>
> @@ -151,8 +160,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;
> @@ -190,11 +199,34 @@ static inline XenXC xen_xc_interface_open(void *logger,
> void *dombuild_logger,
> xc_map_foreign_bulk(*h, d, p, a, e, n)
> #define xenforeignmemory_unmap(h, p, s) munmap(p, s * XC_PAGE_SIZE)
>
> +/* FIXME There is no way to have the xen fd */
> +static inline int xc_fd(xc_interface *xen_xc)
> +{
> + return -1;
> +}
> +#else /* CONFIG_XEN_CTRL_INTERFACE_VERSION >= 470 */
> +
> +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;
> }
> +
stray line
> #endif
>
> /* Xen before 4.2 */
> --
> 2.1.4
>
- [Qemu-devel] [Minios-devel] [PATCH v4 0/<VARIOUS>] Begin to disentangle libxenctrl and provide some stable libraries, Ian Campbell, 2015/11/09
- [Qemu-devel] [PATCH QEMU-XEN v5 0/9] Begin to disentangle libxenctrl and provide some stable libraries, Ian Campbell, 2015/11/09
- [Qemu-devel] [PATCH QEMU-XEN v5 1/9] xen_console: correctly cleanup primary console on teardown., Ian Campbell, 2015/11/09
- [Qemu-devel] [PATCH QEMU-XEN v5 6/9] xen: Switch uses of xc_map_foreign_bulk to use libxenforeignmemory API., Ian Campbell, 2015/11/09
- [Qemu-devel] [PATCH QEMU-XEN v5 2/9] xen: Switch to libxenevtchn interface for compat shims., Ian Campbell, 2015/11/09
- [Qemu-devel] [PATCH QEMU-XEN v5 7/9] xen: Use stable library interfaces when they are available., Ian Campbell, 2015/11/09
- Re: [Qemu-devel] [PATCH QEMU-XEN v5 7/9] xen: Use stable library interfaces when they are available.,
Stefano Stabellini <=
- [Qemu-devel] [PATCH QEMU-XEN v5 5/9] xen: Switch uses of xc_map_foreign_pages into xc_map_foreign_bulk, Ian Campbell, 2015/11/09
- [Qemu-devel] [PATCH QEMU-XEN v5 4/9] xen: Switch uses of xc_map_foreign_range into xc_map_foreign_bulk, Ian Campbell, 2015/11/09
- [Qemu-devel] [PATCH QEMU-XEN v5 8/9] xen: domainbuild: reopen libxenctrl interface after forking for domain watcher., Ian Campbell, 2015/11/09
- [Qemu-devel] [PATCH QEMU-XEN v5 9/9] xen: make it possible to build without the Xen PV domain builder, Ian Campbell, 2015/11/09
- [Qemu-devel] [PATCH QEMU-XEN v5 3/9] xen: Switch to libxengnttab interface for compat shims., Ian Campbell, 2015/11/09