PERFORCE change 125269 for review
Maxim Zhuravlev
thioretic at FreeBSD.org
Fri Aug 17 08:01:59 PDT 2007
http://perforce.freebsd.org/chv.cgi?CH=125269
Change 125269 by thioretic at thioretic on 2007/08/17 15:01:26
Some io/driver interaction
Affected files ...
.. //depot/projects/soc2007/thioretic_gidl2/kern/ior_if.m#1 add
.. //depot/projects/soc2007/thioretic_gidl2/kern/subr_bus.c#5 edit
.. //depot/projects/soc2007/thioretic_gidl2/kern/subr_busio.c#5 edit
Differences ...
==== //depot/projects/soc2007/thioretic_gidl2/kern/subr_bus.c#5 (text+ko) ====
@@ -1026,6 +1026,28 @@
if (returns_val) \
return (val);
+#define FOR_ALL_DRIVERS_REV (exclude_raw, returns_val, return_on_non_zero, func, memb, ...) \
+ int level; \
+ driverinfolink_t dil; \
+ int val = 0; \
+ for (level = DRL_LOWEST; level <= DRL_TOPMOST; level++){ \
+ if (TAILQ_EMPTY(&dev->drivers[level])) \
+ continue; \
+ TAILQ_FOREACH (dil, &dev->drivers[level], link){ \
+ if (exclude_raw && dil->pdriver->state == DS_RAW) \
+ continue; \
+ if (returns_val){ \
+ val = func (dil->pdriver->##memb , __VA_ARGS__); \
+ if (val && return_on_non_zero) \
+ return (val); \
+ } \
+ else \
+ func (dil->pdriver->##memb , __VA_ARGS__); \
+ } \
+ } \
+ if (returns_val) \
+ return (val);
+
/**
* device control multiplexing entries
*/
@@ -1192,6 +1214,18 @@
dname, dunit);
}
+/**
+ * ior control multiplexing entries
+ */
+
+FUNC (void, PREFIX, do, device_t dev, ior_t r){
+ FOR_ALL_DRIVERS (FALSE, FALSE, FALSE, IOR_DO, functional_ops, r);
+}
+
+FUNC (void, PREFIX, done, device_t dev, ior_t r){
+ FOR_ALL_DRIVERS_REV (FALSE, FALSE, FALSE, IOR_DO, functional_ops, r);
+}
+
#define DRIVERMETHOD (name, if_prefix, driver_prefix) \
DEVMETHOD (if_prefix##_##name, driver_prefix##_##name)
@@ -1226,7 +1260,10 @@
DRIVERMETHOD (child_pnpinfo_str, bus, PREFIX),
DRIVERMETHOD (child_location_str, bus, PREFIX),
DRIVERMETHOD (config_intr, bus, PREFIX),
- DRIVERMETHOD (hinted_child, bus, PREFIX)
+ DRIVERMETHOD (hinted_child, bus, PREFIX),
+
+ DRIVERMETHOD (do, ior, PREFIX),
+ DRIVERMETHOD (done, ior, PREFIX)
};
static driver_t drv_compat_ctrl_driver = { /*TODO*/
==== //depot/projects/soc2007/thioretic_gidl2/kern/subr_busio.c#5 (text+ko) ====
@@ -56,6 +56,7 @@
/*ior_link_list_t*/ int children;
device_t origin;
devicelink_list_t path;
+ devicelink_t curdev;
int queue_id;
struct mtx guard_spin_mtx;
@@ -98,7 +99,9 @@
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 bus_io_process_next_ior (work_kthread_t tp);
+static int ior_do (ior_t r);
+static int ior_done (ior_t r);
static void
work_kthread_proc (void *arg){
@@ -216,7 +219,7 @@
if (r = q.todo)
break;
}
- if (qid = IOR_QUEUES_NUM)
+ if (qid == IOR_QUEUES_NUM)
return (1);
ior_lock (r);
@@ -234,7 +237,10 @@
r->state = IORS_OWNED;
ior_unlock (r);
- //deliver ior to first in path driver
+ if (ior_get_flags(r) &= IORS_DONE)
+ ior_do (r);
+ else
+ ior_done (r);
return (0);
}
@@ -260,7 +266,7 @@
}
mtx_init (&new_ior->guard_spin_mtx,
- "ior_mtx", NULL, MTX_SPIN);
+ "ior_mtx", NULL, MTX_SPIN|MTX_RECURSE);
if (error = ior_set_path (new_ior, origin, path)){
free (new_ior); free (ils);
@@ -388,7 +394,7 @@
mtx_unlock_spin (&q.guard_spin_mtx);
- r->queue_id = queue_id;
+ r->queue_id = queue_id + 1;
r->state = IORS_ENQUEUED;
ior_unlock (r);
@@ -408,7 +414,7 @@
ior_lock (r);
- if (r->state == IORS_NONE || r->children){
+ if (r->state != IOR_ENQUEUED || r->children){
ior_unlock (r);
return (1);
}
@@ -442,3 +448,39 @@
ior_unlock (ior_t r){
mtx_unlock_spin (&r->guard_spin_mtx);
}
+
+static int
+ior_do (ior_t r){
+ devicelink_t nextdev;
+
+ ior_lock (r);
+
+ nextdev = TAILQ_NEXT(r->curdev, link);
+ if (!nextdev){
+ return (1);
+ }
+
+ ior_unlock (r);
+
+ IOR_DO (nextdev->device_ptr, r);
+
+ ior_enqueue_adv (r, r->queue_id);
+}
+
+static int
+ior_done (ior_t r){
+ devicelink_t nextdev;
+
+ ior_lock (r);
+
+ nextdev = TAILQ_PREV(r->curdev, devicelink_list, link);
+ if (!nextdev){
+ return (1);
+ }
+
+ ior_unlock (r);
+
+ IOR_DONE (nextdev->device_ptr, r);
+
+ ior_enqueue_adv (r, r->queue_id);
+}
More information about the p4-projects
mailing list