PERFORCE change 125020 for review
Maxim Zhuravlev
thioretic at FreeBSD.org
Fri Aug 10 11:02:28 PDT 2007
http://perforce.freebsd.org/chv.cgi?CH=125020
Change 125020 by thioretic at 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_ */
More information about the p4-projects
mailing list