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>