Module Name:    src
Committed By:   ahoka
Date:           Sun May  1 14:48:11 UTC 2011

Modified Files:
        src/sys/dev/nand: nand.h nand_io.c

Log Message:
fix some bugs and simplify locking
from rmind


To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/sys/dev/nand/nand.h
cvs rdiff -u -r1.5 -r1.6 src/sys/dev/nand/nand_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/nand/nand.h
diff -u src/sys/dev/nand/nand.h:1.8 src/sys/dev/nand/nand.h:1.9
--- src/sys/dev/nand/nand.h:1.8	Tue Apr 26 17:31:57 2011
+++ src/sys/dev/nand/nand.h	Sun May  1 14:48:11 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: nand.h,v 1.8 2011/04/26 17:31:57 ahoka Exp $	*/
+/*	$NetBSD: nand.h,v 1.9 2011/05/01 14:48:11 ahoka Exp $	*/
 
 /*-
  * Copyright (c) 2010 Department of Software Engineering,
@@ -141,6 +141,9 @@
 	daddr_t nwc_block;
 	kmutex_t nwc_lock;
 	bool nwc_write_pending;
+	struct lwp *nwc_thread;
+	kcondvar_t nwc_cv;
+	bool nwc_exiting;
 };
 
 /* driver softc for nand */
@@ -154,13 +157,7 @@
 	size_t sc_part_offset;
 	size_t sc_part_size;
 	kmutex_t sc_device_lock; /* serialize access to chip */
-
-	/* for the i/o thread */
-	struct lwp *sc_sync_thread;
 	struct nand_write_cache sc_cache;
-	kmutex_t sc_io_lock;
-	kcondvar_t sc_io_cv;
-	bool sc_io_running;
 };
 
 /* structure holding the nand api */

Index: src/sys/dev/nand/nand_io.c
diff -u src/sys/dev/nand/nand_io.c:1.5 src/sys/dev/nand/nand_io.c:1.6
--- src/sys/dev/nand/nand_io.c:1.5	Sun May  1 13:20:28 2011
+++ src/sys/dev/nand/nand_io.c	Sun May  1 14:48:11 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: nand_io.c,v 1.5 2011/05/01 13:20:28 rmind Exp $	*/
+/*	$NetBSD: nand_io.c,v 1.6 2011/05/01 14:48:11 ahoka Exp $	*/
 
 /*-
  * Copyright (c) 2011 Department of Software Engineering,
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nand_io.c,v 1.5 2011/05/01 13:20:28 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nand_io.c,v 1.6 2011/05/01 14:48:11 ahoka Exp $");
 
 #include <sys/param.h>
 #include <sys/buf.h>
@@ -109,31 +109,27 @@
 
 	sc->sc_cache.nwc_data = kmem_alloc(chip->nc_block_size, KM_SLEEP);
 
-	mutex_init(&sc->sc_io_lock, MUTEX_DEFAULT, IPL_NONE);
 	mutex_init(&wc->nwc_lock, MUTEX_DEFAULT, IPL_NONE);
-	cv_init(&sc->sc_io_cv, "nandcv");
+	cv_init(&wc->nwc_cv, "nandcv");
 
 	error = bufq_alloc(&wc->nwc_bufq, "fcfs", BUFQ_SORT_RAWBLOCK);
 	if (error)
 		goto err_bufq;
 
-	sc->sc_io_running = true;
+	wc->nwc_exiting = false;
 	wc->nwc_write_pending = false;
 
 	/* arrange to allocate the kthread */
 	error = kthread_create(PRI_NONE, KTHREAD_JOINABLE | KTHREAD_MPSAFE,
-	    NULL, nand_sync_thread, self, &sc->sc_sync_thread, "nandio");
+	    NULL, nand_sync_thread, self, &wc->nwc_thread, "nandio");
 
 	if (!error)
 		return 0;
 
 	bufq_free(wc->nwc_bufq);
 err_bufq:
-	cv_destroy(&sc->sc_io_cv);
-
-	mutex_destroy(&sc->sc_io_lock);
+	cv_destroy(&wc->nwc_cv);
 	mutex_destroy(&wc->nwc_lock);
-	
 	kmem_free(sc->sc_cache.nwc_data, chip->nc_block_size);
 
 	return error;
@@ -148,27 +144,17 @@
 
 	DPRINTF(("stopping nand io thread\n"));
 
-	kmem_free(wc->nwc_data, chip->nc_block_size);
-
-	sc->sc_io_running = false;
-
-	mutex_enter(&sc->sc_io_lock);
-	cv_broadcast(&sc->sc_io_cv);
-	mutex_exit(&sc->sc_io_lock);
+	mutex_enter(&wc->nwc_lock);
+	wc->nwc_exiting = true;
+	cv_broadcast(&wc->nwc_cv);
+	mutex_exit(&wc->nwc_lock);
 
-	kthread_join(sc->sc_sync_thread);
+	kthread_join(wc->nwc_thread);
 
+	kmem_free(wc->nwc_data, chip->nc_block_size);
 	bufq_free(wc->nwc_bufq);
 	mutex_destroy(&wc->nwc_lock);
-
-#ifdef DIAGNOSTIC
-	mutex_enter(&sc->sc_io_lock);
-	KASSERT(!cv_has_waiters(&sc->sc_io_cv));
-	mutex_exit(&sc->sc_io_lock);
-#endif
-
-	cv_destroy(&sc->sc_io_cv);
-	mutex_destroy(&sc->sc_io_lock);
+	cv_destroy(&wc->nwc_cv);
 }
 
 int
@@ -179,7 +165,7 @@
 
 	DPRINTF(("submitting job to nand io thread: %p\n", bp));
 
-	if (__predict_false(!sc->sc_io_running)) {
+	if (__predict_false(wc->nwc_exiting)) {
 		nand_io_done(self, bp, ENODEV);
 		return ENODEV;
 	}
@@ -211,6 +197,7 @@
 	daddr_t base, offset;
 	int error;
 
+	KASSERT(mutex_owned(&wc->nwc_lock));
 	KASSERT(chip->nc_block_size != 0);
 
 	base = block * chip->nc_block_size;
@@ -247,7 +234,6 @@
 	return 0;
 }
 
-/* must be called with nwc_lock hold */
 void
 nand_io_cache_sync(device_t self)
 {
@@ -260,6 +246,8 @@
 	daddr_t base;
 	int error;
 
+	KASSERT(mutex_owned(&wc->nwc_lock));
+
 	if (!wc->nwc_write_pending) {
 		DPRINTF(("trying to sync with an invalid buffer\n"));
 		return;
@@ -305,18 +293,12 @@
 	struct nand_write_cache *wc = &sc->sc_cache;
 	struct bintime now;
 
-	/* sync thread waking in every seconds */
-	while (sc->sc_io_running) {
-		mutex_enter(&sc->sc_io_lock);
-		cv_timedwait_sig(&sc->sc_io_cv, &sc->sc_io_lock, hz / 4);
-		mutex_exit(&sc->sc_io_lock);
-
-		mutex_enter(&wc->nwc_lock);
+	mutex_enter(&wc->nwc_lock);
+	while (!wc->nwc_exiting) {
+		cv_timedwait_sig(&wc->nwc_cv, &wc->nwc_lock, hz / 4);
 		if (!wc->nwc_write_pending) {
-			mutex_exit(&wc->nwc_lock);
 			continue;
 		}
-
 		/* see if the cache is older than 3 seconds (safety limit),
 		 * or if we havent touched the cache since more than 1 ms
 		 */
@@ -328,8 +310,8 @@
 			printf("syncing write cache after timeout\n");
 			nand_io_cache_sync(self);
 		}
-		mutex_exit(&wc->nwc_lock);
 	}
+	mutex_exit(&wc->nwc_lock);
 	kthread_exit(0);
 }
 

Reply via email to