Module Name:    src
Committed By:   jdolecek
Date:           Mon Sep 17 19:00:43 UTC 2018

Modified Files:
        src/sys/dev/ata [jdolecek-ncqfixes]: ata.c ata_subr.c atavar.h

Log Message:
switch from TAILQ to SIMPLEQ for ata_xfer pending queue to save
space, don't need doubly linked queue


To generate a diff of this commit:
cvs rdiff -u -r1.141.6.3 -r1.141.6.4 src/sys/dev/ata/ata.c
cvs rdiff -u -r1.6.2.2 -r1.6.2.3 src/sys/dev/ata/ata_subr.c
cvs rdiff -u -r1.99.2.2 -r1.99.2.3 src/sys/dev/ata/atavar.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/ata/ata.c
diff -u src/sys/dev/ata/ata.c:1.141.6.3 src/sys/dev/ata/ata.c:1.141.6.4
--- src/sys/dev/ata/ata.c:1.141.6.3	Mon Sep 17 18:36:13 2018
+++ src/sys/dev/ata/ata.c	Mon Sep 17 19:00:43 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: ata.c,v 1.141.6.3 2018/09/17 18:36:13 jdolecek Exp $	*/
+/*	$NetBSD: ata.c,v 1.141.6.4 2018/09/17 19:00:43 jdolecek 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.141.6.3 2018/09/17 18:36:13 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ata.c,v 1.141.6.4 2018/09/17 19:00:43 jdolecek Exp $");
 
 #include "opt_ata.h"
 
@@ -1062,10 +1062,10 @@ ata_exec_xfer(struct ata_channel *chp, s
 	 * recovery commands must be run immediatelly.
 	 */
 	if ((xfer->c_flags & C_RECOVERY) == 0)
-		TAILQ_INSERT_TAIL(&chp->ch_queue->queue_xfer, xfer,
+		SIMPLEQ_INSERT_TAIL(&chp->ch_queue->queue_xfer, xfer,
 		    c_xferchain);
 	else
-		TAILQ_INSERT_HEAD(&chp->ch_queue->queue_xfer, xfer,
+		SIMPLEQ_INSERT_HEAD(&chp->ch_queue->queue_xfer, xfer,
 		    c_xferchain);
 
 	/*
@@ -1073,7 +1073,7 @@ ata_exec_xfer(struct ata_channel *chp, s
 	 */
 	if ((xfer->c_flags & (C_POLL | C_WAIT)) ==  (C_POLL | C_WAIT)) {
 		while (chp->ch_queue->queue_active > 0 ||
-		    TAILQ_FIRST(&chp->ch_queue->queue_xfer) != xfer) {
+		    SIMPLEQ_FIRST(&chp->ch_queue->queue_xfer) != xfer) {
 			xfer->c_flags |= C_WAITACT;
 			cv_wait(&chp->ch_queue->c_active, &chp->ch_lock);
 			xfer->c_flags &= ~C_WAITACT;
@@ -1137,7 +1137,7 @@ again:
 	}
 
 	/* is there a xfer ? */
-	if ((xfer = TAILQ_FIRST(&chp->ch_queue->queue_xfer)) == NULL) {
+	if ((xfer = SIMPLEQ_FIRST(&chp->ch_queue->queue_xfer)) == NULL) {
 		ATADEBUG_PRINT(("%s(chp=%p): channel %d queue_xfer is empty\n",
 		    __func__, chp, chp->ch_channel), DEBUG_XFERS);
 		goto out;
@@ -1207,6 +1207,8 @@ again:
 	else
 		CLR(chp->ch_flags, ATACH_NCQ);
 
+	SIMPLEQ_REMOVE_HEAD(&chq->queue_xfer, c_xferchain);
+
 	ata_activate_xfer_locked(chp, xfer);
 
 	if (atac->atac_cap & ATAC_CAP_NOIRQ)
@@ -1275,7 +1277,6 @@ ata_activate_xfer_locked(struct ata_chan
 	KASSERT(chq->queue_active < chq->queue_openings);
 	KASSERT((chq->active_xfers_used & __BIT(xfer->c_slot)) == 0);
 
-	TAILQ_REMOVE(&chq->queue_xfer, xfer, c_xferchain);
 	if ((xfer->c_flags & C_RECOVERY) == 0)
 		TAILQ_INSERT_TAIL(&chq->active_xfers, xfer, c_activechain);
 	else {
@@ -1419,18 +1420,18 @@ ata_kill_pending(struct ata_drive_datas 
 {
 	struct ata_channel * const chp = drvp->chnl_softc;
 	struct ata_queue * const chq = chp->ch_queue;
-	struct ata_xfer *xfer, *xfernext;
+	struct ata_xfer *xfer;
 
 	ata_channel_lock(chp);
 
 	/* Kill all pending transfers */
-	TAILQ_FOREACH_SAFE(xfer, &chq->queue_xfer, c_xferchain, xfernext) {
+	while ((xfer = SIMPLEQ_FIRST(&chq->queue_xfer))) {
 		KASSERT(xfer->c_chp == chp);
 
 		if (xfer->c_drive != drvp->drive)
 			continue;
 
-		TAILQ_REMOVE(&chp->ch_queue->queue_xfer, xfer, c_xferchain);
+		SIMPLEQ_REMOVE_HEAD(&chp->ch_queue->queue_xfer, c_xferchain);
 
 		/*
 		 * Keep the lock, so that we get deadlock (and 'locking against

Index: src/sys/dev/ata/ata_subr.c
diff -u src/sys/dev/ata/ata_subr.c:1.6.2.2 src/sys/dev/ata/ata_subr.c:1.6.2.3
--- src/sys/dev/ata/ata_subr.c:1.6.2.2	Mon Sep 17 18:36:13 2018
+++ src/sys/dev/ata/ata_subr.c	Mon Sep 17 19:00:43 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: ata_subr.c,v 1.6.2.2 2018/09/17 18:36:13 jdolecek Exp $	*/
+/*	$NetBSD: ata_subr.c,v 1.6.2.3 2018/09/17 19:00:43 jdolecek Exp $	*/
 
 /*
  * Copyright (c) 1998, 2001 Manuel Bouyer.  All rights reserved.
@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ata_subr.c,v 1.6.2.2 2018/09/17 18:36:13 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ata_subr.c,v 1.6.2.3 2018/09/17 19:00:43 jdolecek Exp $");
 
 #include "opt_ata.h"
 
@@ -70,7 +70,7 @@ void
 ata_queue_reset(struct ata_queue *chq)
 {
 	/* make sure that we can use polled commands */
-	TAILQ_INIT(&chq->queue_xfer);
+	SIMPLEQ_INIT(&chq->queue_xfer);
 	TAILQ_INIT(&chq->active_xfers);
 	chq->queue_freeze = 0;
 	chq->queue_active = 0;

Index: src/sys/dev/ata/atavar.h
diff -u src/sys/dev/ata/atavar.h:1.99.2.2 src/sys/dev/ata/atavar.h:1.99.2.3
--- src/sys/dev/ata/atavar.h:1.99.2.2	Mon Sep 17 18:36:13 2018
+++ src/sys/dev/ata/atavar.h	Mon Sep 17 19:00:43 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: atavar.h,v 1.99.2.2 2018/09/17 18:36:13 jdolecek Exp $	*/
+/*	$NetBSD: atavar.h,v 1.99.2.3 2018/09/17 19:00:43 jdolecek Exp $	*/
 
 /*
  * Copyright (c) 1998, 2001 Manuel Bouyer.
@@ -160,7 +160,7 @@ struct ata_xfer {
 #define c_scsipi u.c_scsipi
 
 	/* Link on the command queue. */
-	TAILQ_ENTRY(ata_xfer) c_xferchain;
+	SIMPLEQ_ENTRY(ata_xfer) c_xferchain;
 	TAILQ_ENTRY(ata_xfer) c_activechain;
 
 	/* Links for error handling */
@@ -223,7 +223,7 @@ struct ata_queue {
 #define QF_NEED_XFER	0x02    	/* someone wants xfer */
 	int8_t queue_active; 		/* number of active transfers */
 	uint8_t queue_openings;			/* max number of active xfers */
-	TAILQ_HEAD(, ata_xfer) queue_xfer; 	/* queue of pending commands */
+	SIMPLEQ_HEAD(, ata_xfer) queue_xfer; 	/* queue of pending commands */
 	int queue_freeze; 			/* freeze count for the queue */
 	kcondvar_t queue_busy;			/* c: waiting of xfer */
 	kcondvar_t queue_drain;			/* c: waiting of queue drain */

Reply via email to