From owner-p4-projects@FreeBSD.ORG Tue Feb 5 20:54:44 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id BF7F816A41B; Tue, 5 Feb 2008 20:54:43 +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 6CBE316A41A for ; Tue, 5 Feb 2008 20:54:43 +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 5945B13C478 for ; Tue, 5 Feb 2008 20:54:43 +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 m15Ksh4F009130 for ; Tue, 5 Feb 2008 20:54:43 GMT (envelope-from thioretic@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m15KshZV009127 for perforce@freebsd.org; Tue, 5 Feb 2008 20:54:43 GMT (envelope-from thioretic@FreeBSD.org) Date: Tue, 5 Feb 2008 20:54:43 GMT Message-Id: <200802052054.m15KshZV009127@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 134858 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: Tue, 05 Feb 2008 20:54:44 -0000 http://perforce.freebsd.org/chv.cgi?CH=134858 Change 134858 by thioretic@thioretic on 2008/02/05 20:54:39 Add io protos to bus.h Affected files ... .. //depot/projects/soc2007/thioretic_gidl2/kern/subr_busio.c#8 edit .. //depot/projects/soc2007/thioretic_gidl2/sys/bus.h#8 edit Differences ... ==== //depot/projects/soc2007/thioretic_gidl2/kern/subr_busio.c#8 (text+ko) ==== @@ -39,6 +39,7 @@ #define IORF_DONE 1<<0 #define IORF_INVALIDATE 1<<1 #define IORF_RETRY 1<<2 +#define IORF_TODESTROY 1<<3 u_int32_t flags; ior_link_list_t parents; /*ior_link_list_t*/ int children; @@ -51,7 +52,6 @@ TAILQ_ENTRY (ior) link; }; -typedef struct ior* ior_t; struct ior_link { ior_t iorp; @@ -70,6 +70,9 @@ 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; @@ -234,8 +237,8 @@ } ior_t -create_ior (device_t origin, int type, void* data, - ior_t* parents, int pcount, char* path, int enqueue){ +ior_create (device_t origin, int type, void* data, + 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; @@ -277,13 +280,36 @@ new_ior->origin = origin; if (enqueue){ - ior_enqueue (new_ior); + ior_enqueue_adv (new_ior, queue_id); } return (new_ior); } +static void +ior_destroy_async (ior_t r){ + devicelink_t dl; + + while (dl = TAILQ_FIRST (&r->path)){ + TAILQ_REMOVE (&r->path, dl, link); + } + mtx_destroy (r->guard_spin_mtx); + free (r); +} + +int +ior_destroy (ior_t r){ + if (!TAILQ_EMPTY (&new_ior->parents)) + return (0); + if (ior_get_state (r) == IORS_NONE){ + ior_destroy_async (r); + } else { + ior_set_flags (r, ior_get_flags (r) | IORF_TODESTROY); + } + return (1); +} + void ior_set_state (ior_t r, u_int32_t val){ r->state = val; @@ -363,7 +389,7 @@ return (0); } -static void //static for now +void //static for now ior_enqueue_adv (ior_t r, int queue_id){ ior_queue q = ior_queues[queue_id]; @@ -427,17 +453,17 @@ return (ior_dequeue_adv (r, r->queue_id)); } -void +static void ior_lock (ior_t r){ mtx_lock_spin (&r->guard_spin_mtx); } -void +static void ior_unlock (ior_t r){ mtx_unlock_spin (&r->guard_spin_mtx); } -static int +static void ior_do (ior_t r){ devicelink_t nextdev; @@ -455,6 +481,11 @@ r->curdev = nextdev; IOR_DO (r->curdev->device_ptr, r); + if (ior_get_flags(r) & IORF_TODESTOY){ + ior_destroy_async (r); + return; + } + if ((nextdev = TAILQ_NEXT(r->curdev, link)) && (device_get_flags(nextdev->device_ptr) & DF_ENQUEUEIORS)) break; @@ -462,7 +493,7 @@ ior_enqueue_adv (r, r->queue_id); } -static int +static void ior_done (ior_t r){ devicelink_t nextdev; @@ -479,6 +510,11 @@ r->curdev = nextdev; IOR_DONE (r->curdev->device_ptr, r); + + if (ior_get_flags(r) & IORF_TODESTOY){ + ior_destroy_async (r); + return; + } if ((nextdev = TAILQ_NEXT(r->curdev, link)) && (device_get_flags(nextdev->device_ptr) & DF_ENQUEUEIORS)) ==== //depot/projects/soc2007/thioretic_gidl2/sys/bus.h#8 (text+ko) ==== @@ -743,6 +743,26 @@ REL_CHILD | REL_PARENT, /* EV_SHUTDOWN */ /* TODO */ }; +#define IOR_QUEUES_NUM 1 +#define IOR_QUEUE_DEF 0 + +struct ior; +typedef struct ior* ior_t; + +ior_t ior_create (device_t origin, int type, void* data, + 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); +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); +void ior_enqueue_adv (ior_t r, int queue_id); +void ior_enqueue (ior_t r); +int ior_dequeue (ior_t r); + #endif /* _KERNEL */ #endif /* !_SYS_BUS_H_ */