[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] Re: [Qemu-devel] [PATCH V11 03/15] xen: Support new libxc calls from xen unstable.
On 01.03.2011, at 19:35, Anthony.Perard@xxxxxxxxxx wrote: > From: Anthony PERARD <anthony.perard@xxxxxxxxxx> > > This patch updates the libxenctrl calls in Qemu to use the new interface, > otherwise Qemu wouldn't be able to build against new versions of the > library. > > We check libxenctrl version in configure, from Xen 3.3.0 to Xen > unstable. > > Signed-off-by: Anthony PERARD <anthony.perard@xxxxxxxxxx> > Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> > Acked-by: Alexander Graf <agraf@xxxxxxx> > --- > configure | 67 ++++++++++++++++++++++++++++++++++++++++++++++++- > hw/xen_backend.c | 21 ++++++++------- > hw/xen_backend.h | 6 ++-- > hw/xen_common.h | 64 +++++++++++++++++++++++++++++++++++++---------- > hw/xen_disk.c | 4 +- > hw/xen_domainbuild.c | 3 +- > 6 files changed, 133 insertions(+), 32 deletions(-) > > diff --git a/configure b/configure > index 3036faf..a84d974 100755 > --- a/configure > +++ b/configure > @@ -126,6 +126,7 @@ vnc_jpeg="" > vnc_png="" > vnc_thread="no" > xen="" > +xen_ctrl_version="" > linux_aio="" > attr="" > vhost_net="" > @@ -1147,20 +1148,81 @@ fi > > if test "$xen" != "no" ; then > xen_libs="-lxenstore -lxenctrl -lxenguest" > + > + # Xen unstable > cat > $TMPC <<EOF > #include <xenctrl.h> > #include <xs.h> > -int main(void) { xs_daemon_open(); xc_interface_open(); return 0; } > +#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_gnttab_open(NULL, 0); > + return 0; > +} > EOF > if compile_prog "" "$xen_libs" ; then > + xen_ctrl_version=410 > xen=yes > - libs_softmmu="$xen_libs $libs_softmmu" > + > + # Xen 4.0.0 > + elif ( > + cat > $TMPC <<EOF > +#include <xenctrl.h> > +#include <xs.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) { > + xs_daemon_open(); > + xc_interface_open(); > + xc_gnttab_open(); > + xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0); > + return 0; > +} > +EOF > + compile_prog "" "$xen_libs" > + ) ; then > + xen_ctrl_version=400 > + xen=yes > + > + # Xen 3.3.0, 3.4.0 > + elif ( > + cat > $TMPC <<EOF > +#include <xenctrl.h> > +#include <xs.h> > +int main(void) { > + xs_daemon_open(); > + xc_interface_open(); > + xc_gnttab_open(); > + xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0); > + return 0; > +} > +EOF > + compile_prog "" "$xen_libs" > + ) ; then > + xen_ctrl_version=330 > + xen=yes > + > + # Xen not found or unsupported > else > if test "$xen" = "yes" ; then > feature_not_found "xen" > fi > xen=no > fi > + > + if test "$xen" = yes; then > + libs_softmmu="$xen_libs $libs_softmmu" > + fi > fi > > ########################################## > @@ -2755,6 +2817,7 @@ if test "$bluez" = "yes" ; then > fi > if test "$xen" = "yes" ; then > echo "CONFIG_XEN=y" >> $config_host_mak > + echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> > $config_host_mak > fi > if test "$io_thread" = "yes" ; then > echo "CONFIG_IOTHREAD=y" >> $config_host_mak > diff --git a/hw/xen_backend.c b/hw/xen_backend.c > index 9f4ec4b..3907b83 100644 > --- a/hw/xen_backend.c > +++ b/hw/xen_backend.c > @@ -43,7 +43,8 @@ > /* ------------------------------------------------------------- */ > > /* public */ > -int xen_xc; > +XenXC xen_xc = XC_HANDLER_INITIAL_VALUE; > +XenGnttab xen_xcg = XC_HANDLER_INITIAL_VALUE; > struct xs_handle *xenstore = NULL; > const char *xen_protocol; > > @@ -214,8 +215,8 @@ static struct XenDevice *xen_be_get_xendev(const char > *type, int dom, int dev, > xendev->debug = debug; > xendev->local_port = -1; > > - xendev->evtchndev = xc_evtchn_open(); > - if (xendev->evtchndev < 0) { > + xendev->evtchndev = xc_evtchn_open(NULL, 0); > + if (xendev->evtchndev == XC_HANDLER_INITIAL_VALUE) { > xen_be_printf(NULL, 0, "can't open evtchn device\n"); > qemu_free(xendev); > return NULL; > @@ -223,15 +224,15 @@ static struct XenDevice *xen_be_get_xendev(const char > *type, int dom, int dev, > fcntl(xc_evtchn_fd(xendev->evtchndev), F_SETFD, FD_CLOEXEC); > > if (ops->flags & DEVOPS_FLAG_NEED_GNTDEV) { > - xendev->gnttabdev = xc_gnttab_open(); > - if (xendev->gnttabdev < 0) { > + xendev->gnttabdev = xc_gnttab_open(NULL, 0); > + if (xendev->gnttabdev == XC_HANDLER_INITIAL_VALUE) { > xen_be_printf(NULL, 0, "can't open gnttab device\n"); > xc_evtchn_close(xendev->evtchndev); > qemu_free(xendev); > return NULL; > } > } else { > - xendev->gnttabdev = -1; > + xendev->gnttabdev = XC_HANDLER_INITIAL_VALUE; > } > > QTAILQ_INSERT_TAIL(&xendevs, xendev, next); > @@ -277,10 +278,10 @@ static struct XenDevice *xen_be_del_xendev(int dom, int > dev) > qemu_free(xendev->fe); > } > > - if (xendev->evtchndev >= 0) { > + if (xendev->evtchndev != XC_HANDLER_INITIAL_VALUE) { > xc_evtchn_close(xendev->evtchndev); > } > - if (xendev->gnttabdev >= 0) { > + if (xendev->gnttabdev != XC_HANDLER_INITIAL_VALUE) { > xc_gnttab_close(xendev->gnttabdev); > } > > @@ -664,8 +665,8 @@ int xen_be_init(void) > goto err; > } > > - xen_xc = xc_interface_open(); > - if (xen_xc == -1) { > + xen_xc = xc_interface_open(0, 0, 0); > + if (xen_xc == XC_HANDLER_INITIAL_VALUE) { > xen_be_printf(NULL, 0, "can't open xen interface\n"); > goto err; > } > diff --git a/hw/xen_backend.h b/hw/xen_backend.h > index 1b428e3..6401c85 100644 > --- a/hw/xen_backend.h > +++ b/hw/xen_backend.h > @@ -45,8 +45,8 @@ struct XenDevice { > int remote_port; > int local_port; > > - int evtchndev; > - int gnttabdev; > + XenEvtchn evtchndev; > + XenGnttab gnttabdev; > > struct XenDevOps *ops; > QTAILQ_ENTRY(XenDevice) next; > @@ -55,7 +55,7 @@ struct XenDevice { > /* ------------------------------------------------------------- */ > > /* variables */ > -extern int xen_xc; > +extern XenXC xen_xc; > extern struct xs_handle *xenstore; > extern const char *xen_protocol; > > diff --git a/hw/xen_common.h b/hw/xen_common.h > index 8a55b44..7e123ec 100644 > --- a/hw/xen_common.h > +++ b/hw/xen_common.h > @@ -1,6 +1,8 @@ > #ifndef QEMU_HW_XEN_COMMON_H > #define QEMU_HW_XEN_COMMON_H 1 > > +#include "config-host.h" > + > #include <stddef.h> > #include <inttypes.h> > > @@ -13,22 +15,56 @@ > #include "qemu-queue.h" > > /* > - * tweaks needed to build with different xen versions > - * 0x00030205 -> 3.1.0 > - * 0x00030207 -> 3.2.0 > - * 0x00030208 -> unstable > + * We don't support Xen prior to 3.3.0. > */ > -#include <xen/xen-compat.h> > -#if __XEN_LATEST_INTERFACE_VERSION__ < 0x00030205 > -# define evtchn_port_or_error_t int > -#endif > -#if __XEN_LATEST_INTERFACE_VERSION__ < 0x00030207 > -# define xc_map_foreign_pages xc_map_foreign_batch > + > +/* Xen before 4.0 */ > +#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 400 > +static inline void *xc_map_foreign_bulk(int xc_handle, uint32_t dom, int > prot, > + xen_pfn_t *arr, int *err, > + unsigned int num) > +{ > + return xc_map_foreign_batch(xc_handle, dom, prot, arr, num); > +} > #endif > -#if __XEN_LATEST_INTERFACE_VERSION__ < 0x00030208 > -# define xen_mb() mb() > -# define xen_rmb() rmb() > -# define xen_wmb() wmb() > + > + > +/* Xen before 4.1 */ > +#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 410 > + > +typedef int XenXC; > +typedef int XenEvtchn; > +typedef int XenGnttab; > + > +# define XC_INTERFACE_FMT "%i" > +# define XC_HANDLER_INITIAL_VALUE -1 > + > +# define xc_interface_open(logger, dombuild_logger, open_flags) \ > + xc_interface_open() > +# define xc_evtchn_open(logger, open_flags) xc_evtchn_open() > +# define xc_gnttab_open(logger, open_flags) xc_gnttab_open() defines really bite me when abstracting the interface through an indirect calling table. I had to change the code this way to make it work with xenner: diff --git a/hw/xen_common.h b/hw/xen_common.h index a5fc74b..0c09b37 100644 --- a/hw/xen_common.h +++ b/hw/xen_common.h @@ -39,10 +39,23 @@ typedef int XenGnttab; # define XC_INTERFACE_FMT "%i" # define XC_HANDLER_INITIAL_VALUE -1 -# define xc_interface_open(logger, dombuild_logger, open_flags) \ - xc_interface_open() -# define xc_evtchn_open(logger, open_flags) xc_evtchn_open() -# define xc_gnttab_open(logger, open_flags) xc_gnttab_open() +static inline XenEvtchn xen_xc_evtchn_open(void *logger, + unsigned int open_flags) +{ + return xc_evtchn_open(); +} + +static inline XenGnttab xen_xc_gnttab_open(void *logger, + unsigned int open_flags) +{ + return xc_gnttab_open(); +} + +static inline XenXC xen_xc_interface_open(void *logger, void *dombuild_logger, + unsigned int open_flags) +{ + return xc_interface_open(); +} static inline int xc_fd(int xen_xc) { @@ -69,6 +82,24 @@ typedef xc_gnttab *XenGnttab; # define XC_INTERFACE_FMT "%p" # define XC_HANDLER_INITIAL_VALUE NULL +static inline XenEvtchn xen_xc_evtchn_open(void *logger, + unsigned int open_flags) +{ + return xc_evtchn_open(logger, open_flags); +} + +static inline XenGnttab xen_xc_gnttab_open(void *logger, + unsigned int open_flags) +{ + return xc_gnttab_open(logger, open_flags); +} + +static inline XenXC xen_xc_interface_open(void *logger, void *dombuild_logger, + 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) { Leave it as is in your patch and I'll change it in my xenner patch set again, but I wanted to make sure that you're aware of the issues going along with #defines. Alex _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |