[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH QEMU-XEN v5 7/9] xen: Use stable library interfaces when they are available.
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 <ian.campbell@xxxxxxxxxx> Reviewed-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> 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 > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |