From owner-p4-projects@FreeBSD.ORG Sat Feb 9 20:32:16 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id B219D16A421; Sat, 9 Feb 2008 20:32:15 +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 5E63E16A41A for ; Sat, 9 Feb 2008 20:32:15 +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 4FF8113C45B for ; Sat, 9 Feb 2008 20:32:15 +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 m19KWF2L083876 for ; Sat, 9 Feb 2008 20:32:15 GMT (envelope-from thioretic@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m19KWFBQ083873 for perforce@freebsd.org; Sat, 9 Feb 2008 20:32:15 GMT (envelope-from thioretic@FreeBSD.org) Date: Sat, 9 Feb 2008 20:32:15 GMT Message-Id: <200802092032.m19KWFBQ083873@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 135119 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: Sat, 09 Feb 2008 20:32:16 -0000 http://perforce.freebsd.org/chv.cgi?CH=135119 Change 135119 by thioretic@thioretic on 2008/02/09 20:31:45 Some cleanups basically. Affected files ... .. //depot/projects/soc2007/thioretic_gidl2/kern/subr_busio.c#9 edit .. //depot/projects/soc2007/thioretic_gidl2/sys/bus.h#9 edit Differences ... ==== //depot/projects/soc2007/thioretic_gidl2/kern/subr_busio.c#9 (text+ko) ==== @@ -11,6 +11,8 @@ #include #include #include +#include + static MALLOC_DEFINE(M_BUS_IO, "bus_io", "Bus io subsystem data structures"); @@ -42,13 +44,13 @@ #define IORF_TODESTROY 1<<3 u_int32_t flags; ior_link_list_t parents; - /*ior_link_list_t*/ int children; + int children; device_t origin; devicelink_list_t path; devicelink_t curdev; int queue_id; - struct mtx guard_spin_mtx; + struct mtx guard_mtx; TAILQ_ENTRY (ior) link; }; @@ -70,9 +72,6 @@ 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; @@ -238,46 +237,43 @@ ior_t ior_create (device_t origin, int type, void* data, - ior_t* parents, int pcount, char* path, int enqueue, int queue_id){ + 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; - device_t *dev_path; - devicelink_t dl; + ior_link_t pil, pils; + int i, error = 0; - new_ior = malloc (sizeof (struct ior), M_BUS_IO, M_NOWAIT|M_ZERO); + new_ior = malloc (sizeof (struct ior) + sizeof(struct ior_link) * pcount, + M_BUS_IO, M_NOWAIT|M_ZERO); if (!new_ior) return (NULL); - ils = malloc (sizeof(struct ior_link) * pcount /* * 2*/, M_BUS_IO, //REMOVE COMMENTS on type(ior->children) == ior_link_list_t - M_NOWAIT|M_ZERO); - if (!ils){ - free (new_ior); - return (NULL); - } + pils = (ior_link_t)((char *) new_ior + sizeof (struct ior)); mtx_init (&new_ior->guard_spin_mtx, - "ior_mtx", NULL, MTX_SPIN|MTX_RECURSE); - + "ior_mtx", NULL, MTX_DEF|MTX_RECURSE); + + TAILQ_INIT (&r->path); if (error = ior_set_path (new_ior, origin, path)){ - free (new_ior); free (ils); + free (new_ior); return (NULL); } new_ior->type = type; new_ior->data = data; + new_ior->state = IORS_NONE; + new_ior->flags = 0; + + TAILQ_INIT (&new_ior->parents); for (i = 0; i < pcount; i++){ - il = ils++; - il->iorp = parents[i]; - TAILQ_INSERT_TAIL (&new_ior->parents, il, link); - + pil = pils++; + pil->iorp = parents[i]; + TAILQ_INSERT_TAIL (&new_ior->parents, pil, link); parents[i]->children++; -/* il = ils++; - il->iorp = new_ior; - TAILQ_INSERT_TAIL (&(parents[i])->children, il, link); -*/ //REMOVE COMMENTS on type(ior->children) == ior_link_list_t } - new_ior->origin = origin; + + new_ior->children = 0; + new_ior->origin = new_ior->curdev = origin; if (enqueue){ ior_enqueue_adv (new_ior, queue_id); @@ -289,33 +285,55 @@ static void ior_destroy_async (ior_t r){ - devicelink_t dl; + ior_link_t il; - while (dl = TAILQ_FIRST (&r->path)){ - TAILQ_REMOVE (&r->path, dl, link); + ior_set_path (r, r->origin, NULL); + + while (!TAILQ_EMPTY (&r->parents)){ + il = TAILQ_FIRST (&r->parents); + il->iorp->children--; + TAILQ_REMOVE (&r->parents, il, link); } + mtx_destroy (r->guard_spin_mtx); free (r); } int ior_destroy (ior_t r){ - if (!TAILQ_EMPTY (&new_ior->parents)) + devicelink_t dev; + + if (r->children) return (0); - if (ior_get_state (r) == IORS_NONE){ - ior_destroy_async (r); - } else { - ior_set_flags (r, ior_get_flags (r) | IORF_TODESTROY); + + ior_add_flags (r, IORF_TODESTROY); + + ior_lock (r); + + while (dev = TAILQ_NEXT(r->curdev)){ + TAILQ_REMOVE (&r->path, dev, link); } + + ior_unlock (r); + return (1); } -void +int +ior_abort (ior_t r, u_int32_t flags){ + if (ior_destroy (r)){ + ior_add_flags (r, flags); + return (1); + } + return (0); +} + +static void ior_set_state (ior_t r, u_int32_t val){ r->state = val; } -u_int32_t +static u_int32_t ior_get_state (ior_t r){ return (r->state); } @@ -324,6 +342,10 @@ ior_set_flags (ior_t r, u_int32_t val){ r->flags = val; } +void +ior_add_flag (ior_t r, u_int32_t val){ + r->flags |= val; +} u_int32_t ior_get_flags (ior_t r){ @@ -333,31 +355,36 @@ int ior_set_path (ior_t r, device_t origin, char* path){ int i = 0, error = 0, path_len; - device_t *dev_path; + device_t *dev_path = NULL; devicelink_t dl; + devicelink_t ddl = NULL; - if (error = resolve_path (origin, path, &dev_path, &path_len)){ + if (path && error = resolve_path (origin, path, &dev_path, &path_len) && + (dl = malloc (sizeof (struct devicelink) * path_len, M_BUS_IO, + M_NOWAIT|M_ZERO) || (free (dev_path), error = ENOMEM, 1))){ return (error); } - dl = malloc (sizeof (struct devicelink) * path_len, M_BUS_IO, - M_NOWAIT|M_ZERO); - if (!dl) { - free (dev_path); - return (ENOMEM); + ior_lock (r); + + if (!TAILQ_EMPTY(&r->path)){ + ddl = TAILQ_LAST (&r->path, devicelink_list); + TAILQ_REMOVE (&r->path, ddl, link); } + if (ddl) + free (ddl); - mtx_lock_spin (&r->guard_spin_mtx); - - for (i = 0; i < path_len; i++){ - dl->device_ptr = dev_path[i]; - TAILQ_INSERT_TAIL (&r->path, dl, link); - dl++; + if (dev_path){ + for (i = 0; i < path_len; i++){ + dl->device_ptr = dev_path[i]; + TAILQ_INSERT_TAIL (&r->path, dl, link); + dl++; + } + free (dev_path); } - mtx_unlock_spin (&r->guard_spin_mtx); + ior_unlock (r); - free (dev_path); return (0); } @@ -366,7 +393,7 @@ int i = 0; devicelink_t dl; - mtx_lock (&r->guard_mtx); + ior_lock (r); TAILQ_FOREACH (dl, &r->path, link){ (*path_len)++; @@ -376,7 +403,7 @@ M_NOWAIT|M_ZERO); if (!(*dev_path)){ - mtx_unlock (&r->guard_mtx); + ior_unlock (r); return (ENOMEM); } @@ -384,12 +411,12 @@ (*dev_path)[i++] = dl->device_ptr; } - mtx_unlock (&r->path); + ior_unlock (r); return (0); } -void //static for now +void ior_enqueue_adv (ior_t r, int queue_id){ ior_queue q = ior_queues[queue_id]; @@ -455,12 +482,12 @@ static void ior_lock (ior_t r){ - mtx_lock_spin (&r->guard_spin_mtx); + mtx_lock (&r->guard_mtx); } static void ior_unlock (ior_t r){ - mtx_unlock_spin (&r->guard_spin_mtx); + mtx_unlock (&r->guard_mtx); } static void @@ -468,23 +495,16 @@ devicelink_t nextdev; while (1){ - ior_lock (r); nextdev = TAILQ_NEXT(r->curdev, link); if (!nextdev){ ior_set_flags (r, IORF_INVALIDATE); } - ior_unlock (r); - if (ior_get_flags(r) >= IORF_DONE) - break; - r->curdev = nextdev; IOR_DO (r->curdev->device_ptr, r); - if (ior_get_flags(r) & IORF_TODESTOY){ - ior_destroy_async (r); - return; - } + if (ior_get_state(r) == IORS_NONE) + return(); if ((nextdev = TAILQ_NEXT(r->curdev, link)) && (device_get_flags(nextdev->device_ptr) & DF_ENQUEUEIORS)) @@ -498,16 +518,12 @@ devicelink_t nextdev; while (1){ - ior_lock (r); - nextdev = TAILQ_NEXT(r->curdev, link); + nextdev = TAILQ_PREV(r->curdev, devicelink_list, link); if (!nextdev){ - ior_set_flags (r, IORF_INVALIDATE); + ior_destroy_async (r); + return(); } - ior_unlock (r); - if (ior_get_flags(r) >= IORF_DONE) - break; - r->curdev = nextdev; IOR_DONE (r->curdev->device_ptr, r); @@ -516,7 +532,7 @@ return; } - if ((nextdev = TAILQ_NEXT(r->curdev, link)) && + if ((nextdev = TAILQ_PREV(r->curdev, devicelink_list, link)) && (device_get_flags(nextdev->device_ptr) & DF_ENQUEUEIORS)) break; } ==== //depot/projects/soc2007/thioretic_gidl2/sys/bus.h#9 (text+ko) ==== @@ -753,9 +753,8 @@ 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); +void ior_add_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);