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;
}