Patchwork [01/15] xen: Update libxc calls

login
register
mail settings
Submitter Stefano Stabellini
Date Aug. 12, 2010, 2:09 p.m.
Message ID <1281622202-3453-1-git-send-email-stefano.stabellini@eu.citrix.com>
Download mbox | patch
Permalink /patch/61608/
State New
Headers show

Comments

Stefano Stabellini - Aug. 12, 2010, 2:09 p.m.
From: Anthony PERARD <anthony.perard@citrix.com>

Update the libxenctrl calls in Qemu to use the new interface, otherwise
Qemu wouldn't be able to build against new versions of the library.

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
 configure            |    2 +-
 hw/xen_backend.c     |   10 +++++-----
 hw/xen_backend.h     |    2 +-
 hw/xen_disk.c        |   12 ++++++------
 hw/xen_domainbuild.c |    4 +++-
 hw/xen_nic.c         |   16 ++++++++--------
 6 files changed, 24 insertions(+), 22 deletions(-)
Paolo Bonzini - Aug. 12, 2010, 2:19 p.m.
On 08/12/2010 10:09 AM, stefano.stabellini@eu.citrix.com wrote:
> From: Anthony PERARD<anthony.perard@citrix.com>
>
> Update the libxenctrl calls in Qemu to use the new interface, otherwise
> Qemu wouldn't be able to build against new versions of the library.

What's the earliest version of libxc that will be supported after this 
patch?

Thanks!

Paolo
Stefano Stabellini - Aug. 12, 2010, 2:28 p.m.
On Thu, 12 Aug 2010, Paolo Bonzini wrote:
> On 08/12/2010 10:09 AM, stefano.stabellini@eu.citrix.com wrote:
> > From: Anthony PERARD<anthony.perard@citrix.com>
> >
> > Update the libxenctrl calls in Qemu to use the new interface, otherwise
> > Qemu wouldn't be able to build against new versions of the library.
> 
> What's the earliest version of libxc that will be supported after this 
> patch?
 
xen-unstable only at the moment.

We can probably add some #define so that qemu can work with both (old
and new versions of libxc).
Stefano Stabellini - Aug. 12, 2010, 2:29 p.m.
On Thu, 12 Aug 2010, Stefano Stabellini wrote:
> On Thu, 12 Aug 2010, Paolo Bonzini wrote:
> > On 08/12/2010 10:09 AM, stefano.stabellini@eu.citrix.com wrote:
> > > From: Anthony PERARD<anthony.perard@citrix.com>
> > >
> > > Update the libxenctrl calls in Qemu to use the new interface, otherwise
> > > Qemu wouldn't be able to build against new versions of the library.
> > 
> > What's the earliest version of libxc that will be supported after this 
> > patch?
>  
> xen-unstable only at the moment.
> 
> We can probably add some #define so that qemu can work with both (old
> and new versions of libxc).
> 

I mean we can add them to libxc so that there is no need for this patch
anymore.
Gerd Hoffmann - Aug. 18, 2010, 9:50 a.m.
Hi,

> I mean we can add them to libxc so that there is no need for this patch
> anymore.

That would be great.  When adding the xen bits initially I've tried to 
avoid hard dependencies on specific xen versions.  There are some ifdefs 
in the qemu code to support compiling with various xen versions (IIRC 
3.1 -> 3.4 worked last time I've tried).  I think the minimum supported 
range of xen versions should be the ones still actively maintained by 
xensource (I think this is 3.4, 4.0 and unstable right now).  Supporting 
even older versions would be nice to have.

cheers,
   Gerd
Stefano Stabellini - Aug. 18, 2010, 11:47 a.m.
On Wed, 18 Aug 2010, Gerd Hoffmann wrote:
>    Hi,
> 
> > I mean we can add them to libxc so that there is no need for this patch
> > anymore.
> 
> That would be great.  When adding the xen bits initially I've tried to 
> avoid hard dependencies on specific xen versions.  There are some ifdefs 
> in the qemu code to support compiling with various xen versions (IIRC 
> 3.1 -> 3.4 worked last time I've tried).  I think the minimum supported 
> range of xen versions should be the ones still actively maintained by 
> xensource (I think this is 3.4, 4.0 and unstable right now).  Supporting 
> even older versions would be nice to have.
> 
 
I agree on the range of xen versions, but supporting even a wider range
shouldn't be too hard, it just requires few more ifdef's.

Patch

diff --git a/configure b/configure
index a20371c..89d9b44 100755
--- a/configure
+++ b/configure
@@ -1102,7 +1102,7 @@  if test "$xen" != "no" ; then
   cat > $TMPC <<EOF
 #include <xenctrl.h>
 #include <xs.h>
-int main(void) { xs_daemon_open(); xc_interface_open(); return 0; }
+int main(void) { xs_daemon_open(); xc_interface_open(0, 0, 0); return 0; }
 EOF
   if compile_prog "" "$xen_libs" ; then
     xen=yes
diff --git a/hw/xen_backend.c b/hw/xen_backend.c
index a2e408f..b2d302b 100644
--- a/hw/xen_backend.c
+++ b/hw/xen_backend.c
@@ -43,7 +43,7 @@ 
 /* ------------------------------------------------------------- */
 
 /* public */
-int xen_xc;
+xc_interface *xen_xc = NULL;
 struct xs_handle *xenstore = NULL;
 const char *xen_protocol;
 
@@ -216,7 +216,7 @@  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();
+	xendev->gnttabdev = xc_gnttab_open(xen_xc);
 	if (xendev->gnttabdev < 0) {
 	    xen_be_printf(NULL, 0, "can't open gnttab device\n");
 	    xc_evtchn_close(xendev->evtchndev);
@@ -269,7 +269,7 @@  static struct XenDevice *xen_be_del_xendev(int dom, int dev)
 	if (xendev->evtchndev >= 0)
 	    xc_evtchn_close(xendev->evtchndev);
 	if (xendev->gnttabdev >= 0)
-	    xc_gnttab_close(xendev->gnttabdev);
+	    xc_gnttab_close(xen_xc, xendev->gnttabdev);
 
 	QTAILQ_REMOVE(&xendevs, xendev, next);
 	qemu_free(xendev);
@@ -627,8 +627,8 @@  int xen_be_init(void)
     if (qemu_set_fd_handler(xs_fileno(xenstore), xenstore_update, NULL, NULL) < 0)
 	goto err;
 
-    xen_xc = xc_interface_open();
-    if (xen_xc == -1) {
+    xen_xc = xc_interface_open(NULL, NULL, 0);
+    if (xen_xc == NULL) {
 	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 cc25f9d..385e851 100644
--- a/hw/xen_backend.h
+++ b/hw/xen_backend.h
@@ -57,7 +57,7 @@  struct XenDevice {
 /* ------------------------------------------------------------- */
 
 /* variables */
-extern int xen_xc;
+extern xc_interface *xen_xc;
 extern struct xs_handle *xenstore;
 extern const char *xen_protocol;
 
diff --git a/hw/xen_disk.c b/hw/xen_disk.c
index 9a466f3..3c1d3ef 100644
--- a/hw/xen_disk.c
+++ b/hw/xen_disk.c
@@ -242,7 +242,7 @@  static void ioreq_unmap(struct ioreq *ioreq)
     if (batch_maps) {
 	if (!ioreq->pages)
 	    return;
-	if (xc_gnttab_munmap(gnt, ioreq->pages, ioreq->v.niov) != 0)
+	if (xc_gnttab_munmap(xen_xc, gnt, ioreq->pages, ioreq->v.niov) != 0)
 	    xen_be_printf(&ioreq->blkdev->xendev, 0, "xc_gnttab_munmap failed: %s\n",
 			  strerror(errno));
 	ioreq->blkdev->cnt_map -= ioreq->v.niov;
@@ -251,7 +251,7 @@  static void ioreq_unmap(struct ioreq *ioreq)
 	for (i = 0; i < ioreq->v.niov; i++) {
 	    if (!ioreq->page[i])
 		continue;
-	    if (xc_gnttab_munmap(gnt, ioreq->page[i], 1) != 0)
+	    if (xc_gnttab_munmap(xen_xc, gnt, ioreq->page[i], 1) != 0)
 		xen_be_printf(&ioreq->blkdev->xendev, 0, "xc_gnttab_munmap failed: %s\n",
 			      strerror(errno));
 	    ioreq->blkdev->cnt_map--;
@@ -269,7 +269,7 @@  static int ioreq_map(struct ioreq *ioreq)
         return 0;
     if (batch_maps) {
 	ioreq->pages = xc_gnttab_map_grant_refs
-	    (gnt, ioreq->v.niov, ioreq->domids, ioreq->refs, ioreq->prot);
+	    (xen_xc, gnt, ioreq->v.niov, ioreq->domids, ioreq->refs, ioreq->prot);
 	if (ioreq->pages == NULL) {
 	    xen_be_printf(&ioreq->blkdev->xendev, 0,
 			  "can't map %d grant refs (%s, %d maps)\n",
@@ -283,7 +283,7 @@  static int ioreq_map(struct ioreq *ioreq)
     } else  {
 	for (i = 0; i < ioreq->v.niov; i++) {
 	    ioreq->page[i] = xc_gnttab_map_grant_ref
-		(gnt, ioreq->domids[i], ioreq->refs[i], ioreq->prot);
+		(xen_xc, gnt, ioreq->domids[i], ioreq->refs[i], ioreq->prot);
 	    if (ioreq->page[i] == NULL) {
 		xen_be_printf(&ioreq->blkdev->xendev, 0,
 			      "can't map grant ref %d (%s, %d maps)\n",
@@ -683,7 +683,7 @@  static int blk_connect(struct XenDevice *xendev)
             blkdev->protocol = BLKIF_PROTOCOL_X86_64;
     }
 
-    blkdev->sring = xc_gnttab_map_grant_ref(blkdev->xendev.gnttabdev,
+    blkdev->sring = xc_gnttab_map_grant_ref(xen_xc, blkdev->xendev.gnttabdev,
 					    blkdev->xendev.dom,
 					    blkdev->ring_ref,
 					    PROT_READ | PROT_WRITE);
@@ -738,7 +738,7 @@  static void blk_disconnect(struct XenDevice *xendev)
     xen_be_unbind_evtchn(&blkdev->xendev);
 
     if (blkdev->sring) {
-	xc_gnttab_munmap(blkdev->xendev.gnttabdev, blkdev->sring, 1);
+	xc_gnttab_munmap(xen_xc, blkdev->xendev.gnttabdev, blkdev->sring, 1);
 	blkdev->cnt_map--;
 	blkdev->sring = NULL;
     }
diff --git a/hw/xen_domainbuild.c b/hw/xen_domainbuild.c
index 7f1fd66..1620312 100644
--- a/hw/xen_domainbuild.c
+++ b/hw/xen_domainbuild.c
@@ -176,7 +176,9 @@  static int xen_domain_watcher(void)
     for (i = 3; i < n; i++) {
         if (i == fd[0])
             continue;
-        if (i == xen_xc)
+        // FIXME The fd of xen_xc is now xen_xc->fd
+        // fd is the first field, so this works
+        if (i == *(int*)xen_xc)
             continue;
         close(i);
     }
diff --git a/hw/xen_nic.c b/hw/xen_nic.c
index 08055b8..4f68850 100644
--- a/hw/xen_nic.c
+++ b/hw/xen_nic.c
@@ -166,7 +166,7 @@  static void net_tx_packets(struct XenNetDev *netdev)
 			  (txreq.flags & NETTXF_more_data)      ? " more_data"      : "",
 			  (txreq.flags & NETTXF_extra_info)     ? " extra_info"     : "");
 
-	    page = xc_gnttab_map_grant_ref(netdev->xendev.gnttabdev,
+	    page = xc_gnttab_map_grant_ref(xen_xc, netdev->xendev.gnttabdev,
 					   netdev->xendev.dom,
 					   txreq.gref, PROT_READ);
 	    if (page == NULL) {
@@ -185,7 +185,7 @@  static void net_tx_packets(struct XenNetDev *netdev)
             } else {
                 qemu_send_packet(&netdev->nic->nc, page + txreq.offset, txreq.size);
             }
-	    xc_gnttab_munmap(netdev->xendev.gnttabdev, page, 1);
+	    xc_gnttab_munmap(xen_xc, netdev->xendev.gnttabdev, page, 1);
 	    net_tx_response(netdev, &txreq, NETIF_RSP_OKAY);
 	}
 	if (!netdev->tx_work)
@@ -272,7 +272,7 @@  static ssize_t net_rx_packet(VLANClientState *nc, const uint8_t *buf, size_t siz
     memcpy(&rxreq, RING_GET_REQUEST(&netdev->rx_ring, rc), sizeof(rxreq));
     netdev->rx_ring.req_cons = ++rc;
 
-    page = xc_gnttab_map_grant_ref(netdev->xendev.gnttabdev,
+    page = xc_gnttab_map_grant_ref(xen_xc, netdev->xendev.gnttabdev,
 				   netdev->xendev.dom,
 				   rxreq.gref, PROT_WRITE);
     if (page == NULL) {
@@ -282,7 +282,7 @@  static ssize_t net_rx_packet(VLANClientState *nc, const uint8_t *buf, size_t siz
 	return -1;
     }
     memcpy(page + NET_IP_ALIGN, buf, size);
-    xc_gnttab_munmap(netdev->xendev.gnttabdev, page, 1);
+    xc_gnttab_munmap(xen_xc, netdev->xendev.gnttabdev, page, 1);
     net_rx_response(netdev, &rxreq, NETIF_RSP_OKAY, NET_IP_ALIGN, size, 0);
 
     return size;
@@ -350,11 +350,11 @@  static int net_connect(struct XenDevice *xendev)
 	return -1;
     }
 
-    netdev->txs = xc_gnttab_map_grant_ref(netdev->xendev.gnttabdev,
+    netdev->txs = xc_gnttab_map_grant_ref(xen_xc, netdev->xendev.gnttabdev,
 					  netdev->xendev.dom,
 					  netdev->tx_ring_ref,
 					  PROT_READ | PROT_WRITE);
-    netdev->rxs = xc_gnttab_map_grant_ref(netdev->xendev.gnttabdev,
+    netdev->rxs = xc_gnttab_map_grant_ref(xen_xc, netdev->xendev.gnttabdev,
 					  netdev->xendev.dom,
 					  netdev->rx_ring_ref,
 					  PROT_READ | PROT_WRITE);
@@ -381,11 +381,11 @@  static void net_disconnect(struct XenDevice *xendev)
     xen_be_unbind_evtchn(&netdev->xendev);
 
     if (netdev->txs) {
-	xc_gnttab_munmap(netdev->xendev.gnttabdev, netdev->txs, 1);
+	xc_gnttab_munmap(xen_xc, netdev->xendev.gnttabdev, netdev->txs, 1);
 	netdev->txs = NULL;
     }
     if (netdev->rxs) {
-	xc_gnttab_munmap(netdev->xendev.gnttabdev, netdev->rxs, 1);
+	xc_gnttab_munmap(xen_xc, netdev->xendev.gnttabdev, netdev->rxs, 1);
 	netdev->rxs = NULL;
     }
     if (netdev->nic) {