From owner-p4-projects@FreeBSD.ORG Fri Aug 10 18:02:28 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id ECAE416A46B; Fri, 10 Aug 2007 18:02:27 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B607E16A417 for ; Fri, 10 Aug 2007 18:02:27 +0000 (UTC) (envelope-from thioretic@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id A2A6013C45E for ; Fri, 10 Aug 2007 18:02:27 +0000 (UTC) (envelope-from thioretic@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id l7AI2Rta078675 for ; Fri, 10 Aug 2007 18:02:27 GMT (envelope-from thioretic@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id l7AI2RjA078672 for perforce@freebsd.org; Fri, 10 Aug 2007 18:02:27 GMT (envelope-from thioretic@FreeBSD.org) Date: Fri, 10 Aug 2007 18:02:27 GMT Message-Id: <200708101802.l7AI2RjA078672@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to thioretic@FreeBSD.org using -f From: Maxim Zhuravlev To: Perforce Change Reviews Cc: Subject: PERFORCE change 125020 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 10 Aug 2007 18:02:28 -0000 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; iflags |= 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, inameunit, 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_ */