Module Name:    src
Committed By:   jym
Date:           Mon Jul 25 00:18:28 UTC 2011

Modified Files:
        src/sys/arch/xen/xen [jym-xensuspend]: evtchn.c if_xennet_xenbus.c
            xbd_xenbus.c
        src/sys/arch/xen/xenbus [jym-xensuspend]: xenbus_comms.c

Log Message:
Pull-up to my branch some of the improvements I committed to HEAD, but
forgot to reflect here.

Improvements in the attachement routines: in case of error, don't forget
to free() the allocated rings. Should not happen anyway, more a matter
of staying clean.


To generate a diff of this commit:
cvs rdiff -u -r1.42.2.6 -r1.42.2.7 src/sys/arch/xen/xen/evtchn.c
cvs rdiff -u -r1.33.2.11 -r1.33.2.12 src/sys/arch/xen/xen/if_xennet_xenbus.c
cvs rdiff -u -r1.38.2.10 -r1.38.2.11 src/sys/arch/xen/xen/xbd_xenbus.c
cvs rdiff -u -r1.12.2.3 -r1.12.2.4 src/sys/arch/xen/xenbus/xenbus_comms.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/xen/xen/evtchn.c
diff -u src/sys/arch/xen/xen/evtchn.c:1.42.2.6 src/sys/arch/xen/xen/evtchn.c:1.42.2.7
--- src/sys/arch/xen/xen/evtchn.c:1.42.2.6	Mon Jan 10 00:37:39 2011
+++ src/sys/arch/xen/xen/evtchn.c	Mon Jul 25 00:18:28 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: evtchn.c,v 1.42.2.6 2011/01/10 00:37:39 jym Exp $	*/
+/*	$NetBSD: evtchn.c,v 1.42.2.7 2011/07/25 00:18:28 jym Exp $	*/
 
 /*
  * Copyright (c) 2006 Manuel Bouyer.
@@ -54,7 +54,7 @@
 
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: evtchn.c,v 1.42.2.6 2011/01/10 00:37:39 jym Exp $");
+__KERNEL_RCSID(0, "$NetBSD: evtchn.c,v 1.42.2.7 2011/07/25 00:18:28 jym Exp $");
 
 #include "opt_xen.h"
 #include "isa.h"
@@ -447,10 +447,8 @@
 		printf("pirq_establish: can't malloc handler info\n");
 		return NULL;
 	}
-	if (event_set_handler(evtch, pirq_interrupt, ih, level, evname) != 0) {
-		free(ih, M_DEVBUF);
-		return NULL;
-	}
+
+	event_set_handler(evtch, pirq_interrupt, ih, level, evname);
 	ih->pirq = pirq;
 	ih->evtch = evtch;
 	ih->func = func;

Index: src/sys/arch/xen/xen/if_xennet_xenbus.c
diff -u src/sys/arch/xen/xen/if_xennet_xenbus.c:1.33.2.11 src/sys/arch/xen/xen/if_xennet_xenbus.c:1.33.2.12
--- src/sys/arch/xen/xen/if_xennet_xenbus.c:1.33.2.11	Thu May 26 22:30:31 2011
+++ src/sys/arch/xen/xen/if_xennet_xenbus.c	Mon Jul 25 00:18:28 2011
@@ -1,4 +1,4 @@
-/*      $NetBSD: if_xennet_xenbus.c,v 1.33.2.11 2011/05/26 22:30:31 jym Exp $      */
+/*      $NetBSD: if_xennet_xenbus.c,v 1.33.2.12 2011/07/25 00:18:28 jym Exp $      */
 
 /*
  * Copyright (c) 2006 Manuel Bouyer.
@@ -85,7 +85,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_xennet_xenbus.c,v 1.33.2.11 2011/05/26 22:30:31 jym Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_xennet_xenbus.c,v 1.33.2.12 2011/07/25 00:18:28 jym Exp $");
 
 #include "opt_xen.h"
 #include "opt_nfs_boot.h"
@@ -385,7 +385,13 @@
 	sc->sc_rx_ring.sring = rx_ring;
 
 	/* resume shared structures and tell backend that we are ready */
-	xennet_xenbus_resume(self, PMF_Q_NONE);
+	if (xennet_xenbus_resume(self, PMF_Q_NONE) == false) {
+		uvm_km_free(kernel_map, (vaddr_t)tx_ring, PAGE_SIZE,
+		    UVM_KMF_WIRED);
+		uvm_km_free(kernel_map, (vaddr_t)rx_ring, PAGE_SIZE,
+		    UVM_KMF_WIRED);
+		return;
+	}
 
 #if NRND > 0
 	rnd_attach_source(&sc->sc_rnd_source, device_xname(sc->sc_dev),
@@ -493,20 +499,23 @@
 	(void)pmap_extract_ma(pmap_kernel(), (vaddr_t)tx_ring, &ma);
 	error = xenbus_grant_ring(sc->sc_xbusd, ma, &sc->sc_tx_ring_gntref);
 	if (error)
-		return false;
+		goto abort_resume;
 	(void)pmap_extract_ma(pmap_kernel(), (vaddr_t)rx_ring, &ma);
 	error = xenbus_grant_ring(sc->sc_xbusd, ma, &sc->sc_rx_ring_gntref);
 	if (error)
-		return false;
+		goto abort_resume;
 	error = xenbus_alloc_evtchn(sc->sc_xbusd, &sc->sc_evtchn);
 	if (error)
-		return false;
+		goto abort_resume;
 	aprint_verbose_dev(dev, "using event channel %d\n",
 	    sc->sc_evtchn);
 	event_set_handler(sc->sc_evtchn, &xennet_handler, sc,
 	    IPL_NET, device_xname(dev));
-
 	return true;
+
+abort_resume:
+	xenbus_dev_fatal(sc->sc_xbusd, error, "resuming device");
+	return false;
 }
 
 static int

Index: src/sys/arch/xen/xen/xbd_xenbus.c
diff -u src/sys/arch/xen/xen/xbd_xenbus.c:1.38.2.10 src/sys/arch/xen/xen/xbd_xenbus.c:1.38.2.11
--- src/sys/arch/xen/xen/xbd_xenbus.c:1.38.2.10	Thu May 26 22:30:31 2011
+++ src/sys/arch/xen/xen/xbd_xenbus.c	Mon Jul 25 00:18:28 2011
@@ -1,4 +1,4 @@
-/*      $NetBSD: xbd_xenbus.c,v 1.38.2.10 2011/05/26 22:30:31 jym Exp $      */
+/*      $NetBSD: xbd_xenbus.c,v 1.38.2.11 2011/07/25 00:18:28 jym Exp $      */
 
 /*
  * Copyright (c) 2006 Manuel Bouyer.
@@ -25,8 +25,32 @@
  *
  */
 
+/*
+ * The file contains the xbd frontend code required for block-level
+ * communications (similar to hard disks) between two Xen domains.
+ *
+ * We are not supposed to receive solicitations spontaneously from backend. The
+ * protocol is therefore fairly simple and uses only one ring to communicate
+ * with backend: frontend posts requests to the ring then wait for their
+ * replies asynchronously.
+ *
+ * xbd follows NetBSD's disk(9) convention. At any time, a LWP can schedule
+ * an operation request for the device (be it open(), read(), write(), ...).
+ * Calls are typically processed that way:
+ * - initiate request: xbdread/write/open/ioctl/..
+ * - depending on operation, it is handled directly by disk(9) subsystem or
+ *   goes through physio(9) first.
+ * - the request is ultimately processed by xbdstart() that prepares the
+ *   xbd requests, post them in the ring I/O queue, then signal the backend.
+ *
+ * When a response is available in the queue, the backend signals the frontend
+ * via its event channel. This triggers xbd_handler(), which will link back
+ * the response to its request through the request ID, and mark the I/O as
+ * completed.
+ */
+
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xbd_xenbus.c,v 1.38.2.10 2011/05/26 22:30:31 jym Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xbd_xenbus.c,v 1.38.2.11 2011/07/25 00:18:28 jym Exp $");
 
 #include "opt_xen.h"
 #include "rnd.h"
@@ -118,6 +142,7 @@
 #define BLKIF_STATE_DISCONNECTED 0
 #define BLKIF_STATE_CONNECTED    1
 #define BLKIF_STATE_SUSPENDED    2
+
 	int sc_shutdown;
 #define BLKIF_SHUTDOWN_RUN    0 /* no shutdown */
 #define BLKIF_SHUTDOWN_REMOTE 1 /* backend-initiated shutdown in progress */
@@ -274,7 +299,11 @@
 	sc->sc_ring.sring = ring;
 
 	/* resume shared structures and tell backend that we are ready */
-	xbd_xenbus_resume(self, PMF_Q_NONE);
+	if (xbd_xenbus_resume(self, PMF_Q_NONE) == false) {
+		uvm_km_free(kernel_map, (vaddr_t)ring, PAGE_SIZE,
+		    UVM_KMF_WIRED);
+		return;
+	}
 
 #if NRND > 0
 	rnd_attach_source(&sc->sc_rnd_source, device_xname(self),
@@ -304,6 +333,7 @@
 		while (sc->sc_backend_status == BLKIF_STATE_CONNECTED &&
 		    sc->sc_dksc.sc_dkdev.dk_stats->io_busy > 0)
 			tsleep(xbd_xenbus_detach, PRIBIO, "xbddetach", hz/2);
+
 		xenbus_switch_state(sc->sc_xbusd, NULL, XenbusStateClosing);
 	}
 	if ((flags & DETACH_FORCE) == 0) {
@@ -420,11 +450,12 @@
 	(void)pmap_extract_ma(pmap_kernel(), (vaddr_t)ring, &ma);
 	error = xenbus_grant_ring(sc->sc_xbusd, ma, &sc->sc_ring_gntref);
 	if (error)
-		return false;
+		goto abort_resume;
 
 	error = xenbus_alloc_evtchn(sc->sc_xbusd, &sc->sc_evtchn);
 	if (error)
-		return false;
+		goto abort_resume;
+
 	aprint_verbose_dev(dev, "using event channel %d\n",
 	    sc->sc_evtchn);
 	event_set_handler(sc->sc_evtchn, &xbd_handler, sc,
@@ -452,19 +483,17 @@
 		errmsg = "writing protocol";
 		goto abort_transaction;
 	}
-	error = xenbus_switch_state(sc->sc_xbusd, xbt, XenbusStateInitialised);
-	if (error) {
-		errmsg = "writing frontend XenbusStateInitialised";
-		goto abort_transaction;
-	}
 	error = xenbus_transaction_end(xbt, 0);
 	if (error == EAGAIN)
 		goto again;
-	if (error) {
-		xenbus_dev_fatal(sc->sc_xbusd, error, "completing transaction");
+	if (error != 0) {
+		xenbus_dev_fatal(sc->sc_xbusd, error,
+		    "completing transaction");
 		return false;
 	}
 
+	xenbus_switch_state(sc->sc_xbusd, NULL, XenbusStateInitialised);
+
 	if (sc->sc_backend_status == BLKIF_STATE_SUSPENDED) {
 		/*
 		 * device was suspended, softc structures are
@@ -478,6 +507,10 @@
 
 	return true;
 
+abort_resume:
+	xenbus_dev_fatal(sc->sc_xbusd, error, "resuming device");
+	return false;
+
 abort_transaction:
 	xenbus_transaction_end(xbt, 1);
 	xenbus_dev_fatal(sc->sc_xbusd, error, "%s", errmsg);
@@ -664,23 +697,22 @@
 				xbdreq->req_nr_segments = seg + 1;
 				goto done;
 			}
-			xengnt_revoke_access(
-			    xbdreq->req_gntref[seg]);
+			xengnt_revoke_access(xbdreq->req_gntref[seg]);
 			xbdreq->req_nr_segments--;
 		}
 		if (rep->operation != BLKIF_OP_READ &&
 		    rep->operation != BLKIF_OP_WRITE) {
-				aprint_error_dev(sc->sc_dev,
-					 "bad operation %d from backend\n",
-					 rep->operation);
-				bp->b_error = EIO;
-				bp->b_resid = bp->b_bcount;
-				goto next;
+			aprint_error_dev(sc->sc_dev,
+			    "bad operation %d from backend\n",
+			    rep->operation);
+			bp->b_error = EIO;
+			bp->b_resid = bp->b_bcount;
+			goto next;
 		}
 		if (rep->status != BLKIF_RSP_OKAY) {
-				bp->b_error = EIO;
-				bp->b_resid = bp->b_bcount;
-				goto next;
+			bp->b_error = EIO;
+			bp->b_resid = bp->b_bcount;
+			goto next;
 		}
 		/* b_resid was set in xbdstart */
 next:

Index: src/sys/arch/xen/xenbus/xenbus_comms.c
diff -u src/sys/arch/xen/xenbus/xenbus_comms.c:1.12.2.3 src/sys/arch/xen/xenbus/xenbus_comms.c:1.12.2.4
--- src/sys/arch/xen/xenbus/xenbus_comms.c:1.12.2.3	Sun Nov  1 21:43:29 2009
+++ src/sys/arch/xen/xenbus/xenbus_comms.c	Mon Jul 25 00:18:28 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: xenbus_comms.c,v 1.12.2.3 2009/11/01 21:43:29 jym Exp $ */
+/* $NetBSD: xenbus_comms.c,v 1.12.2.4 2011/07/25 00:18:28 jym Exp $ */
 /******************************************************************************
  * xenbus_comms.c
  *
@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xenbus_comms.c,v 1.12.2.3 2009/11/01 21:43:29 jym Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xenbus_comms.c,v 1.12.2.4 2011/07/25 00:18:28 jym Exp $");
 
 #include <sys/types.h>
 #include <sys/null.h> 
@@ -216,19 +216,14 @@
 int
 xb_init_comms(device_t dev)
 {
-	int err;
 	int evtchn;
 
 	evtchn = xen_start_info.store_evtchn;
 
-	err = event_set_handler(evtchn, wake_waiting, NULL, IPL_TTY, "xenbus");
-	if (err) {
-		aprint_error_dev(dev, "request irq failed %i\n", err);
-		return err;
-	}
-
+	event_set_handler(evtchn, wake_waiting, NULL, IPL_TTY, "xenbus");
 	hypervisor_enable_event(evtchn);
 	aprint_verbose_dev(dev, "using event channel %d\n", evtchn);
+
 	return 0;
 }
 

Reply via email to