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