PERFORCE change 56041 for review

Scott Long scottl at FreeBSD.org
Mon Jun 28 19:56:59 PDT 2004


http://perforce.freebsd.org/chv.cgi?CH=56041

Change 56041 by scottl at scottl-junior-camlock on 2004/06/29 02:56:12

	Start implementing the da driver work thread.

Affected files ...

.. //depot/projects/scottl-camlock/src/sys/cam/cam_periph.h#2 edit
.. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_da.c#2 edit
.. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_probe.c#2 edit

Differences ...

==== //depot/projects/scottl-camlock/src/sys/cam/cam_periph.h#2 (text+ko) ====

@@ -128,6 +128,21 @@
 	struct buf	*bp[CAM_PERIPH_MAXMAPS];
 };
 
+typedef enum {
+	WORK_EXECUTE_CCB,
+	WORK_XPT_SCHED,
+	WORK_PERIPH_SCHED
+} cam_periph_workflags;
+
+struct cam_periph_workitem {
+	TAILQ_ENTRY(cam_periph_workitem) work_link;
+	cam_periph_workflags		command;
+	void				*data1;
+	void				*data2;
+	void				(*cbfcnp)(void *);
+	void				*cbdata;
+};
+
 cam_status cam_periph_alloc(periph_ctor_t *periph_ctor,
 			    periph_oninv_t *periph_oninvalidate,
 			    periph_dtor_t *periph_dtor,

==== //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_da.c#2 (text+ko) ====

@@ -49,6 +49,9 @@
 #include <sys/eventhandler.h>
 #include <sys/malloc.h>
 #include <sys/cons.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+#include <sys/kthread.h>
 
 #include <machine/md_var.h>
 
@@ -453,6 +456,13 @@
 
 static SLIST_HEAD(,da_softc) softc_list;
 
+static struct proc *da_proc;
+static struct mtx da_workmtx;
+static int da_workflags;
+static TAILQ_HEAD(, cam_periph_workitem) da_worklist;
+
+#define DA_FLAG_EXIT	0x1
+
 static int
 daopen(struct disk *dp)
 {
@@ -745,13 +755,64 @@
 }
 
 static void
+dawork(void *dummy)
+{
+	struct cam_periph_workitem *work;
+
+	mtx_lock(&da_workmtx);
+	while ((da_workflags & DA_FLAG_EXIT) == 0) {
+		if ((work = TAILQ_FIRST(&da_worklist)) == NULL) {
+			msleep(&da_worklist, &da_workmtx, PRIBIO, "dawork", 0);
+			continue;
+		}
+		TAILQ_REMOVE(&da_worklist, work, work_link);
+		mtx_unlock(&da_workmtx);
+
+		switch(work->command) {
+		case WORK_EXECUTE_CCB:
+			mtx_lock(&Giant);
+			xpt_action((union ccb *)work->data1);
+			mtx_unlock(&Giant);
+			break;
+		case WORK_XPT_SCHED:
+			mtx_lock(&Giant);
+			xpt_schedule((struct cam_periph *)work->data1,
+				     (uint32_t)(uintptr_t)(work->data2));
+			mtx_unlock(&Giant);
+			break;
+#if 0
+		case WORK_PERIPH_SCHED:
+			mtx_lock(&Giant);
+			daschedule((struct cam_periph *)work-data1);
+			mtx_unlock(&Giant);
+			break;
+#endif
+		default:
+			panic("Unknown CAM work item %d\n", work->command);
+		}
+
+		if (work->cbfcnp != NULL)
+			work->cbfcnp(work->cbdata);
+		mtx_unlock(&da_workmtx);
+	}
+	mtx_unlock(&da_workmtx);
+
+	kthread_exit(0);
+}
+
+static void
 dainit(void)
 {
 	cam_status status;
 	struct cam_path *path;
 
 	SLIST_INIT(&softc_list);
-	
+
+	mtx_init(&da_workmtx, "DA Mutex", NULL, MTX_DEF);
+	TAILQ_INIT(&da_worklist);
+	if (kthread_create(dawork, NULL, &da_proc, 0, 0, "da_work"))
+		printf("Warning: cannot DA kthread\n");
+
 	/*
 	 * Install a global async callback.  This callback will
 	 * receive async callbacks like "new device found".

==== //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_probe.c#2 (text+ko) ====

@@ -81,21 +81,6 @@
 PERIPHDRIVER_DECLARE(probe, probe_driver);
 
 typedef enum {
-	WORK_EXECUTE_CCB,
-	WORK_XPT_SCHED,
-	WORK_PROBE_SCHED
-} cam_workflags;
-
-struct cam_workitem {
-	TAILQ_ENTRY(cam_workitem)	work_link;
-	cam_workflags			command;
-	void				*data1;
-	void				*data2;
-	void				(*cbfcnp)(void *);
-	void				*cbdata;
-};
-
-typedef enum {
 	PROBE_TUR,
 	PROBE_INQUIRY,
 	PROBE_FULL_INQUIRY,
@@ -118,18 +103,18 @@
 	probe_flags	flags;
 	MD5_CTX		context;
 	u_int8_t	digest[16];
-	struct cam_workitem *work;
+	struct cam_periph_workitem *work;
 } probe_softc;
 
 static struct proc *probe_proc;
 static struct mtx probe_workmtx;
 static int probe_workflags;
-static TAILQ_HEAD(,cam_workitem) probe_worklist;
+static TAILQ_HEAD(,cam_periph_workitem) probe_worklist;
 
 #define PROBE_FLAG_EXIT	0x1
 
 static void
-probe_queue_work(struct cam_workitem *work)
+probe_queue_work(struct cam_periph_workitem *work)
 {
 	mtx_lock(&probe_workmtx);
 	TAILQ_INSERT_TAIL(&probe_worklist, work, work_link);
@@ -157,7 +142,7 @@
 	probe_softc *softc;
 
 	softc = (probe_softc *)periph->softc;
-	softc->work->command = WORK_PROBE_SCHED;
+	softc->work->command = WORK_PERIPH_SCHED;
 	softc->work->data1 = periph;
 	softc->work->cbfcnp = NULL;
 	probe_queue_work(softc->work);
@@ -166,7 +151,7 @@
 static void
 probe_work(void *dummy)
 {
-	struct cam_workitem *work;
+	struct cam_periph_workitem *work;
 
 	mtx_lock(&probe_workmtx);
 	while ((probe_workflags & PROBE_FLAG_EXIT) == 0) {
@@ -190,7 +175,7 @@
 				     (uint32_t)(uintptr_t)(work->data2));
 			mtx_unlock(&Giant);
 			break;
-		case WORK_PROBE_SCHED:
+		case WORK_PERIPH_SCHED:
 			mtx_lock(&Giant);
 			probeschedule((struct cam_periph *)work->data1);
 			mtx_unlock(&Giant);
@@ -224,7 +209,7 @@
 {
 	union ccb *request_ccb;	/* CCB representing the probe request */
 	probe_softc *softc;
-	struct cam_workitem *work;
+	struct cam_periph_workitem *work;
 
 	request_ccb = (union ccb *)arg;
 	if (periph == NULL) {
@@ -246,7 +231,8 @@
 		return(CAM_REQ_CMP_ERR);
 	}
 	
-	work = malloc(sizeof(struct cam_workitem), M_TEMP, M_NOWAIT | M_ZERO);
+	work = malloc(sizeof(struct cam_periph_workitem), M_TEMP,
+		      M_NOWAIT | M_ZERO);
 	if (work == NULL) {
 		printf("proberegister: Unable to probe new device. "
 		       "Unable to allocate workitem\n");


More information about the p4-projects mailing list