Module Name:    src
Committed By:   rmind
Date:           Mon Apr 18 01:47:28 UTC 2011

Modified Files:
        src/sys/dev/ata: ata.c atavar.h
        src/sys/dev/scsipi: scsiconf.c

Log Message:
Replace few simple_lock and ltsleep/wakeup uses with mutex(9) and condvar(9).

Note to all: please replace old primitives in your code! Thanks.


To generate a diff of this commit:
cvs rdiff -u -r1.113 -r1.114 src/sys/dev/ata/ata.c
cvs rdiff -u -r1.80 -r1.81 src/sys/dev/ata/atavar.h
cvs rdiff -u -r1.259 -r1.260 src/sys/dev/scsipi/scsiconf.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/dev/ata/ata.c
diff -u src/sys/dev/ata/ata.c:1.113 src/sys/dev/ata/ata.c:1.114
--- src/sys/dev/ata/ata.c:1.113	Sun Mar 28 20:46:18 2010
+++ src/sys/dev/ata/ata.c	Mon Apr 18 01:47:28 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: ata.c,v 1.113 2010/03/28 20:46:18 snj Exp $	*/
+/*	$NetBSD: ata.c,v 1.114 2011/04/18 01:47:28 rmind Exp $	*/
 
 /*
  * Copyright (c) 1998, 2001 Manuel Bouyer.  All rights reserved.
@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ata.c,v 1.113 2010/03/28 20:46:18 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ata.c,v 1.114 2011/04/18 01:47:28 rmind Exp $");
 
 #include "opt_ata.h"
 
@@ -42,7 +42,6 @@
 #include <sys/errno.h>
 #include <sys/ataio.h>
 #include <sys/kmem.h>
-#include <sys/simplelock.h>
 #include <sys/intr.h>
 #include <sys/bus.h>
 #include <sys/once.h>
@@ -74,18 +73,18 @@
 #define ATADEBUG_PRINT(args, level)
 #endif
 
+static ONCE_DECL(ata_init_ctrl);
 static struct pool ata_xfer_pool;
 
 /*
  * A queue of atabus instances, used to ensure the same bus probe order
- * for a given hardware configuration at each boot.
+ * for a given hardware configuration at each boot.  Kthread probing
+ * devices on a atabus.  Only one probing at once. 
  */
-struct atabus_initq_head atabus_initq_head =
-    TAILQ_HEAD_INITIALIZER(atabus_initq_head);
-struct simplelock atabus_interlock = SIMPLELOCK_INITIALIZER;
-
-/* kernel thread probing devices on a atabus. Only one probing at once */
-struct lwp *atabus_configlwp;
+static TAILQ_HEAD(, atabus_initq)	atabus_initq_head;
+static kmutex_t				atabus_qlock;
+static kcondvar_t			atabus_qcv;
+static lwp_t *				atabus_cfg_lwp;
 
 /*****************************************************************************
  * ATA bus layer.
@@ -111,6 +110,23 @@
 static void atabusconfig_thread(void *);
 
 /*
+ * atabus_init:
+ *
+ *	Initialize ATA subsystem structures.
+ */
+static int
+atabus_init(void)
+{
+
+	pool_init(&ata_xfer_pool, sizeof(struct ata_xfer), 0, 0, 0,
+	    "ataspl", NULL, IPL_BIO);
+	TAILQ_INIT(&atabus_initq_head);
+	mutex_init(&atabus_qlock, MUTEX_DEFAULT, IPL_NONE);
+	cv_init(&atabus_qcv, "atainitq");
+	return 0;
+}
+
+/*
  * atabusprint:
  *
  *	Autoconfiguration print routine used by ATA controllers when
@@ -196,15 +212,14 @@
 	splx(s);
 
 	/* Make sure the devices probe in atabus order to avoid jitter. */
-	simple_lock(&atabus_interlock);
-	while(1) {
+	mutex_enter(&atabus_qlock);
+	for (;;) {
 		atabus_initq = TAILQ_FIRST(&atabus_initq_head);
 		if (atabus_initq->atabus_sc == atabus_sc)
 			break;
-		ltsleep(&atabus_initq_head, PRIBIO, "ata_initq", 0,
-		    &atabus_interlock);
+		cv_wait(&atabus_qcv, &atabus_qlock);
 	}
-	simple_unlock(&atabus_interlock);
+	mutex_exit(&atabus_qlock);
 
 	/* If no drives, abort here */
 	for (i = 0; i < chp->ch_ndrive; i++)
@@ -219,19 +234,19 @@
 
 
 	if ((error = kthread_create(PRI_NONE, 0, NULL, atabusconfig_thread,
-	    atabus_sc, &atabus_configlwp,
+	    atabus_sc, &atabus_cfg_lwp,
 	    "%scnf", device_xname(atac->atac_dev))) != 0)
 		aprint_error_dev(atac->atac_dev,
 		    "unable to create config thread: error %d\n", error);
 	return;
 
  out:
-	simple_lock(&atabus_interlock);
+	mutex_enter(&atabus_qlock);
 	TAILQ_REMOVE(&atabus_initq_head, atabus_initq, atabus_initq);
-	simple_unlock(&atabus_interlock);
+	cv_broadcast(&atabus_qcv);
+	mutex_exit(&atabus_qlock);
 
 	free(atabus_initq, M_DEVBUF);
-	wakeup(&atabus_initq_head);
 
 	ata_delref(chp);
 
@@ -248,13 +263,15 @@
 	struct atabus_softc *atabus_sc = arg;
 	struct ata_channel *chp = atabus_sc->sc_chan;
 	struct atac_softc *atac = chp->ch_atac;
-	int i, s;
 	struct atabus_initq *atabus_initq = NULL;
+	int i, s;
 
-	simple_lock(&atabus_interlock);
+	/* XXX seems wrong */
+	mutex_enter(&atabus_qlock);
 	atabus_initq = TAILQ_FIRST(&atabus_initq_head);
-	simple_unlock(&atabus_interlock);
 	KASSERT(atabus_initq->atabus_sc == atabus_sc);
+	mutex_exit(&atabus_qlock);
+
 	/*
 	 * Attach an ATAPI bus, if needed.
 	 */
@@ -326,12 +343,12 @@
 	}
 	splx(s);
 
-	simple_lock(&atabus_interlock);
+	mutex_enter(&atabus_qlock);
 	TAILQ_REMOVE(&atabus_initq_head, atabus_initq, atabus_initq);
-	simple_unlock(&atabus_interlock);
+	cv_broadcast(&atabus_qcv);
+	mutex_exit(&atabus_qlock);
 
 	free(atabus_initq, M_DEVBUF);
-	wakeup(&atabus_initq_head);
 
 	ata_delref(chp);
 
@@ -424,15 +441,6 @@
 	return (1);
 }
 
-static int
-atabus_xferpool_init(void)
-{
-
-	pool_init(&ata_xfer_pool, sizeof(struct ata_xfer), 0, 0, 0, "ataspl",
-	    NULL, IPL_BIO);
-	return 0;
-}
-
 /*
  * atabus_attach:
  *
@@ -444,7 +452,6 @@
 	struct atabus_softc *sc = device_private(self);
 	struct ata_channel *chp = aux;
 	struct atabus_initq *initq;
-	static ONCE_DECL(poolinit_ctrl);
 	int error;
 
 	sc->sc_chan = chp;
@@ -457,7 +464,7 @@
 	if (ata_addref(chp))
 		return;
 
-	RUN_ONCE(&poolinit_ctrl, atabus_xferpool_init);
+	RUN_ONCE(&ata_init_ctrl, atabus_init);
 
 	initq = malloc(sizeof(*initq), M_DEVBUF, M_WAITOK);
 	initq->atabus_sc = sc;

Index: src/sys/dev/ata/atavar.h
diff -u src/sys/dev/ata/atavar.h:1.80 src/sys/dev/ata/atavar.h:1.81
--- src/sys/dev/ata/atavar.h:1.80	Mon Oct 19 18:41:12 2009
+++ src/sys/dev/ata/atavar.h	Mon Apr 18 01:47:28 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: atavar.h,v 1.80 2009/10/19 18:41:12 bouyer Exp $	*/
+/*	$NetBSD: atavar.h,v 1.81 2011/04/18 01:47:28 rmind Exp $	*/
 
 /*
  * Copyright (c) 1998, 2001 Manuel Bouyer.
@@ -108,12 +108,6 @@
 	struct atabus_softc *atabus_sc;
 };
 
-#ifdef _KERNEL
-TAILQ_HEAD(atabus_initq_head, atabus_initq);
-extern struct atabus_initq_head atabus_initq_head;
-extern struct simplelock atabus_interlock;
-#endif /* _KERNEL */
-
 /* High-level functions and structures used by both ATA and ATAPI devices */
 struct ataparams;
 

Index: src/sys/dev/scsipi/scsiconf.c
diff -u src/sys/dev/scsipi/scsiconf.c:1.259 src/sys/dev/scsipi/scsiconf.c:1.260
--- src/sys/dev/scsipi/scsiconf.c:1.259	Sat Apr  2 20:52:10 2011
+++ src/sys/dev/scsipi/scsiconf.c	Mon Apr 18 01:47:28 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: scsiconf.c,v 1.259 2011/04/02 20:52:10 macallan Exp $	*/
+/*	$NetBSD: scsiconf.c,v 1.260 2011/04/18 01:47:28 rmind Exp $	*/
 
 /*-
  * Copyright (c) 1998, 1999, 2004 The NetBSD Foundation, Inc.
@@ -48,7 +48,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: scsiconf.c,v 1.259 2011/04/02 20:52:10 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: scsiconf.c,v 1.260 2011/04/18 01:47:28 rmind Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -56,12 +56,13 @@
 #include <sys/proc.h>
 #include <sys/kthread.h>
 #include <sys/malloc.h>
+#include <sys/mutex.h>
+#include <sys/once.h>
 #include <sys/device.h>
 #include <sys/conf.h>
 #include <sys/fcntl.h>
 #include <sys/scsiio.h>
 #include <sys/queue.h>
-#include <sys/simplelock.h>
 
 #include <dev/scsipi/scsi_all.h>
 #include <dev/scsipi/scsipi_all.h>
@@ -81,9 +82,10 @@
 	TAILQ_ENTRY(scsi_initq) scsi_initq;
 };
 
-static TAILQ_HEAD(, scsi_initq) scsi_initq_head =
-    TAILQ_HEAD_INITIALIZER(scsi_initq_head);
-static struct simplelock scsibus_interlock = SIMPLELOCK_INITIALIZER;
+static ONCE_DECL(scsi_conf_ctrl);
+static TAILQ_HEAD(, scsi_initq)	scsi_initq_head;
+static kmutex_t			scsibus_qlock;
+static kcondvar_t		scsibus_qcv;
 
 static int	scsi_probe_device(struct scsibus_softc *, int, int);
 
@@ -119,6 +121,16 @@
 	scsi_kill_pending,
 };
 
+static int
+scsibus_init(void)
+{
+
+	TAILQ_INIT(&scsi_initq_head);
+	mutex_init(&scsibus_qlock, MUTEX_DEFAULT, IPL_NONE);
+	cv_init(&scsibus_qcv, "scsinitq");
+	return 0;
+}
+
 int
 scsiprint(void *aux, const char *pnp)
 {
@@ -175,6 +187,8 @@
 	if (scsipi_adapter_addref(chan->chan_adapter))
 		return;
 
+	RUN_ONCE(&scsi_conf_ctrl, scsibus_init);
+
 	/* Initialize the channel structure first */
 	chan->chan_init_cb = scsibus_config;
 	chan->chan_init_cb_arg = sc;
@@ -209,25 +223,23 @@
 	}
 
 	/* Make sure the devices probe in scsibus order to avoid jitter. */
-	simple_lock(&scsibus_interlock);
+	mutex_enter(&scsibus_qlock);
 	for (;;) {
 		scsi_initq = TAILQ_FIRST(&scsi_initq_head);
 		if (scsi_initq->sc_channel == chan)
 			break;
-		ltsleep(&scsi_initq_head, PRIBIO, "scsi_initq", 0,
-		    &scsibus_interlock);
+		cv_wait(&scsibus_qcv, &scsibus_qlock);
 	}
-
-	simple_unlock(&scsibus_interlock);
+	mutex_exit(&scsibus_qlock);
 
 	scsi_probe_bus(sc, -1, -1);
 
-	simple_lock(&scsibus_interlock);
+	mutex_enter(&scsibus_qlock);
 	TAILQ_REMOVE(&scsi_initq_head, scsi_initq, scsi_initq);
-	simple_unlock(&scsibus_interlock);
+	cv_broadcast(&scsibus_qcv);
+	mutex_exit(&scsibus_qlock);
 
 	free(scsi_initq, M_DEVBUF);
-	wakeup(&scsi_initq_head);
 
 	scsipi_adapter_delref(chan->chan_adapter);
 

Reply via email to