Module Name:    src
Committed By:   jakllsch
Date:           Sat May 14 13:52:00 UTC 2011

Modified Files:
        src/sys/dev/dmover: dmover_io.c

Log Message:
Modernize simple_lock() and ltsleep() usage in dmover(4).
(Thanks to rmind for providing hints on what was necessary.)


To generate a diff of this commit:
cvs rdiff -u -r1.39 -r1.40 src/sys/dev/dmover/dmover_io.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/dmover/dmover_io.c
diff -u src/sys/dev/dmover/dmover_io.c:1.39 src/sys/dev/dmover/dmover_io.c:1.40
--- src/sys/dev/dmover/dmover_io.c:1.39	Sat Nov 13 14:08:20 2010
+++ src/sys/dev/dmover/dmover_io.c	Sat May 14 13:52:00 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: dmover_io.c,v 1.39 2010/11/13 14:08:20 uebayasi Exp $	*/
+/*	$NetBSD: dmover_io.c,v 1.40 2011/05/14 13:52:00 jakllsch Exp $	*/
 
 /*
  * Copyright (c) 2002, 2003 Wasabi Systems, Inc.
@@ -55,7 +55,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dmover_io.c,v 1.39 2010/11/13 14:08:20 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dmover_io.c,v 1.40 2011/05/14 13:52:00 jakllsch Exp $");
 
 #include <sys/param.h>
 #include <sys/queue.h>
@@ -64,7 +64,6 @@
 #include <sys/proc.h>
 #include <sys/poll.h>
 #include <sys/malloc.h>
-#include <sys/simplelock.h>
 #include <sys/file.h>
 #include <sys/filedesc.h>
 #include <sys/filio.h>
@@ -74,6 +73,8 @@
 #include <sys/once.h>
 #include <sys/stat.h>
 #include <sys/kauth.h>
+#include <sys/mutex.h>
+#include <sys/condvar.h>
 
 #include <uvm/uvm_extern.h>
 
@@ -101,7 +102,9 @@
 	struct selinfo ds_selq;
 	volatile int ds_flags;
 	u_int ds_nreqs;
-	struct simplelock ds_slock;
+	kmutex_t ds_lock;
+	kcondvar_t ds_complete_cv;
+	kcondvar_t ds_nreqs_cv;
 	struct timespec ds_atime;
 	struct timespec ds_mtime;
 	struct timespec ds_btime;
@@ -110,6 +113,8 @@
 static ONCE_DECL(dmio_cleaner_control);
 static struct workqueue *dmio_cleaner;
 static int dmio_cleaner_init(void);
+static struct dmio_state *dmio_state_get(void);
+static void dmio_state_put(struct dmio_state *);
 static void dmio_usrreq_fini1(struct work *wk, void *);
 
 #define	DMIO_STATE_SEL		0x0001
@@ -161,6 +166,40 @@
 	    NULL, PWAIT, IPL_SOFTCLOCK, 0);
 }
 
+static struct dmio_state *
+dmio_state_get(void)
+{
+	struct dmio_state *ds;
+
+	ds = pool_get(&dmio_state_pool, PR_WAITOK);
+
+	memset(ds, 0, sizeof(*ds));
+
+	getnanotime(&ds->ds_btime);
+	ds->ds_atime = ds->ds_mtime = ds->ds_btime;
+
+	mutex_init(&ds->ds_lock, MUTEX_DEFAULT, IPL_SOFTCLOCK);
+	cv_init(&ds->ds_complete_cv, "dmvrrd");
+	cv_init(&ds->ds_nreqs_cv, "dmiowr");
+	TAILQ_INIT(&ds->ds_pending);
+	TAILQ_INIT(&ds->ds_complete);
+	selinit(&ds->ds_selq);
+
+	return ds;
+}
+
+static void
+dmio_state_put(struct dmio_state *ds)
+{
+
+	seldestroy(&ds->ds_selq);
+	cv_destroy(&ds->ds_nreqs_cv);
+	cv_destroy(&ds->ds_complete_cv);
+	mutex_destroy(&ds->ds_lock);
+
+	pool_put(&dmio_state_pool, ds);
+}
+
 /*
  * dmio_usrreq_init:
  *
@@ -332,14 +371,11 @@
 dmio_usrreq_fini1(struct work *wk, void *dummy)
 {
 	struct dmio_usrreq_state *dus = (void *)wk;
-	int s;
 
 	KASSERT(wk == &dus->dus_work);
 
 	uvmspace_free(dus->dus_vmspace);
-	s = splsoftclock();
 	pool_put(&dmio_usrreq_state_pool, dus);
-	splx(s);
 }
 
 /*
@@ -355,7 +391,7 @@
 	struct dmio_usrreq_state *dus;
 	struct dmover_request *dreq;
 	struct dmio_usrresp resp;
-	int s, error = 0, progress = 0;
+	int error = 0, progress = 0;
 
 	if ((uio->uio_resid % sizeof(resp)) != 0)
 		return (EINVAL);
@@ -364,8 +400,7 @@
 		return (ENXIO);
 
 	getnanotime(&ds->ds_atime);
-	s = splsoftclock();
-	simple_lock(&ds->ds_slock);
+	mutex_enter(&ds->ds_lock);
 
 	while (uio->uio_resid != 0) {
 
@@ -377,9 +412,7 @@
 					goto out;
 				}
 				ds->ds_flags |= DMIO_STATE_READ_WAIT;
-				error = ltsleep(&ds->ds_complete,
-				    PRIBIO | PCATCH, "dmvrrd", 0,
-				    &ds->ds_slock);
+				error = cv_wait_sig(&ds->ds_complete_cv, &ds->ds_lock);
 				if (error)
 					goto out;
 				continue;
@@ -389,7 +422,7 @@
 			ds->ds_nreqs--;
 			if (ds->ds_flags & DMIO_STATE_WRITE_WAIT) {
 				ds->ds_flags &= ~DMIO_STATE_WRITE_WAIT;
-				wakeup(&ds->ds_nreqs);
+				cv_broadcast(&ds->ds_nreqs_cv);
 			}
 			if (ds->ds_flags & DMIO_STATE_SEL) {
 				ds->ds_flags &= ~DMIO_STATE_SEL;
@@ -398,8 +431,6 @@
 			break;
 		}
 
-		simple_unlock(&ds->ds_slock);
-
 		dreq = dus->dus_req;
 		resp.resp_id = dus->dus_id;
 		if (dreq->dreq_flags & DMOVER_REQ_ERROR)
@@ -412,7 +443,7 @@
 
 		dmio_usrreq_fini(ds, dus);
 
-		splx(s);
+		mutex_exit(&ds->ds_lock);
 
 		progress = 1;
 
@@ -422,13 +453,11 @@
 		if (error)
 			return (error);
 
-		s = splsoftclock();
-		simple_lock(&ds->ds_slock);
+		mutex_enter(&ds->ds_lock);
 	}
 
  out:
-	simple_unlock(&ds->ds_slock);
-	splx(s);
+	mutex_exit(&ds->ds_lock);
 
 	return (error);
 }
@@ -446,30 +475,29 @@
 
 	/* We're already at splsoftclock(). */
 
-	simple_lock(&ds->ds_slock);
+	mutex_enter(&ds->ds_lock);
 	TAILQ_REMOVE(&ds->ds_pending, dus, dus_q);
 	if (ds->ds_flags & DMIO_STATE_DEAD) {
-		ds->ds_nreqs--;
+		int nreqs = --ds->ds_nreqs;
+		mutex_exit(&ds->ds_lock);
 		dmio_usrreq_fini(ds, dus);
 		dmover_request_free(dreq);
-		if (ds->ds_nreqs == 0) {
-			simple_unlock(&ds->ds_slock);
-			seldestroy(&ds->ds_selq);
-			pool_put(&dmio_state_pool, ds);
-			return;
-		}
-	} else {
-		TAILQ_INSERT_TAIL(&ds->ds_complete, dus, dus_q);
-		if (ds->ds_flags & DMIO_STATE_READ_WAIT) {
-			ds->ds_flags &= ~DMIO_STATE_READ_WAIT;
-			wakeup(&ds->ds_complete);
-		}
-		if (ds->ds_flags & DMIO_STATE_SEL) {
-			ds->ds_flags &= ~DMIO_STATE_SEL;
-			selnotify(&ds->ds_selq, POLLOUT | POLLWRNORM, 0);
+		if (nreqs == 0) {
+			dmio_state_put(ds);
 		}
+		return;
+	}
+
+	TAILQ_INSERT_TAIL(&ds->ds_complete, dus, dus_q);
+	if (ds->ds_flags & DMIO_STATE_READ_WAIT) {
+		ds->ds_flags &= ~DMIO_STATE_READ_WAIT;
+		cv_broadcast(&ds->ds_complete_cv);
 	}
-	simple_unlock(&ds->ds_slock);
+	if (ds->ds_flags & DMIO_STATE_SEL) {
+		ds->ds_flags &= ~DMIO_STATE_SEL;
+		selnotify(&ds->ds_selq, POLLOUT | POLLWRNORM, 0);
+	}
+	mutex_exit(&ds->ds_lock);
 }
 
 /*
@@ -485,7 +513,7 @@
 	struct dmio_usrreq_state *dus;
 	struct dmover_request *dreq;
 	struct dmio_usrreq req;
-	int error = 0, s, progress = 0;
+	int error = 0, progress = 0;
 
 	if ((uio->uio_resid % sizeof(req)) != 0)
 		return (EINVAL);
@@ -494,8 +522,7 @@
 		return (ENXIO);
 
 	getnanotime(&ds->ds_mtime);
-	s = splsoftclock();
-	simple_lock(&ds->ds_slock);
+	mutex_enter(&ds->ds_lock);
 
 	while (uio->uio_resid != 0) {
 
@@ -505,8 +532,7 @@
 				break;
 			}
 			ds->ds_flags |= DMIO_STATE_WRITE_WAIT;
-			error = ltsleep(&ds->ds_nreqs, PRIBIO | PCATCH,
-			    "dmiowr", 0, &ds->ds_slock);
+			error = cv_wait_sig(&ds->ds_complete_cv, &ds->ds_lock);
 			if (error)
 				break;
 			continue;
@@ -514,15 +540,13 @@
 
 		ds->ds_nreqs++;
 
-		simple_unlock(&ds->ds_slock);
-		splx(s);
+		mutex_exit(&ds->ds_lock);
 
 		progress = 1;
 
 		error = uiomove(&req, sizeof(req), uio);
 		if (error) {
-			s = splsoftclock();
-			simple_lock(&ds->ds_slock);
+			mutex_enter(&ds->ds_lock);
 			ds->ds_nreqs--;
 			break;
 		}
@@ -531,23 +555,17 @@
 		dreq = dmover_request_alloc(ds->ds_session, NULL);
 		if (dreq == NULL) {
 			/* XXX */
-			s = splsoftclock();
-			simple_lock(&ds->ds_slock);
 			ds->ds_nreqs--;
 			error = ENOMEM;
-			break;
+			return error;
 		}
-		s = splsoftclock();
 		dus = pool_get(&dmio_usrreq_state_pool, PR_WAITOK);
-		splx(s);
 
 		error = dmio_usrreq_init(fp, dus, &req, dreq);
 		if (error) {
 			dmover_request_free(dreq);
-			s = splsoftclock();
 			pool_put(&dmio_usrreq_state_pool, dus);
-			simple_lock(&ds->ds_slock);
-			break;
+			return error;
 		}
 
 		dreq->dreq_callback = dmio_usrreq_done;
@@ -556,22 +574,18 @@
 		dus->dus_req = dreq;
 		dus->dus_id = req.req_id;
 
-		s = splsoftclock();
-		simple_lock(&ds->ds_slock);
+		mutex_enter(&ds->ds_lock);
 
 		TAILQ_INSERT_TAIL(&ds->ds_pending, dus, dus_q);
 
-		simple_unlock(&ds->ds_slock);
-		splx(s);
+		mutex_exit(&ds->ds_lock);
 
 		dmover_process(dreq);
 
-		s = splsoftclock();
-		simple_lock(&ds->ds_slock);
+		mutex_enter(&ds->ds_lock);
 	}
 
-	simple_unlock(&ds->ds_slock);
-	splx(s);
+	mutex_exit(&ds->ds_lock);
 
 	return (error);
 }
@@ -602,7 +616,7 @@
 dmio_ioctl(struct file *fp, u_long cmd, void *data)
 {
 	struct dmio_state *ds = (struct dmio_state *) fp->f_data;
-	int error, s;
+	int error;
 
 	switch (cmd) {
 	case FIONBIO:
@@ -614,26 +628,22 @@
 		struct dmio_setfunc *dsf = data;
 		struct dmover_session *dses;
 
-		s = splsoftclock();
-		simple_lock(&ds->ds_slock);
+		mutex_enter(&ds->ds_lock);
 
 		if (ds->ds_session != NULL ||
 		    (ds->ds_flags & DMIO_STATE_LARVAL) != 0) {
-			simple_unlock(&ds->ds_slock);
-			splx(s);
+			mutex_exit(&ds->ds_lock);
 			return (EBUSY);
 		}
 
 		ds->ds_flags |= DMIO_STATE_LARVAL;
 
-		simple_unlock(&ds->ds_slock);
-		splx(s);
+		mutex_exit(&ds->ds_lock);
 
 		dsf->dsf_name[DMIO_MAX_FUNCNAME - 1] = '\0';
 		error = dmover_session_create(dsf->dsf_name, &dses);
 
-		s = splsoftclock();
-		simple_lock(&ds->ds_slock);
+		mutex_enter(&ds->ds_lock);
 
 		if (error == 0) {
 			dses->dses_cookie = ds;
@@ -641,8 +651,7 @@
 		}
 		ds->ds_flags &= ~DMIO_STATE_LARVAL;
 
-		simple_unlock(&ds->ds_slock);
-		splx(s);
+		mutex_exit(&ds->ds_lock);
 		break;
 	    }
 
@@ -662,13 +671,12 @@
 dmio_poll(struct file *fp, int events)
 {
 	struct dmio_state *ds = (struct dmio_state *) fp->f_data;
-	int s, revents = 0;
+	int revents = 0;
 
 	if ((events & (POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM)) == 0)
 		return (revents);
 
-	s = splsoftclock();
-	simple_lock(&ds->ds_slock);
+	mutex_enter(&ds->ds_lock);
 
 	if (ds->ds_flags & DMIO_STATE_DEAD) {
 		/* EOF */
@@ -696,8 +704,7 @@
 	}
 
  out:
-	simple_unlock(&ds->ds_slock);
-	splx(s);
+	mutex_exit(&ds->ds_lock);
 
 	return (revents);
 }
@@ -713,10 +720,8 @@
 	struct dmio_state *ds = (struct dmio_state *) fp->f_data;
 	struct dmio_usrreq_state *dus;
 	struct dmover_session *dses;
-	int s;
 
-	s = splsoftclock();
-	simple_lock(&ds->ds_slock);
+	mutex_enter(&ds->ds_lock);
 
 	ds->ds_flags |= DMIO_STATE_DEAD;
 
@@ -724,8 +729,10 @@
 	while ((dus = TAILQ_FIRST(&ds->ds_complete)) != NULL) {
 		TAILQ_REMOVE(&ds->ds_complete, dus, dus_q);
 		ds->ds_nreqs--;
+		mutex_exit(&ds->ds_lock);
 		dmover_request_free(dus->dus_req);
 		dmio_usrreq_fini(ds, dus);
+		mutex_enter(&ds->ds_lock);
 	}
 
 	/*
@@ -734,16 +741,13 @@
 	 */
 	if (ds->ds_nreqs == 0) {
 		dses = ds->ds_session;
-		simple_unlock(&ds->ds_slock);
-		seldestroy(&ds->ds_selq);
-		pool_put(&dmio_state_pool, ds);
+		mutex_exit(&ds->ds_lock);
+		dmio_state_put(ds);
 	} else {
 		dses = NULL;
-		simple_unlock(&ds->ds_slock);
+		mutex_exit(&ds->ds_lock);
 	}
 
-	splx(s);
-
 	fp->f_data = NULL;
 
 	if (dses != NULL)
@@ -774,23 +778,12 @@
 {
 	struct dmio_state *ds;
 	struct file *fp;
-	int error, fd, s;
+	int error, fd;
 
-	/* falloc() will use the descriptor for us. */
 	if ((error = fd_allocfile(&fp, &fd)) != 0)
 		return (error);
 
-	s = splsoftclock();
-	ds = pool_get(&dmio_state_pool, PR_WAITOK);
-	splx(s);
-	getnanotime(&ds->ds_btime);
-	ds->ds_atime = ds->ds_mtime = ds->ds_btime;
-
-	memset(ds, 0, sizeof(*ds));
-	simple_lock_init(&ds->ds_slock);
-	TAILQ_INIT(&ds->ds_pending);
-	TAILQ_INIT(&ds->ds_complete);
-	selinit(&ds->ds_selq);
+	ds = dmio_state_get();
 
 	return fd_clone(fp, fd, flag, &dmio_fileops, ds);
 }

Reply via email to