Module Name:    src
Committed By:   snj
Date:           Fri May  1 02:18:29 UTC 2009

Modified Files:
        src/sys/dev/raidframe [netbsd-5]: rf_dagfuncs.c rf_diskqueue.c
            rf_diskqueue.h

Log Message:
Pull up following revision(s) (requested by oster in ticket #607):
        sys/dev/raidframe/rf_dagfuncs.c: revision 1.30
        sys/dev/raidframe/rf_diskqueue.c: revision 1.52
        sys/dev/raidframe/rf_diskqueue.h: revision 1.23
Rework/simplify the disk queuing code.  A bunch of this was still
holdovers from the simulator and would never be seen/used in-kernel.


To generate a diff of this commit:
cvs rdiff -u -r1.29 -r1.29.52.1 src/sys/dev/raidframe/rf_dagfuncs.c
cvs rdiff -u -r1.51 -r1.51.6.1 src/sys/dev/raidframe/rf_diskqueue.c
cvs rdiff -u -r1.22 -r1.22.52.1 src/sys/dev/raidframe/rf_diskqueue.h

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/raidframe/rf_dagfuncs.c
diff -u src/sys/dev/raidframe/rf_dagfuncs.c:1.29 src/sys/dev/raidframe/rf_dagfuncs.c:1.29.52.1
--- src/sys/dev/raidframe/rf_dagfuncs.c:1.29	Sun Mar  4 06:02:36 2007
+++ src/sys/dev/raidframe/rf_dagfuncs.c	Fri May  1 02:18:29 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: rf_dagfuncs.c,v 1.29 2007/03/04 06:02:36 christos Exp $	*/
+/*	$NetBSD: rf_dagfuncs.c,v 1.29.52.1 2009/05/01 02:18:29 snj Exp $	*/
 /*
  * Copyright (c) 1995 Carnegie-Mellon University.
  * All rights reserved.
@@ -48,7 +48,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rf_dagfuncs.c,v 1.29 2007/03/04 06:02:36 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rf_dagfuncs.c,v 1.29.52.1 2009/05/01 02:18:29 snj Exp $");
 
 #include <sys/param.h>
 #include <sys/ioctl.h>
@@ -366,7 +366,7 @@
 	     NULL,
 #endif
 	    (void *) (node->dagHdr->raidPtr),
-	    RF_UNLOCK_DISK_QUEUE, NULL, PR_NOWAIT);
+	    0, NULL, PR_NOWAIT);
 	if (!req)
 		(node->wakeFunc) (node, ENOMEM);
 	else {

Index: src/sys/dev/raidframe/rf_diskqueue.c
diff -u src/sys/dev/raidframe/rf_diskqueue.c:1.51 src/sys/dev/raidframe/rf_diskqueue.c:1.51.6.1
--- src/sys/dev/raidframe/rf_diskqueue.c:1.51	Tue Jun 17 14:53:11 2008
+++ src/sys/dev/raidframe/rf_diskqueue.c	Fri May  1 02:18:29 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: rf_diskqueue.c,v 1.51 2008/06/17 14:53:11 reinoud Exp $	*/
+/*	$NetBSD: rf_diskqueue.c,v 1.51.6.1 2009/05/01 02:18:29 snj Exp $	*/
 /*
  * Copyright (c) 1995 Carnegie-Mellon University.
  * All rights reserved.
@@ -66,7 +66,7 @@
  ****************************************************************************/
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rf_diskqueue.c,v 1.51 2008/06/17 14:53:11 reinoud Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rf_diskqueue.c,v 1.51.6.1 2009/05/01 02:18:29 snj Exp $");
 
 #include <dev/raidframe/raidframevar.h>
 
@@ -169,7 +169,6 @@
 	diskqueue->queueLength = 0;
 	diskqueue->maxOutstanding = maxOutstanding;
 	diskqueue->curPriority = RF_IO_NORMAL_PRIORITY;
-	diskqueue->nextLockingOp = NULL;
 	diskqueue->flags = 0;
 	diskqueue->raidPtr = raidPtr;
 	diskqueue->rf_cinfo = &raidPtr->raid_cinfo[c];
@@ -252,10 +251,6 @@
 }
 /* Enqueue a disk I/O
  *
- * Unfortunately, we have to do things differently in the different
- * environments (simulator, user-level, kernel).
- * At user level, all I/O is blocking, so we have 1 or more threads/disk
- * and the thread that enqueues is different from the thread that dequeues.
  * In the kernel, I/O is non-blocking and so we'd like to have multiple
  * I/Os outstanding on the physical disks when possible.
  *
@@ -264,20 +259,10 @@
  *    queue it up
  *
  * kernel rules for when to do what:
- *    locking request:  queue empty => dispatch and lock queue,
- *                      else queue it
  *    unlocking req  :  always dispatch it
  *    normal req     :  queue empty => dispatch it & set priority
  *                      queue not full & priority is ok => dispatch it
  *                      else queue it
- *
- * user-level rules:
- *    always enqueue.  In the special case of an unlocking op, enqueue
- *    in a special way that will cause the unlocking op to be the next
- *    thing dequeued.
- *
- * simulator rules:
- *    Do the same as at user level, with the sleeps and wakeups suppressed.
  */
 void
 rf_DiskIOEnqueue(RF_DiskQueue_t *queue, RF_DiskQueueData_t *req, int pri)
@@ -291,65 +276,27 @@
 		printf("Warning: Enqueueing zero-sector access\n");
 	}
 #endif
-	/*
-         * kernel
-         */
 	RF_LOCK_QUEUE_MUTEX(queue, "DiskIOEnqueue");
-	/* locking request */
-	if (RF_LOCKING_REQ(req)) {
-		if (RF_QUEUE_EMPTY(queue)) {
-			Dprintf2("Dispatching pri %d locking op to c %d (queue empty)\n", pri, queue->col);
-			RF_LOCK_QUEUE(queue);
-			rf_DispatchKernelIO(queue, req);
-		} else {
-			queue->queueLength++;	/* increment count of number
-						 * of requests waiting in this
-						 * queue */
-			Dprintf2("Enqueueing pri %d locking op to c %d (queue not empty)\n", pri, queue->col);
-			req->queue = (void *) queue;
-			(queue->qPtr->Enqueue) (queue->qHdr, req, pri);
-		}
+	if (RF_OK_TO_DISPATCH(queue, req)) {
+		Dprintf2("Dispatching pri %d regular op to c %d (ok to dispatch)\n", pri, queue->col);
+		rf_DispatchKernelIO(queue, req);
+	} else {
+		queue->queueLength++;	/* increment count of number of requests waiting in this queue */
+		Dprintf2("Enqueueing pri %d regular op to c %d (not ok to dispatch)\n", pri, queue->col);
+		req->queue = (void *) queue;
+		(queue->qPtr->Enqueue) (queue->qHdr, req, pri);
 	}
-	/* unlocking request */
-	else
-		if (RF_UNLOCKING_REQ(req)) {	/* we'll do the actual unlock
-						 * when this I/O completes */
-			Dprintf2("Dispatching pri %d unlocking op to c %d\n", pri, queue->col);
-			RF_ASSERT(RF_QUEUE_LOCKED(queue));
-			rf_DispatchKernelIO(queue, req);
-		}
-	/* normal request */
-		else
-			if (RF_OK_TO_DISPATCH(queue, req)) {
-				Dprintf2("Dispatching pri %d regular op to c %d (ok to dispatch)\n", pri, queue->col);
-				rf_DispatchKernelIO(queue, req);
-			} else {
-				queue->queueLength++;	/* increment count of
-							 * number of requests
-							 * waiting in this queue */
-				Dprintf2("Enqueueing pri %d regular op to c %d (not ok to dispatch)\n", pri, queue->col);
-				req->queue = (void *) queue;
-				(queue->qPtr->Enqueue) (queue->qHdr, req, pri);
-			}
 	RF_UNLOCK_QUEUE_MUTEX(queue, "DiskIOEnqueue");
 }
 
 
-/* get the next set of I/Os started, kernel version only */
+/* get the next set of I/Os started */
 void
 rf_DiskIOComplete(RF_DiskQueue_t *queue, RF_DiskQueueData_t *req, int status)
 {
 	int     done = 0;
 
 	RF_LOCK_QUEUE_MUTEX(queue, "DiskIOComplete");
-
-	/* unlock the queue: (1) after an unlocking req completes (2) after a
-	 * locking req fails */
-	if (RF_UNLOCKING_REQ(req) || (RF_LOCKING_REQ(req) && status)) {
-		Dprintf1("DiskIOComplete: unlocking queue at c %d\n", queue->col);
-		RF_ASSERT(RF_QUEUE_LOCKED(queue));
-		RF_UNLOCK_QUEUE(queue);
-	}
 	queue->numOutstanding--;
 	RF_ASSERT(queue->numOutstanding >= 0);
 
@@ -357,64 +304,27 @@
 	/* no reason to continue once we've filled up the queue */
 	/* no reason to even start if the queue is locked */
 
-	while (!done && !RF_QUEUE_FULL(queue) && !RF_QUEUE_LOCKED(queue)) {
-		if (queue->nextLockingOp) {
-			req = queue->nextLockingOp;
-			queue->nextLockingOp = NULL;
-			Dprintf2("DiskIOComplete: a pri %d locking req was pending at c %d\n", req->priority, queue->col);
-		} else {
-			req = (queue->qPtr->Dequeue) (queue->qHdr);
-			if (req != NULL) {
-				Dprintf2("DiskIOComplete: extracting pri %d req from queue at c %d\n", req->priority, queue->col);
-			} else {
-				Dprintf1("DiskIOComplete: no more requests to extract.\n", "");
-			}
-		}
+	while (!done && !RF_QUEUE_FULL(queue)) {
+		req = (queue->qPtr->Dequeue) (queue->qHdr);
 		if (req) {
-			queue->queueLength--;	/* decrement count of number
-						 * of requests waiting in this
-						 * queue */
+			Dprintf2("DiskIOComplete: extracting pri %d req from queue at c %d\n", req->priority, queue->col);
+			queue->queueLength--;	/* decrement count of number of requests waiting in this queue */
 			RF_ASSERT(queue->queueLength >= 0);
-		}
-		if (!req)
+			if (RF_OK_TO_DISPATCH(queue, req)) {
+				Dprintf2("DiskIOComplete: dispatching pri %d regular req to c %d (ok to dispatch)\n", req->priority, queue->col);
+				rf_DispatchKernelIO(queue, req);
+			} else {	
+				/* we can't dispatch it, so just re-enqueue it.  
+				   potential trouble here if disk queues batch reqs */
+				Dprintf2("DiskIOComplete: re-enqueueing pri %d regular req to c %d\n", req->priority, queue->col);
+				queue->queueLength++;
+				(queue->qPtr->Enqueue) (queue->qHdr, req, req->priority);
+				done = 1;
+			}
+		} else {	
+			Dprintf1("DiskIOComplete: no more requests to extract.\n", "");
 			done = 1;
-		else
-			if (RF_LOCKING_REQ(req)) {
-				if (RF_QUEUE_EMPTY(queue)) {	/* dispatch it */
-					Dprintf2("DiskIOComplete: dispatching pri %d locking req to c %d (queue empty)\n", req->priority, queue->col);
-					RF_LOCK_QUEUE(queue);
-					rf_DispatchKernelIO(queue, req);
-					done = 1;
-				} else {	/* put it aside to wait for
-						 * the queue to drain */
-					Dprintf2("DiskIOComplete: postponing pri %d locking req to c %d\n", req->priority, queue->col);
-					RF_ASSERT(queue->nextLockingOp == NULL);
-					queue->nextLockingOp = req;
-					done = 1;
-				}
-			} else
-				if (RF_UNLOCKING_REQ(req)) {	/* should not happen:
-								 * unlocking ops should
-								 * not get queued */
-					RF_ASSERT(RF_QUEUE_LOCKED(queue));	/* support it anyway for
-										 * the future */
-					Dprintf2("DiskIOComplete: dispatching pri %d unl req to c %d (SHOULD NOT SEE THIS)\n", req->priority, queue->col);
-					rf_DispatchKernelIO(queue, req);
-					done = 1;
-				} else
-					if (RF_OK_TO_DISPATCH(queue, req)) {
-						Dprintf2("DiskIOComplete: dispatching pri %d regular req to c %d (ok to dispatch)\n", req->priority, queue->col);
-						rf_DispatchKernelIO(queue, req);
-					} else {	/* we can't dispatch it,
-							 * so just re-enqueue
-							 * it.  */
-						/* potential trouble here if
-						 * disk queues batch reqs */
-						Dprintf2("DiskIOComplete: re-enqueueing pri %d regular req to c %d\n", req->priority, queue->col);
-						queue->queueLength++;
-						(queue->qPtr->Enqueue) (queue->qHdr, req, req->priority);
-						done = 1;
-					}
+		}
 	}
 
 	RF_UNLOCK_QUEUE_MUTEX(queue, "DiskIOComplete");

Index: src/sys/dev/raidframe/rf_diskqueue.h
diff -u src/sys/dev/raidframe/rf_diskqueue.h:1.22 src/sys/dev/raidframe/rf_diskqueue.h:1.22.52.1
--- src/sys/dev/raidframe/rf_diskqueue.h:1.22	Sun Mar  4 06:02:37 2007
+++ src/sys/dev/raidframe/rf_diskqueue.h	Fri May  1 02:18:29 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: rf_diskqueue.h,v 1.22 2007/03/04 06:02:37 christos Exp $	*/
+/*	$NetBSD: rf_diskqueue.h,v 1.22.52.1 2009/05/01 02:18:29 snj Exp $	*/
 /*
  * Copyright (c) 1995 Carnegie-Mellon University.
  * All rights reserved.
@@ -82,8 +82,6 @@
 	int  error;             /* Indicate if an error occurred
 				   on this I/O (1=yes, 0=no) */
 };
-#define RF_LOCK_DISK_QUEUE   0x01
-#define RF_UNLOCK_DISK_QUEUE 0x02
 
 /* note: "Create" returns type-specific queue header pointer cast to (void *) */
 struct RF_DiskQueueSW_s {
@@ -114,10 +112,6 @@
 	int     curPriority;	/* the priority of accs all that are currently
 				 * outstanding */
 	long    queueLength;	/* number of requests in queue */
-	RF_DiskQueueData_t *nextLockingOp;	/* a locking op that has
-						 * arrived at the head of the
-						 * queue & is waiting for
-						 * drainage */
 	RF_DiskQueueFlags_t flags;	/* terminate, locked */
 	RF_Raid_t *raidPtr;	/* associated array */
 	dev_t   dev;		/* device number for kernel version */
@@ -130,19 +124,12 @@
 				 * explicitly unlocked */
 
 /* macros setting & returning information about queues and requests */
-#define RF_QUEUE_LOCKED(_q)                 ((_q)->flags & RF_DQ_LOCKED)
-#define RF_QUEUE_EMPTY(_q)                  (((_q)->numOutstanding == 0) && ((_q)->nextLockingOp == NULL) && !RF_QUEUE_LOCKED(_q))
+#define RF_QUEUE_EMPTY(_q)                  ((_q)->numOutstanding == 0)
 #define RF_QUEUE_FULL(_q)                   ((_q)->numOutstanding == (_q)->maxOutstanding)
 
-#define RF_LOCK_QUEUE(_q)                   (_q)->flags |= RF_DQ_LOCKED
-#define RF_UNLOCK_QUEUE(_q)                 (_q)->flags &= ~RF_DQ_LOCKED
-
 #define RF_LOCK_QUEUE_MUTEX(_q_,_wh_)   RF_LOCK_MUTEX((_q_)->mutex)
 #define RF_UNLOCK_QUEUE_MUTEX(_q_,_wh_) RF_UNLOCK_MUTEX((_q_)->mutex)
 
-#define RF_LOCKING_REQ(_r)                  ((_r)->flags & RF_LOCK_DISK_QUEUE)
-#define RF_UNLOCKING_REQ(_r)                ((_r)->flags & RF_UNLOCK_DISK_QUEUE)
-
 /* whether it is ok to dispatch a regular request */
 #define RF_OK_TO_DISPATCH(_q_,_r_) \
   (RF_QUEUE_EMPTY(_q_) || \

Reply via email to