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