PERFORCE change 133449 for review

Scott Long scottl at FreeBSD.org
Wed Jan 16 17:45:23 PST 2008


http://perforce.freebsd.org/chv.cgi?CH=133449

Change 133449 by scottl at scottl-ix on 2008/01/17 01:44:35

	Fix locking in the blkfront driver.  There's still probably a locking
	hole in the resume code, but that'll be looked at later.  Also to be
	looked at later is the single global lock.

Affected files ...

.. //depot/projects/xen31/sys/dev/xen/blkfront/blkfront.c#11 edit

Differences ...

==== //depot/projects/xen31/sys/dev/xen/blkfront/blkfront.c#11 (text+ko) ====

@@ -170,7 +170,7 @@
 		  xb_diskinfo[sc->xb_unit].device, sc->xb_unit,
 		  sc->xb_disk->d_mediasize);
 #endif
-	sc->xb_disk->d_flags = DISKFLAG_NEEDSGIANT;
+	sc->xb_disk->d_flags = 0;
 	disk_create(sc->xb_disk, DISK_VERSION_00);
 	bioq_init(&sc->xb_bioq);
 
@@ -195,7 +195,6 @@
 xb_strategy(struct bio *bp)
 {
 	struct xb_softc	*sc = (struct xb_softc *)bp->bio_disk->d_drv1;
-	int flags;
 
 	/* bogus disk? */
 	if (sc == NULL) {
@@ -206,14 +205,14 @@
 
 	DPRINTK("");
 
-	flags = splbio();
 	/*
 	 * Place it in the queue of disk activities for this disk
 	 */
+	mtx_lock(&blkif_io_lock);
 	bioq_disksort(&sc->xb_bioq, bp);
-	splx(flags);
 
 	xb_startio(sc);
+	mtx_unlock(&blkif_io_lock);
 	return;
 
  bad:
@@ -378,8 +377,8 @@
 	info->ring_ref = err;
 	
 	err = bind_listening_port_to_irqhandler(dev->otherend_id,
-		"xbd", (driver_intr_t *)blkif_int,
-					info, INTR_TYPE_BIO, NULL);
+		"xbd", (driver_intr_t *)blkif_int, info,
+					INTR_TYPE_BIO | INTR_MPSAFE, NULL);
 	if (err <= 0) {
 		xenbus_dev_fatal(dev, err,
 				 "bind_evtchn_to_irqhandler failed");
@@ -767,24 +766,20 @@
 xb_startio(struct xb_softc *sc)
 {
 	struct bio		*bp;
-	int			flags, queued = 0;
+	int			queued = 0;
 	struct blkfront_info *info = sc->xb_info;
 	DPRINTK("");
 
-	flags = splbio();
+	mtx_assert(&blkif_io_lock, MA_OWNED);
 
 	while ((bp = bioq_takefirst(&sc->xb_bioq)) != NULL) {
 
 		if (RING_FULL(&info->ring)) 
 			goto wait;
     	
-		splx(flags);
-
 		if (blkif_queue_request(bp)) {
-			flags = splbio();
 		wait:
 			bioq_insert_head(&sc->xb_bioq, bp);
-			splx(flags);
 			break;
 		}
 		queued++;
@@ -968,10 +963,10 @@
 	mtx_unlock(&blkif_io_lock);
 
 	/* Send off requeued requests */
+	mtx_lock(&blkif_io_lock);
 	flush_requests(info);
 
 	/* Kick any other new requests queued since we resumed */
-	mtx_lock(&blkif_io_lock);
 	kick_pending_request_queues(info);
 	mtx_unlock(&blkif_io_lock);
 }


More information about the p4-projects mailing list