Date: Wed, 13 Feb 2008 20:25:23 GMT From: Maxim Zhuravlev <thioretic@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 135342 for review Message-ID: <200802132025.m1DKPNVZ035294@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=135342 Change 135342 by thioretic@thioretic on 2008/02/13 20:25:23 Basic NewBus IO subsystem API is outlined by now. Plus(?) some additional helper functions to be implemented. Affected files ... .. //depot/projects/soc2007/thioretic_gidl2/kern/subr_busio.c#10 edit .. //depot/projects/soc2007/thioretic_gidl2/sys/bus.h#10 edit Differences ... ==== //depot/projects/soc2007/thioretic_gidl2/kern/subr_busio.c#10 (text+ko) ==== @@ -34,14 +34,14 @@ struct ior { u_int32_t type; //see sys/ior_types.h void* data; -#define IORS_NONE 0 -#define IORS_ENQUEUED 1<<0 -#define IORS_OWNED 1<<1 +#define IORS_NONE (0) +#define IORS_ENQUEUED (1<<1) +#define IORS_OWNED (1<<2) +#define IORS_PAUSED (1<<3) u_int32_t state; -#define IORF_DONE 1<<0 -#define IORF_INVALIDATE 1<<1 -#define IORF_RETRY 1<<2 -#define IORF_TODESTROY 1<<3 +#define IORF_DONE (1<<0) +#define IORF_INVALIDATE (1<<1) +#define IORF_RETRY (1<<2) u_int32_t flags; ior_link_list_t parents; int children; @@ -72,6 +72,7 @@ struct mtx guard_mtx; }; +#define IOR_QUEUES_NUM 1 static ior_queue ior_queues[IOR_QUEUES_NUM]; static struct mtx iors_list_mtx; @@ -215,7 +216,7 @@ if (qid == IOR_QUEUES_NUM) return (1); - if (r->state != IORS_ENQUEUED){ + if (r->state & IORS_OWNED){ mtx_unlock (&q.guard_mtx); ior_unlock (r); goto retry; @@ -224,7 +225,9 @@ q.todo = TAILQ_NEXT(r, link); mtx_unlock (&q.guard_mtx); - r->state = IORS_OWNED; + ior_dequeue (r); + r->state |= IORS_OWNED; + ior_unlock (r); if (ior_get_flags(r) >= IORF_DONE) @@ -238,7 +241,7 @@ ior_t ior_create (device_t origin, int type, void* data, ior_t* parents, int pcount, char* path, - int enqueue, int queue_id){ + /*int enqueue,*/ int prio){ ior_t new_ior; ior_link_t pil, pils; int i, error = 0; @@ -274,10 +277,10 @@ new_ior->children = 0; new_ior->origin = new_ior->curdev = origin; + new_ior->queue_id = -1; - if (enqueue){ - ior_enqueue_adv (new_ior, queue_id); - } + /*if (enqueue)*/ + ior_enqueue_adv (new_ior, queue_id); return (new_ior); @@ -295,7 +298,7 @@ TAILQ_REMOVE (&r->parents, il, link); } - mtx_destroy (r->guard_spin_mtx); + mtx_destroy (r->guard_mtx); free (r); } @@ -306,8 +309,6 @@ if (r->children) return (0); - ior_add_flags (r, IORF_TODESTROY); - ior_lock (r); while (dev = TAILQ_NEXT(r->curdev)){ @@ -320,7 +321,7 @@ } int -ior_abort (ior_t r, u_int32_t flags){ +ior_complete (ior_t r, u_int32_t flags){ if (ior_destroy (r)){ ior_add_flags (r, flags); return (1); @@ -328,22 +329,12 @@ return (0); } -static void -ior_set_state (ior_t r, u_int32_t val){ - r->state = val; -} - -static u_int32_t -ior_get_state (ior_t r){ - return (r->state); -} - void ior_set_flags (ior_t r, u_int32_t val){ r->flags = val; } void -ior_add_flag (ior_t r, u_int32_t val){ +ior_add_flags (ior_t r, u_int32_t val){ r->flags |= val; } @@ -352,7 +343,7 @@ return (r->flags); } -int +static int ior_set_path (ior_t r, device_t origin, char* path){ int i = 0, error = 0, path_len; device_t *dev_path = NULL; @@ -416,13 +407,13 @@ return (0); } -void +static void ior_enqueue_adv (ior_t r, int queue_id){ ior_queue q = ior_queues[queue_id]; ior_lock (r); - if (r->state >= IORS_ENQUEUED){ + if (r->state & IORS_ENQUEUED){ ior_unlock (r); return (); } @@ -435,29 +426,29 @@ mtx_unlock (&q.guard_mtx); - r->queue_id = queue_id + 1; - r->state = IORS_ENQUEUED; + r->queue_id = queue_id; + r->state |= IORS_ENQUEUED; ior_unlock (r); wakeup_one (&work_kthreads_to_wait_on); } -void +static void ior_enqueue (ior_t r) { - return (ior_enqueue_adv (r, IOR_QUEUE_DEF)); + return (ior_enqueue_adv (r, r->queue_id != -1 ? r->queue_id : IOR_PRIO_DEF)); } static int -ior_dequeue_adv (ior_t r, int queue_id){ +ior_dequeue (ior_t r){ int error = 0; - ior_queue q = ior_queues[queue_id]; + ior_queue q = ior_queues[r->queue_id]; ior_lock (r); - if (r->state != IORS_ENQUEUED || r->children){ - ior_unlock (r); - return (1); + if (!(r->state & IORS_ENQUEUED)){ + ior_unlock (r); + return (1); } mtx_lock (&q.guard_mtx); @@ -468,18 +459,13 @@ mtx_unlock (&q.quard_mtx); - r->state = IORS_NONE; + r->state ^= IORS_ENQUEUED; ior_unlock (r); return (error); } -int -ior_dequeue (ior_t r) { - return (ior_dequeue_adv (r, r->queue_id)); -} - static void ior_lock (ior_t r){ mtx_lock (&r->guard_mtx); @@ -501,10 +487,15 @@ } r->curdev = nextdev; - IOR_DO (r->curdev->device_ptr, r); + IOR_DO (r->curdev->device_ptr, r); /*can change r->state to IORS_PAUSED|IORS_OWNED;*/ - if (ior_get_state(r) == IORS_NONE) + ior_lock (r); + if (r->state & IORS_PAUSED){ + r->state ^= IORS_OWNED; + ior_unlock (r); return(); + } + ior_unlock (r); if ((nextdev = TAILQ_NEXT(r->curdev, link)) && (device_get_flags(nextdev->device_ptr) & DF_ENQUEUEIORS)) @@ -527,14 +518,39 @@ r->curdev = nextdev; IOR_DONE (r->curdev->device_ptr, r); - if (ior_get_flags(r) & IORF_TODESTOY){ - ior_destroy_async (r); - return; + ior_lock (r); + if (r->state & IORS_PAUSED){ + r->state ^= IORS_OWNED; + ior_unlock (r); + return(); } - + ior_unlock (r); + if ((nextdev = TAILQ_PREV(r->curdev, devicelink_list, link)) && (device_get_flags(nextdev->device_ptr) & DF_ENQUEUEIORS)) break; } ior_enqueue_adv (r, r->queue_id); } + +void +ior_pause (ior_t r){ + r->state |= IORS_PAUSED; +} + +void +ior_resume (ior_t r){ + ior_lock (r); + if (r->state & IORS_OWNED){ + r->state ^= IORS_PAUSED; + ior_unlock (r); + } else { + ior_unlock (r); + ior_enqueue(r); + } +} + +void +ior_set_priority (ior_t r, int prio){ + r->queue_id = prio; +} ==== //depot/projects/soc2007/thioretic_gidl2/sys/bus.h#10 (text+ko) ==== @@ -713,7 +713,7 @@ bus_space_write_region_stream_8(rman_get_bustag(r), rman_get_bushandle(r), (o), (d), (c)) /** - * event support functions + * EVENTS SUPPORT API */ #define EV_ATTACH 0 #define EV_DETACH 1 @@ -727,11 +727,11 @@ #define REL_CHILD (1<<29) #define REL_PARENT (1<<30) #define EVP_ENQALWAYS (1<<31) -/** - * event_pref array is an array of event settings. - * includes: - * what devices should receive the event (children and/or parents) - * what enqueued events should be dequeued +/* + event_pref array is an array of event settings. + includes: + what devices should receive the event (children and/or parents) + what enqueued events should be dequeued */ uint32_t event_pref[32] = @@ -743,24 +743,40 @@ REL_CHILD | REL_PARENT, /* EV_SHUTDOWN */ /* TODO */ }; -#define IOR_QUEUES_NUM 1 -#define IOR_QUEUE_DEF 0 + +/** + * BUS IO SUBSYSTEM API + */ struct ior; typedef struct ior* ior_t; +/* + ior_create() and ior_destroy() should be used by origin device + */ 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 prio); int ior_destroy (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); -void ior_enqueue_adv (ior_t r, int queue_id); -void ior_enqueue (ior_t r); -int ior_dequeue (ior_t r); +int ior_get_path (ior_t r, device_t** dev_path, int* path_len); +/* + ior_pause() and ior_resume() should be used to revoke an ior + from bus io subsystem for delayed processing so that we don't need + to make a working thread to sleep. + ior_pause() should be called JUST within ior_do() and ior_done() + functions + */ +void ior_pause (ior_t r); +void ior_resume (ior_t r); +/* + ior_complete() is to be used by non-endpoint devices to stop an ior processing. + The ior flags are set to >= IORF_DONE. + */ +int ior_complete (ior_t r, u_int32_t flags); +void ior_set_priority (ior_t r, int prio); +#define IOR_PRIO_DEF 0 #endif /* _KERNEL */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200802132025.m1DKPNVZ035294>