WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] Re: [Qemu-devel] [PATCH V11 03/15] xen: Support new libxc ca

To: Anthony.Perard@xxxxxxxxxx
Subject: [Xen-devel] Re: [Qemu-devel] [PATCH V11 03/15] xen: Support new libxc calls from xen unstable.
From: Alexander Graf <agraf@xxxxxxx>
Date: Wed, 23 Mar 2011 11:43:32 +0100
Cc: Xen Devel <xen-devel@xxxxxxxxxxxxxxxxxxx>, QEMU-devel <qemu-devel@xxxxxxxxxx>, Anthony Liguori <anthony@xxxxxxxxxxxxx>, Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
Delivery-date: Wed, 23 Mar 2011 03:44:44 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <1299004529-31290-4-git-send-email-anthony.perard@xxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <1299004529-31290-1-git-send-email-anthony.perard@xxxxxxxxxx> <1299004529-31290-4-git-send-email-anthony.perard@xxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
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

<Prev in Thread] Current Thread [Next in Thread>