From owner-p4-projects@FreeBSD.ORG Tue Jun 29 02:56:59 2004 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 527E816A4D0; Tue, 29 Jun 2004 02:56:59 +0000 (GMT) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 2DB9316A4CE for ; Tue, 29 Jun 2004 02:56:59 +0000 (GMT) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 2703143D49 for ; Tue, 29 Jun 2004 02:56:59 +0000 (GMT) (envelope-from scottl@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.12.11/8.12.11) with ESMTP id i5T2uxHh073458 for ; Tue, 29 Jun 2004 02:56:59 GMT (envelope-from scottl@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.11/8.12.11/Submit) id i5T2uw0X073455 for perforce@freebsd.org; Tue, 29 Jun 2004 02:56:58 GMT (envelope-from scottl@freebsd.org) Date: Tue, 29 Jun 2004 02:56:58 GMT Message-Id: <200406290256.i5T2uw0X073455@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to scottl@freebsd.org using -f From: Scott Long To: Perforce Change Reviews Subject: PERFORCE change 56041 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 29 Jun 2004 02:56:59 -0000 http://perforce.freebsd.org/chv.cgi?CH=56041 Change 56041 by scottl@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 #include #include +#include +#include +#include #include @@ -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");