Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 9 Apr 2004 22:19:12 -0700 (PDT)
From:      Scott Long <scottl@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 50769 for review
Message-ID:  <200404100519.i3A5JCZ0069959@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=50769

Change 50769 by scottl@scottl-junior-camlock on 2004/04/09 22:18:20

	Create basic workitem infrastructure.  The only defined workitem
	right now is to execute a provided CCB.

Affected files ...

.. //depot/projects/scottl-camlock/src/sys/cam/cam_probe.c#2 edit

Differences ...

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

@@ -42,6 +42,7 @@
 #include <sys/md5.h>
 #include <sys/interrupt.h>
 #include <sys/sbuf.h>
+#include <sys/kthread.h>
 
 #ifdef PC98
 #include <pc98/pc98/pc98_machdep.h>	/* geometry translation */
@@ -103,9 +104,59 @@
 	u_int8_t	digest[16];
 } probe_softc;
 
+typedef enum {
+	WORK_EXECUTE_CCB = 0x1,
+} cam_workflags;
+
+struct cam_workitem {
+	TAILQ_ENTRY(cam_workitem)	work_links;
+	cam_workflags			command;
+	void				*data;
+	void				(*cbfcnp)(void *);
+};
+
+static struct proc *probe_proc;
+static struct mtx probe_workmtx;
+static int probe_workflags;
+static TAILQ_HEAD(,cam_workitem) probe_worklist;
+
+#define PROBE_FLAG_EXIT	0x1
+
 static void
+probe_work(void *dummy)
+{
+	struct cam_workitem *work;
+
+	mtx_lock(&probe_workmtx);
+	while ((probe_workflags & PROBE_FLAG_EXIT) == 0) {
+		if ((work = TAILQ_FIRST(&probe_worklist)) == NULL) {
+			msleep(&probe_worklist, &probe_workmtx, PRIBIO,
+			       "probew", 0);
+			continue;
+		}
+		TAILQ_REMOVE(&probe_worklist, work, work_links);
+
+		switch (work->command) {
+		case WORK_EXECUTE_CCB:
+			xpt_action((union ccb *)work->data);
+			break;
+		default:
+			panic("Unknown CAM work item %d\n", work->command);
+		}
+	}
+	mtx_unlock(&probe_workmtx);
+
+	kthread_exit(0);
+}
+
+static void
 probe_periph_init()
 {
+
+	mtx_init(&probe_workmtx, "Probe Mutex", NULL, MTX_DEF);
+	TAILQ_INIT(&probe_worklist);
+	if (kthread_create(probe_work, NULL, &probe_proc, 0, 0, "probe_work"))
+		printf("Warning: cannot create probe kthread\n");
 }
 
 static cam_status



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200404100519.i3A5JCZ0069959>