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