Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 5 Feb 2008 20:54:43 GMT
From:      Maxim Zhuravlev <thioretic@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 134858 for review
Message-ID:  <200802052054.m15KshZV009127@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=134858

Change 134858 by thioretic@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_ */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200802052054.m15KshZV009127>