PERFORCE change 124964 for review
Maxim Zhuravlev
thioretic at FreeBSD.org
Thu Aug 9 11:29:15 PDT 2007
http://perforce.freebsd.org/chv.cgi?CH=124964
Change 124964 by thioretic at thioretic on 2007/08/09 18:29:10
Errata, some locking.
Affected files ...
.. //depot/projects/soc2007/thioretic_gidl2/kern/subr_busio.c#2 edit
.. //depot/projects/soc2007/thioretic_gidl2/sys/uio.h#2 edit
Differences ...
==== //depot/projects/soc2007/thioretic_gidl2/kern/subr_busio.c#2 (text+ko) ====
@@ -3,6 +3,10 @@
#include <sys/kthread.h>
#include <sys/malloc.h>
#include <sys/queue.h>
+#include <sys/param.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+#include <sys/uio.h>
static MALLOC_DEFINE(M_BUS_IO, "bus_io", "Bus io subsystem data structures");
@@ -15,8 +19,42 @@
typedef work_kthread* work_kthread_t;
typedef TAILQ_HEAD(work_kthread_list, work_kthread) work_kthread_list_t;
+static work_kthread_list_t work_kthreads = TAILQ_HEAD_INITIALIZER(work_kthreads);
+
+static struct mtx work_kthreads_list_mtx;
-static work_kthread_list_t work_kthreads = TAILQ_HEAD_INITIALIZER(work_kthreads);
+struct ior {
+#define OPEN 1<<0
+#define FDOPEN 1<<1
+#define CLOSE 1<<2
+#define READ 1<<3
+#define WRITE 1<<4
+#define IOCTL 1<<5
+#define POLL 1<<6
+#define MMAP 1<<7
+#define STRATEGY 1<<8
+#define DUMP 1<<9
+#define KQFILTER 1<<10
+#define PURGE 1<<11
+#define SPARE2 1<<12
+ u_int32_t type;
+ void* data;
+#define IORS_INVALIDATE 1<<0
+#define IORS_DONE 1<<1
+#define IORS_RETRY 1<<2
+ u_int32_t state;
+ u_int32_t flags;
+ ior_t parent;
+ ior_list_t children;
+ devicelink_list_t path;
+ TAILQ_ENTRY (ior) link;
+};
+typedef struct ior* ior_t;
+
+typedef TAILQ_HEAD(ior_list, ior) ior_list_t;
+static ior_list_t iors = TAILQ_HEAD_INITIALIZER(iors);
+
+static struct mtx iors_list_mtx;
SYSCTL_NODE(_kern, OID_AUTO, newbus, CTLFLAG_RW,
0, "Newbus tuneup family");
@@ -31,44 +69,70 @@
work_kthreads_set_number, "I", "Number of kernel threads"
"to process queued io requests");
+static void bus_io_process_next_irp (work_kthread_t tp);
+
static void
work_kthread_proc (void *arg){
- static work_kthread_t my_pwk = *((work_kthread_t)arg);
+ static work_kthread_t my_pwk = ((work_kthread_t)arg);
+ struct thread *tp = FIRST_THREAD_IN_PROC(my_pwk->kthread);
+
+ mtx_lock_spin (&sched_lock);
+ sched_prio (tp, ); /*TODO*/
+ mtx_unlock_spin (&sched_lock);
+
+ while (TRUE){
+ if (my_pwk->flags & WKF_REMOVE){
+ mtx_lock (&work_kthreads_list_mtx);
+ TAILQ_REMOVE (&work_kthreads, my_pwk, link);
+ mtx_unlock (&work_kthreads_list_mtx);
+ free (my_pwk);
+ kthread_exit (0);
+ return ();
+ }
+ bus_io_process_next_irp (my_pwk);
+ }
}
static void
reset_work_kthreads (void){
work_kthread_t pwk;
- u_int32_t cur_work_kthread_num;
+ u_int32_t cur_work_kthreads_num;
if (old_work_kthreads_num == work_kthreads_num)
return ();
+ if (!mtx_initialized (&work_kthreads_list_mtx))
+ mtx_init (&work_kthreads_list_mtx,
+ "bus_io_work_threads_list_mtx",
+ NULL, MTX_DEF);
+
+ mtx_lock (&work_kthreads_list_mtx);
+
if (old_work_kthreads_num < work_kthreads_num){
- cur_work_kthread_num = old_work_kthreads_num;
+ cur_work_kthreads_num = old_work_kthreads_num;
do{
- id = cur_work_kthreads_num;
pwk = malloc (sizeof(struct work_kthread), M_BUS_IO, M_NOWAIT|M_ZERO);
- if (!pwk || kthread_create (&work_kthread_proc, &pwk,
- &(pwk->kthread), 0, 0, "bus_io_work_kthread%d", id)){
+ if (!pwk || kthread_create (&work_kthread_proc, pwk,
+ &(pwk->kthread), 0, 0, "bus_io_work_kthread%d",
+ cur_work_kthreads_num)){
work_kthreads_num = cur_work_kthreads_num;
if (pwk) free(pwk);
- return ();
+ break;
}
TAILQ_INSERT_TAIL(&work_kthreads, pwk, link);
}while (work_kthreads_num < ++cur_work_kthreads_num);
}
else{
- cur_work_kthread_num = work_kthreads_num;
+ cur_work_kthreads_num = work_kthreads_num;
TAILQ_FOREACH(pwk, &work_kthreads, link){
- if(cur_work_kthreads_num){
+ if(cur_work_kthreads_num)
cur_work_kthreads_num--;
- }
- else{
+ else
pwk->flags |= WKF_REMOVE;
- }
}
}
+
+ mtx_unlock (&work_kthreads_list_mtx);
}
static int
@@ -92,5 +156,12 @@
void
bus_io_init (void){
+ mtx_init (&iors_list_mtx,
+ "bus_io_iors_list_mtx",
+ NULL, MTX_DEF);
reset_work_kthreads();
+}
+
+static void
+bus_io_process_next_irp (work_kthread_t wkt){
}
==== //depot/projects/soc2007/thioretic_gidl2/sys/uio.h#2 (text+ko) ====
@@ -68,11 +68,6 @@
enum uio_seg uio_segflg;
enum uio_rw uio_rw;
struct thread *uio_td;
- char* stack_path;
-#define INVALIDATE 1
-#define FULFILLED 2
-#define RETRY 4
- int state;
};
/*
More information about the p4-projects
mailing list