PERFORCE change 134858 for review
Maxim Zhuravlev
thioretic at FreeBSD.org
Tue Feb 5 12:54:44 PST 2008
http://perforce.freebsd.org/chv.cgi?CH=134858
Change 134858 by thioretic at thioretic on 2008/02/05 20:54:39
Add io protos to bus.h
Affected files ...
.. //depot/projects/soc2007/thioretic_gidl2/kern/subr_busio.c#8 edit
.. //depot/projects/soc2007/thioretic_gidl2/sys/bus.h#8 edit
Differences ...
==== //depot/projects/soc2007/thioretic_gidl2/kern/subr_busio.c#8 (text+ko) ====
@@ -39,6 +39,7 @@
#define IORF_DONE 1<<0
#define IORF_INVALIDATE 1<<1
#define IORF_RETRY 1<<2
+#define IORF_TODESTROY 1<<3
u_int32_t flags;
ior_link_list_t parents;
/*ior_link_list_t*/ int children;
@@ -51,7 +52,6 @@
TAILQ_ENTRY (ior) link;
};
-typedef struct ior* ior_t;
struct ior_link {
ior_t iorp;
@@ -70,6 +70,9 @@
struct mtx guard_mtx;
};
+#define IOR_QUEUES_NUM 1
+#define IOR_QUEUE_DEF 0
+
static ior_queue ior_queues[IOR_QUEUES_NUM];
static struct mtx iors_list_mtx;
@@ -234,8 +237,8 @@
}
ior_t
-create_ior (device_t origin, int type, void* data,
- ior_t* parents, int pcount, char* path, int enqueue){
+ior_create (device_t origin, int type, void* data,
+ ior_t* parents, int pcount, char* path, int enqueue, int queue_id){
ior_t new_ior;
ior_link_t il, il2, cil, *ils;
int i = 0, error = 0, path_len;
@@ -277,13 +280,36 @@
new_ior->origin = origin;
if (enqueue){
- ior_enqueue (new_ior);
+ ior_enqueue_adv (new_ior, queue_id);
}
return (new_ior);
}
+static void
+ior_destroy_async (ior_t r){
+ devicelink_t dl;
+
+ while (dl = TAILQ_FIRST (&r->path)){
+ TAILQ_REMOVE (&r->path, dl, link);
+ }
+ mtx_destroy (r->guard_spin_mtx);
+ free (r);
+}
+
+int
+ior_destroy (ior_t r){
+ if (!TAILQ_EMPTY (&new_ior->parents))
+ return (0);
+ if (ior_get_state (r) == IORS_NONE){
+ ior_destroy_async (r);
+ } else {
+ ior_set_flags (r, ior_get_flags (r) | IORF_TODESTROY);
+ }
+ return (1);
+}
+
void
ior_set_state (ior_t r, u_int32_t val){
r->state = val;
@@ -363,7 +389,7 @@
return (0);
}
-static void //static for now
+void //static for now
ior_enqueue_adv (ior_t r, int queue_id){
ior_queue q = ior_queues[queue_id];
@@ -427,17 +453,17 @@
return (ior_dequeue_adv (r, r->queue_id));
}
-void
+static void
ior_lock (ior_t r){
mtx_lock_spin (&r->guard_spin_mtx);
}
-void
+static void
ior_unlock (ior_t r){
mtx_unlock_spin (&r->guard_spin_mtx);
}
-static int
+static void
ior_do (ior_t r){
devicelink_t nextdev;
@@ -455,6 +481,11 @@
r->curdev = nextdev;
IOR_DO (r->curdev->device_ptr, r);
+ if (ior_get_flags(r) & IORF_TODESTOY){
+ ior_destroy_async (r);
+ return;
+ }
+
if ((nextdev = TAILQ_NEXT(r->curdev, link)) &&
(device_get_flags(nextdev->device_ptr) & DF_ENQUEUEIORS))
break;
@@ -462,7 +493,7 @@
ior_enqueue_adv (r, r->queue_id);
}
-static int
+static void
ior_done (ior_t r){
devicelink_t nextdev;
@@ -479,6 +510,11 @@
r->curdev = nextdev;
IOR_DONE (r->curdev->device_ptr, r);
+
+ if (ior_get_flags(r) & IORF_TODESTOY){
+ ior_destroy_async (r);
+ return;
+ }
if ((nextdev = TAILQ_NEXT(r->curdev, link)) &&
(device_get_flags(nextdev->device_ptr) & DF_ENQUEUEIORS))
==== //depot/projects/soc2007/thioretic_gidl2/sys/bus.h#8 (text+ko) ====
@@ -743,6 +743,26 @@
REL_CHILD | REL_PARENT, /* EV_SHUTDOWN */ /* TODO */
};
+#define IOR_QUEUES_NUM 1
+#define IOR_QUEUE_DEF 0
+
+struct ior;
+typedef struct ior* ior_t;
+
+ior_t ior_create (device_t origin, int type, void* data,
+ ior_t *parents, int pcount, char* path,
+ int enqueue, int queue_id);
+int ior_destroy (ior_t r);
+void ior_set_state (ior_t r, u_int32_t val);
+u_int32_t ior_get_state (ior_t r);
+void ior_set_flags (ior_t r, u_int32_t val);
+u_int32_t ior_get_flags (ior_t r);
+int ior_set_path (ior_t r, device_t origin, char* path);
+int ior_get_path (ior_t r, device_t** dev_path, int* path_len);
+void ior_enqueue_adv (ior_t r, int queue_id);
+void ior_enqueue (ior_t r);
+int ior_dequeue (ior_t r);
+
#endif /* _KERNEL */
#endif /* !_SYS_BUS_H_ */
More information about the p4-projects
mailing list