PERFORCE change 71286 for review
Scott Long
scottl at FreeBSD.org
Fri Feb 18 19:59:10 PST 2005
http://perforce.freebsd.org/chv.cgi?CH=71286
Change 71286 by scottl at scottl-junior on 2005/02/19 03:58:52
IFC rev 1.149 of cam_xpt.c
Affected files ...
.. //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.c#12 integrate
Differences ...
==== //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.c#12 (text+ko) ====
@@ -28,7 +28,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/cam/cam_xpt.c,v 1.148 2005/01/25 08:59:06 mr Exp $");
+__FBSDID("$FreeBSD: src/sys/cam/cam_xpt.c,v 1.149 2005/02/09 11:44:15 scottl Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -44,6 +44,9 @@
#include <sys/sbuf.h>
#include <vm/uma.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+
#ifdef PC98
#include <pc98/pc98/pc98_machdep.h> /* geometry translation */
#endif
@@ -485,6 +488,7 @@
/* Queues for our software interrupt handler */
typedef TAILQ_HEAD(cam_isrq, ccb_hdr) cam_isrq_t;
static cam_isrq_t cam_bioq;
+static struct mtx cam_bioq_lock;
/* "Pool" of inactive ccbs managed by xpt_alloc_ccb and xpt_free_ccb */
static SLIST_HEAD(,ccb_hdr) ccb_freeq;
@@ -1221,6 +1225,8 @@
SLIST_INIT(&ccb_freeq);
STAILQ_INIT(&highpowerq);
+ mtx_init(&cam_bioq_lock, "CAM BIOQ lock", NULL, MTX_DEF);
+
/* Create the CCB zone */
ccb_zone = uma_zcreate("CAM CCB Pool", sizeof(union ccb), NULL, NULL,
NULL, NULL, 0, 0);
@@ -4673,8 +4679,6 @@
{
int s;
- GIANT_REQUIRED;
-
s = splcam();
CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_TRACE, ("xpt_done\n"));
@@ -4685,9 +4689,11 @@
*/
switch (done_ccb->ccb_h.path->periph->type) {
case CAM_PERIPH_BIO:
+ mtx_lock(&cam_bioq_lock);
TAILQ_INSERT_TAIL(&cam_bioq, &done_ccb->ccb_h,
sim_links.tqe);
done_ccb->ccb_h.pinfo.index = CAM_DONEQ_INDEX;
+ mtx_unlock(&cam_bioq_lock);
swi_sched(cambio_ih, 0);
break;
default:
@@ -6127,15 +6133,26 @@
static void
camisr(void *V_queue)
{
- cam_isrq_t *queue = V_queue;
+ cam_isrq_t *oqueue = V_queue;
+ cam_isrq_t queue;
int s;
struct ccb_hdr *ccb_h;
+ /*
+ * Transfer the ccb_bioq list to a temporary list so we can operate
+ * on it without needing to lock/unlock on every loop. The concat
+ * function with re-init the real list for us.
+ */
s = splcam();
- while ((ccb_h = TAILQ_FIRST(queue)) != NULL) {
+ mtx_lock(&cam_bioq_lock);
+ TAILQ_INIT(&queue);
+ TAILQ_CONCAT(&queue, oqueue, sim_links.tqe);
+ mtx_unlock(&cam_bioq_lock);
+
+ while ((ccb_h = TAILQ_FIRST(&queue)) != NULL) {
int runq;
- TAILQ_REMOVE(queue, ccb_h, sim_links.tqe);
+ TAILQ_REMOVE(&queue, ccb_h, sim_links.tqe);
ccb_h->pinfo.index = CAM_UNQUEUED_INDEX;
splx(s);
More information about the p4-projects
mailing list