Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 10 Aug 2007 18:02:27 GMT
From:      Maxim Zhuravlev <thioretic@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 125020 for review
Message-ID:  <200708101802.l7AI2RjA078672@repoman.freebsd.org>

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

Change 125020 by thioretic@thioretic on 2007/08/10 18:01:56

	some basic ior api.

Affected files ...

.. //depot/projects/soc2007/thioretic_gidl2/kern/subr_bus.c#4 edit
.. //depot/projects/soc2007/thioretic_gidl2/kern/subr_busio.c#3 edit
.. //depot/projects/soc2007/thioretic_gidl2/sys/bus.h#3 edit

Differences ...

==== //depot/projects/soc2007/thioretic_gidl2/kern/subr_bus.c#4 (text+ko) ====

@@ -4771,50 +4771,48 @@
  */
 
 static int
-parse_parent_name (char* in, char ***out){
+break_str (char* in, char ***out, char delim, int* pcount){
 	char* cptr = in, *ptr = in, *newpar;
-	int count = 1, num = 0;
+	int count = 1, num = 0, i = 0;
 	
 	if (!in || *in == '\0')
 		return (0);
 	
-	if (!strcmp(in, "*")){
-		/* do we need this?
-		 * if we do, then there must be a way
-		 * to add filter driver to devclasses
-		 * of drivers, not yet added
-		 */
-	}
-	else{
-		while (strchr(ptr, '|')) count++;
-		*out = malloc (sizeof(char*)*(count+1), M_BUS, M_NOWAIT|M_ZERO);
-		count=0;
-		do {
-			while (*ptr!='|' && *ptr!='\0')	{num++;	ptr++;}
-			newpar = malloc ((num+1)*sizeof(char), M_BUS, M_NOWAIT|M_ZERO);
-			if (!newpar) return(0);
-			strlcpy(newpar, cptr, num+1);
-			(*out)[count++] = newpar;
-			num = 0; cptr = ++ptr;
-		} while (cptr<(in+strlen(in)));
-		(*out)[count] = NULL;
+	while (strchr(ptr, delim)) count++;
+	*out = malloc (sizeof(char*)*(count), M_BUS, M_NOWAIT|M_ZERO);
+	if (!(*out))
 		return (1);
-	}
+	count=0;
+	do {
+		while (*ptr!='|' && *ptr!='\0')	{num++;	ptr++;}
+		newpar = malloc ((num+1)*sizeof(char), M_BUS, M_NOWAIT|M_ZERO);
+		if (!newpar) {
+			for (i=0; i<count; i++)
+				free ((*out)[i]);
+			free (*out);			
+			return(1);
+		}
+		strlcpy(newpar, cptr, num+1);
+		(*out)[count++] = newpar;
+		num = 0; cptr = ++ptr;
+	} while (cptr<(in+strlen(in)));
+	//(*out)[count] = NULL;
+	*pcount = count;
+	return (1);
 }
 
-int
+static int
 register_filter_or_device_driver (driver *driver, char* hosts, devclass_t *pdc){
 	int error = 0, count = 0;
 	devclass_t dc, parentdc;
 	char *parents[];
 
-	if (!parse_parent_name(hosts, &parents))
+	if (error = break_str(hosts, &parents, '|', &count))
 		return (1);
 
-	while (parents[count]){
+	while (count--){
 		parentdc = devclass_find_internal(parents[count], 0, TRUE, FALSE);
-		error &= devclass_add_driver (parentdc, driver);
-		count++;
+		error |= devclass_add_driver (parentdc, driver);
 	}
 	free(parents);
 	if (error)
@@ -4837,7 +4835,7 @@
 	}
 }
 
-int
+static int
 register_func_driver (driver_t *driver, char* hosts, devclass_t *pdc){
 	int error, count=0, devcount;
 	device_t dev, *devices;
@@ -4864,11 +4862,11 @@
 	dev->flags |= DF_PERSISTENT;
 	*pdc = dc;
 
-	if (!parse_parent_name(hosts, &parents))
+	if (error = break_str(hosts, &parents, '|', &count))
 		return (0);
 
-	while (parents[count]){
-		if (!(parentdc = devclass_find(parents[count++])))
+	while (count--){
+		if (!(parentdc = devclass_find(parents[count])))
 			continue;
 		devclass_get_devices(parentdc, &devices, &devcount);
 		for (i=0, i<devcount, i++){
@@ -5243,3 +5241,57 @@
 		return (0);
 	return (bus_release_resource(dev, type, rman_get_rid(r), r));
 }
+
+int 
+resolve_path (device_t origin, char* path, device_t **dev_path, int *path_len){
+	int error=0, path_count = 0, parents_count = 0;
+	int i = 0, ii = 0;
+	int found = 0;
+	device_t *parents, dev = origin;
+	char **check, **old_check;
+
+	if (error = break_str (path, &check, '/', &path_len))
+		return (error);
+
+	old_check = check;
+	if (*check[0] != '.'){
+		path_len++;
+	}
+	
+	*dev_path = malloc (sizeof(device_t) * (path_len+1), M_BUS, M_NOWAIT|M_ZERO);
+	if (!(*dev_path)){
+		error = ENOMEM;
+	} else {
+		(*dev_path)[0] = origin;
+		if (*check[0] == '.'){
+			free (check[0]);
+			check++; path_len--;
+		}
+	}
+
+	for (i = 0; i < path_len; i++){
+		if (!error){
+			device_get_all_parents(dev, &parents, &parents_count);
+			for (ii = 0; ii < parents_count; ii++){
+				if (!(strcmp(parents[ii]->nameunit, check[i]))){
+					(*dev_path)[i+1] = parents[ii];
+					dev = parents[ii];
+					found = 1;
+					break;
+				}
+			}
+			free (parents);
+			error |= !found;
+		}
+		free (check[i]);
+		found = 0;
+	}
+	free (old_check);
+	
+	*path_len = i;
+
+	if (error && (*dev_path))
+		free (*dev_path);
+
+	return (error);
+}
==== //depot/projects/soc2007/thioretic_gidl2/kern/subr_busio.c#3 (text+ko) ====

@@ -24,33 +24,44 @@
 static struct mtx work_kthreads_list_mtx;
 
 struct ior {
-#define OPEN	1<<0
-#define FDOPEN	1<<1
-#define CLOSE	1<<2
-#define READ	1<<3
-#define WRITE	1<<4
-#define IOCTL	1<<5
-#define POLL	1<<6
-#define MMAP	1<<7
-#define STRATEGY	1<<8
-#define DUMP	1<<9
-#define KQFILTER	1<<10
-#define PURGE	1<<11
-#define SPARE2	1<<12
+#define OPEN	1
+#define FDOPEN	2
+#define CLOSE	3
+#define READ	4
+#define WRITE	5
+#define IOCTL	6
+#define POLL	7
+#define MMAP	8
+#define STRATEGY	9
+#define DUMP	10
+#define KQFILTER	11
+#define PURGE	12
+#define SPARE2	13
 	u_int32_t type;
 	void* data;
-#define IORS_INVALIDATE	1<<0
-#define IORS_DONE	1<<1
+#define IORS_DONE	1<<0
+#define IORS_INVALIDATE	1<<1
 #define IORS_RETRY	1<<2
 	u_int32_t state;
 	u_int32_t flags;
-	ior_t parent;
-	ior_list_t children;
+	ior_link_list_t parents;
+	ior_link_list_t children;
+	device_t origin;
 	devicelink_list_t path;
+	
+	struct mtx guard_mtx;
+
 	TAILQ_ENTRY (ior) link;
 };
 typedef struct ior* ior_t;
 
+struct ior_link {
+	ior_t iorp;
+	TAILQ_ENTRY (ior_link) link;
+};
+typedef struct ior_link* ior_link_t;
+
+typedef TAILQ_HEAD(ior_link_list, ior_link) ior_link_list_t;
 typedef TAILQ_HEAD(ior_list, ior) ior_list_t;
 static ior_list_t iors = TAILQ_HEAD_INITIALIZER(iors);
 
@@ -163,5 +174,133 @@
 }
 
 static void 
-bus_io_process_next_irp (work_kthread_t wkt){
+bus_io_process_next_ior (work_kthread_t wkt){
+}
+
+ior_t
+create_ior (device_t origin, int type, void* data, 
+			ior_t* parents, int pcount, char* path){
+	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;
+
+	new_ior = malloc (sizeof (struct ior), M_BUS_IO, M_NOWAIT|M_ZERO);
+	if (!new_ior)
+		return (NULL);
+
+	ils = malloc (sizeof(struct ior_link) * pcount * 2, M_BUS_IO,
+		M_NOWAIT|M_ZERO);
+	if (!ils){
+		free (new_ior);
+		return (NULL);
+	}
+
+	mtx_init (&new_ior->guard_mtx,
+		"ior_mtx", NULL, MTX_DEF);
+
+	if (error = ior_set_path (new_ior, origin, path)){
+		free (new_ior);	free (ils);
+		return (NULL);
+	}
+
+//	mtx_lock (&new_ior->guard_mtx);
+
+	new_ior->type = type;
+	new_ior->data = data;
+	for (i = 0; i < pcount; i++){
+		il = ils++;
+		il->iorp = parents[i];
+		TAILQ_INSERT_TAIL (&new_ior->parents, il, link);
+		
+		il = ils++;
+		il->iorp = new_ior;
+		TAILQ_INSERT_TAIL (&(parents[i])->children, il, link);
+	}
+	new_ior->origin = origin;
+
+//	mtx_unlock (&new_ior->guard_mtx);
+
+	return (new_ior);
+
+}
+
+void
+ior_set_state (ior_t r, u_int32_t val){
+	r->state = val;
+}
+
+u_int32_t
+ior_get_state (ior_t r){
+	return (r->state);
+}
+
+void
+ior_get_flags (ior_t r, u_int32_t val){
+	r->flags = val;
+}
+
+u_int32_t
+ior_get_flags (ior_t r){
+	return (r->flags);
+}
+
+int 
+ior_set_path (ior_t r, device_t origin, char* path){
+	int i = 0, error = 0, path_len;
+	device_t *dev_path;
+	devicelink_t dl;
+
+	if (error = resolve_path (origin, path, &dev_path, &path_len)){
+		return (error);
+	}
+
+	dl = malloc (sizeof (struct devicelink) * path_len, M_BUS_IO,
+		M_NOWAIT|M_ZERO);
+	if (!dl) {
+		free (dev_path);
+		return (ENOMEM);
+	}
+
+	mtx_lock (&r->guard_mtx);
+
+	for (i = 0; i < path_len; i++){
+		dl->device_ptr = dev_path[i];
+		TAILQ_INSERT_TAIL (&r->path, dl, link);
+		dl++;
+	}
+
+	mtx_unlock (&r->guard_mtx);
+
+	free (dev_path);
+	return (0);
+}
+
+int
+ior_get_path (ior_t r, device_t **dev_path, int *path_len){
+	int i = 0;
+	devicelink_t dl;
+
+	mtx_lock (&r->guard_mtx);
+
+	TAILQ_FOREACH (dl, &r->path, link){
+		(*path_len)++;
+	}
+
+	(*dev_path) = malloc (sizeof (device_t) * (*path_len), M_BUS_IO,
+		M_NOWAIT|M_ZERO);
+
+	if (!(*dev_path)){
+		mtx_unlock (&r->guard_mtx);
+		return (ENOMEM);
+	}
+
+	TAILQ_FOREACH (dl, &r->path, link){
+		(*dev_path)[i++] = dl->device_ptr;
+	}
+
+	mtx_unlock (&r->path);
+
+	return (0);
 }
==== //depot/projects/soc2007/thioretic_gidl2/sys/bus.h#3 (text+ko) ====

@@ -706,6 +706,15 @@
 #define bus_write_region_stream_8(r, o, d, c) \
 	bus_space_write_region_stream_8(rman_get_bustag(r), rman_get_bushandle(r), (o), (d), (c))
 
+int resolve_path (device_t origin, char* path, device_t **dev_path, int *path_len);
+ior_t create_ior (device_t origin, int type, void* data, ior_t* parents, int pcount, char* path)
+void ior_set_state (ior_t r, u_int32_t val);
+u_int32_t ior_get_state (ior_t r);
+void ior_get_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);
+
 #endif /* _KERNEL */
 
 #endif /* !_SYS_BUS_H_ */



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