PERFORCE change 135119 for review
Maxim Zhuravlev
thioretic at FreeBSD.org
Sat Feb 9 12:32:16 PST 2008
http://perforce.freebsd.org/chv.cgi?CH=135119
Change 135119 by thioretic at thioretic on 2008/02/09 20:31:45
Some cleanups basically.
Affected files ...
.. //depot/projects/soc2007/thioretic_gidl2/kern/subr_busio.c#9 edit
.. //depot/projects/soc2007/thioretic_gidl2/sys/bus.h#9 edit
Differences ...
==== //depot/projects/soc2007/thioretic_gidl2/kern/subr_busio.c#9 (text+ko) ====
@@ -11,6 +11,8 @@
#include <sys/proc.h>
#include <sys/bus.h>
#include <sys/ior_types.h>
+#include <machine/atomic.h>
+
static MALLOC_DEFINE(M_BUS_IO, "bus_io", "Bus io subsystem data structures");
@@ -42,13 +44,13 @@
#define IORF_TODESTROY 1<<3
u_int32_t flags;
ior_link_list_t parents;
- /*ior_link_list_t*/ int children;
+ int children;
device_t origin;
devicelink_list_t path;
devicelink_t curdev;
int queue_id;
- struct mtx guard_spin_mtx;
+ struct mtx guard_mtx;
TAILQ_ENTRY (ior) link;
};
@@ -70,9 +72,6 @@
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;
@@ -238,46 +237,43 @@
ior_t
ior_create (device_t origin, int type, void* data,
- ior_t* parents, int pcount, char* path, int enqueue, int queue_id){
+ 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;
- device_t *dev_path;
- devicelink_t dl;
+ ior_link_t pil, pils;
+ int i, error = 0;
- new_ior = malloc (sizeof (struct ior), M_BUS_IO, M_NOWAIT|M_ZERO);
+ new_ior = malloc (sizeof (struct ior) + sizeof(struct ior_link) * pcount,
+ M_BUS_IO, M_NOWAIT|M_ZERO);
if (!new_ior)
return (NULL);
- ils = malloc (sizeof(struct ior_link) * pcount /* * 2*/, M_BUS_IO, //REMOVE COMMENTS on type(ior->children) == ior_link_list_t
- M_NOWAIT|M_ZERO);
- if (!ils){
- free (new_ior);
- return (NULL);
- }
+ pils = (ior_link_t)((char *) new_ior + sizeof (struct ior));
mtx_init (&new_ior->guard_spin_mtx,
- "ior_mtx", NULL, MTX_SPIN|MTX_RECURSE);
-
+ "ior_mtx", NULL, MTX_DEF|MTX_RECURSE);
+
+ TAILQ_INIT (&r->path);
if (error = ior_set_path (new_ior, origin, path)){
- free (new_ior); free (ils);
+ free (new_ior);
return (NULL);
}
new_ior->type = type;
new_ior->data = data;
+ new_ior->state = IORS_NONE;
+ new_ior->flags = 0;
+
+ TAILQ_INIT (&new_ior->parents);
for (i = 0; i < pcount; i++){
- il = ils++;
- il->iorp = parents[i];
- TAILQ_INSERT_TAIL (&new_ior->parents, il, link);
-
+ pil = pils++;
+ pil->iorp = parents[i];
+ TAILQ_INSERT_TAIL (&new_ior->parents, pil, link);
parents[i]->children++;
-/* il = ils++;
- il->iorp = new_ior;
- TAILQ_INSERT_TAIL (&(parents[i])->children, il, link);
-*/ //REMOVE COMMENTS on type(ior->children) == ior_link_list_t
}
- new_ior->origin = origin;
+
+ new_ior->children = 0;
+ new_ior->origin = new_ior->curdev = origin;
if (enqueue){
ior_enqueue_adv (new_ior, queue_id);
@@ -289,33 +285,55 @@
static void
ior_destroy_async (ior_t r){
- devicelink_t dl;
+ ior_link_t il;
- while (dl = TAILQ_FIRST (&r->path)){
- TAILQ_REMOVE (&r->path, dl, link);
+ ior_set_path (r, r->origin, NULL);
+
+ while (!TAILQ_EMPTY (&r->parents)){
+ il = TAILQ_FIRST (&r->parents);
+ il->iorp->children--;
+ TAILQ_REMOVE (&r->parents, il, link);
}
+
mtx_destroy (r->guard_spin_mtx);
free (r);
}
int
ior_destroy (ior_t r){
- if (!TAILQ_EMPTY (&new_ior->parents))
+ devicelink_t dev;
+
+ if (r->children)
return (0);
- if (ior_get_state (r) == IORS_NONE){
- ior_destroy_async (r);
- } else {
- ior_set_flags (r, ior_get_flags (r) | IORF_TODESTROY);
+
+ ior_add_flags (r, IORF_TODESTROY);
+
+ ior_lock (r);
+
+ while (dev = TAILQ_NEXT(r->curdev)){
+ TAILQ_REMOVE (&r->path, dev, link);
}
+
+ ior_unlock (r);
+
return (1);
}
-void
+int
+ior_abort (ior_t r, u_int32_t flags){
+ if (ior_destroy (r)){
+ ior_add_flags (r, flags);
+ return (1);
+ }
+ return (0);
+}
+
+static void
ior_set_state (ior_t r, u_int32_t val){
r->state = val;
}
-u_int32_t
+static u_int32_t
ior_get_state (ior_t r){
return (r->state);
}
@@ -324,6 +342,10 @@
ior_set_flags (ior_t r, u_int32_t val){
r->flags = val;
}
+void
+ior_add_flag (ior_t r, u_int32_t val){
+ r->flags |= val;
+}
u_int32_t
ior_get_flags (ior_t r){
@@ -333,31 +355,36 @@
int
ior_set_path (ior_t r, device_t origin, char* path){
int i = 0, error = 0, path_len;
- device_t *dev_path;
+ device_t *dev_path = NULL;
devicelink_t dl;
+ devicelink_t ddl = NULL;
- if (error = resolve_path (origin, path, &dev_path, &path_len)){
+ if (path && error = resolve_path (origin, path, &dev_path, &path_len) &&
+ (dl = malloc (sizeof (struct devicelink) * path_len, M_BUS_IO,
+ M_NOWAIT|M_ZERO) || (free (dev_path), error = ENOMEM, 1))){
return (error);
}
- dl = malloc (sizeof (struct devicelink) * path_len, M_BUS_IO,
- M_NOWAIT|M_ZERO);
- if (!dl) {
- free (dev_path);
- return (ENOMEM);
+ ior_lock (r);
+
+ if (!TAILQ_EMPTY(&r->path)){
+ ddl = TAILQ_LAST (&r->path, devicelink_list);
+ TAILQ_REMOVE (&r->path, ddl, link);
}
+ if (ddl)
+ free (ddl);
- mtx_lock_spin (&r->guard_spin_mtx);
-
- for (i = 0; i < path_len; i++){
- dl->device_ptr = dev_path[i];
- TAILQ_INSERT_TAIL (&r->path, dl, link);
- dl++;
+ if (dev_path){
+ for (i = 0; i < path_len; i++){
+ dl->device_ptr = dev_path[i];
+ TAILQ_INSERT_TAIL (&r->path, dl, link);
+ dl++;
+ }
+ free (dev_path);
}
- mtx_unlock_spin (&r->guard_spin_mtx);
+ ior_unlock (r);
- free (dev_path);
return (0);
}
@@ -366,7 +393,7 @@
int i = 0;
devicelink_t dl;
- mtx_lock (&r->guard_mtx);
+ ior_lock (r);
TAILQ_FOREACH (dl, &r->path, link){
(*path_len)++;
@@ -376,7 +403,7 @@
M_NOWAIT|M_ZERO);
if (!(*dev_path)){
- mtx_unlock (&r->guard_mtx);
+ ior_unlock (r);
return (ENOMEM);
}
@@ -384,12 +411,12 @@
(*dev_path)[i++] = dl->device_ptr;
}
- mtx_unlock (&r->path);
+ ior_unlock (r);
return (0);
}
-void //static for now
+void
ior_enqueue_adv (ior_t r, int queue_id){
ior_queue q = ior_queues[queue_id];
@@ -455,12 +482,12 @@
static void
ior_lock (ior_t r){
- mtx_lock_spin (&r->guard_spin_mtx);
+ mtx_lock (&r->guard_mtx);
}
static void
ior_unlock (ior_t r){
- mtx_unlock_spin (&r->guard_spin_mtx);
+ mtx_unlock (&r->guard_mtx);
}
static void
@@ -468,23 +495,16 @@
devicelink_t nextdev;
while (1){
- ior_lock (r);
nextdev = TAILQ_NEXT(r->curdev, link);
if (!nextdev){
ior_set_flags (r, IORF_INVALIDATE);
}
- ior_unlock (r);
- if (ior_get_flags(r) >= IORF_DONE)
- break;
-
r->curdev = nextdev;
IOR_DO (r->curdev->device_ptr, r);
- if (ior_get_flags(r) & IORF_TODESTOY){
- ior_destroy_async (r);
- return;
- }
+ if (ior_get_state(r) == IORS_NONE)
+ return();
if ((nextdev = TAILQ_NEXT(r->curdev, link)) &&
(device_get_flags(nextdev->device_ptr) & DF_ENQUEUEIORS))
@@ -498,16 +518,12 @@
devicelink_t nextdev;
while (1){
- ior_lock (r);
- nextdev = TAILQ_NEXT(r->curdev, link);
+ nextdev = TAILQ_PREV(r->curdev, devicelink_list, link);
if (!nextdev){
- ior_set_flags (r, IORF_INVALIDATE);
+ ior_destroy_async (r);
+ return();
}
- ior_unlock (r);
- if (ior_get_flags(r) >= IORF_DONE)
- break;
-
r->curdev = nextdev;
IOR_DONE (r->curdev->device_ptr, r);
@@ -516,7 +532,7 @@
return;
}
- if ((nextdev = TAILQ_NEXT(r->curdev, link)) &&
+ if ((nextdev = TAILQ_PREV(r->curdev, devicelink_list, link)) &&
(device_get_flags(nextdev->device_ptr) & DF_ENQUEUEIORS))
break;
}
==== //depot/projects/soc2007/thioretic_gidl2/sys/bus.h#9 (text+ko) ====
@@ -753,9 +753,8 @@
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);
+void ior_add_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);
More information about the p4-projects
mailing list