It would be documentation in v1.0 but worth keeping since if the step-by-step restriction is relaxed next year it would mean we wouldn't have to change the API.
On Fri, Oct 31, 2014 at 8:10 AM, Alexandru Badicioiu < alexandru.badici...@linaro.org> wrote: > In this case the "dest" argument in the following function: > +void odp_schedule_skip_order(odp_queue_t dest, odp_buffer_t buf); > looses it's meaning. > > Alex > > > > On 31 October 2014 14:59, Bill Fischofer <bill.fischo...@linaro.org> > wrote: > >> This may well be a reasonable restriction for ODP v1.0 but I believe it's >> something we need to put on the list for "production grade" improvements >> for 2015. >> >> Bill >> >> On Fri, Oct 31, 2014 at 7:57 AM, Savolainen, Petri (NSN - FI/Espoo) < >> petri.savolai...@nsn.com> wrote: >> >>> Yes, it’s step-by-step and I think it’s the level of ordering we need >>> for v1.0. Most SoCs can implement it, even when the HW scheduler would not >>> have order support but only atomic/parallel. This way defined atomic >>> scheduling can be used to implement functionality correct ordered queues, >>> the throughput is not improved but it functions correctly. >>> >>> >>> >>> -Petri >>> >>> >>> >>> >>> >>> *From:* ext Bill Fischofer [mailto:bill.fischo...@linaro.org] >>> *Sent:* Friday, October 31, 2014 2:48 PM >>> *To:* Alexandru Badicioiu >>> *Cc:* Petri Savolainen; lng-odp@lists.linaro.org >>> *Subject:* Re: [lng-odp] [PATCH] Scheduler atomic and ordered >>> definitions >>> >>> >>> >>> I can well imagine the step-by-step order preservation to be simpler to >>> implement (in SW) but it would also seem to limit performance since the >>> only way to ensure end-to-end order preservation would be if each >>> intermediate queue from ingress to egress were an ordered queue. If there >>> is a parallel queue anywhere in the chain that would break things. >>> >>> >>> >>> The question is: Is this restriction needed and/or sufficient for ODP >>> v1.0? >>> >>> >>> >>> On Fri, Oct 31, 2014 at 7:42 AM, Alexandru Badicioiu < >>> alexandru.badici...@linaro.org> wrote: >>> >>> "+ * The original enqueue order of the source queue is maintained when >>> buffers are >>> + * enqueued to their destination queue(s) before another schedule call" >>> >>> >>> >>> Is this assuming that the order will be restored always at the next >>> enqueue? I think there should be an option to explicitly indicate if the >>> next enqueue is supposed to restore the order or not, especially when >>> packets move from queue to queue. Ordered queues are costly compared with >>> the ordinary ones. >>> >>> >>> >>> Alex >>> >>> >>> >>> On 31 October 2014 14:25, Petri Savolainen <petri.savolai...@linaro.org> >>> wrote: >>> >>> Improved atomic and ordered synchronisation definitions. Added >>> order skip function prototype. >>> >>> Signed-off-by: Petri Savolainen <petri.savolai...@linaro.org> >>> >>> --- >>> This is the ordered queue definition (in patch format) promised >>> in the call yesterday. >>> --- >>> platform/linux-generic/include/api/odp_queue.h | 31 +++++++++++++++- >>> platform/linux-generic/include/api/odp_schedule.h | 45 >>> ++++++++++++++++++----- >>> 2 files changed, 64 insertions(+), 12 deletions(-) >>> >>> diff --git a/platform/linux-generic/include/api/odp_queue.h >>> b/platform/linux-generic/include/api/odp_queue.h >>> index b8ac4bb..c0c3969 100644 >>> --- a/platform/linux-generic/include/api/odp_queue.h >>> +++ b/platform/linux-generic/include/api/odp_queue.h >>> @@ -78,8 +78,35 @@ typedef int odp_schedule_prio_t; >>> typedef int odp_schedule_sync_t; >>> >>> #define ODP_SCHED_SYNC_NONE 0 /**< Queue not synchronised */ >>> -#define ODP_SCHED_SYNC_ATOMIC 1 /**< Atomic queue */ >>> -#define ODP_SCHED_SYNC_ORDERED 2 /**< Ordered queue */ >>> + >>> +/** >>> + * Atomic queue synchronisation >>> + * >>> + * The scheduler gives buffers from a queue to a single core at a time. >>> This >>> + * serialises processing of the buffers from the source queue and helps >>> user to >>> + * avoid SW locking. Another schedule call will implicitely release the >>> atomic >>> + * synchronisation of the source queue and free the scheduler to give >>> buffers >>> + * from the queue to other cores. >>> + * >>> + * User can hint the scheduler to release the atomic synchronisation >>> early with >>> + * odp_schedule_release_atomic(). >>> + */ >>> +#define ODP_SCHED_SYNC_ATOMIC 1 >>> + >>> +/** >>> + * Ordered queue synchronisation >>> + * >>> + * The scheduler may give out buffers to multiple cores for parallel >>> processing. >>> + * The original enqueue order of the source queue is maintained when >>> buffers are >>> + * enqueued to their destination queue(s) before another schedule call. >>> Buffers >>> + * from the same ordered (source) queue appear in their original order >>> when >>> + * dequeued from a destination queue. The destination queue type >>> (POLL/SCHED) or >>> + * synchronisation (NONE/ATOMIC/ORDERED) is not limited. >>> + * >>> + * User can command the scheduler to skip ordering of a buffer with >>> + * odp_schedule_skip_order(). >>> + */ >>> +#define ODP_SCHED_SYNC_ORDERED 2 >>> >>> /** Default queue synchronisation */ >>> #define ODP_SCHED_SYNC_DEFAULT ODP_SCHED_SYNC_ATOMIC >>> diff --git a/platform/linux-generic/include/api/odp_schedule.h >>> b/platform/linux-generic/include/api/odp_schedule.h >>> index 91fec10..2a1a642 100644 >>> --- a/platform/linux-generic/include/api/odp_schedule.h >>> +++ b/platform/linux-generic/include/api/odp_schedule.h >>> @@ -52,8 +52,8 @@ uint64_t odp_schedule_wait_time(uint64_t ns); >>> * for a buffer according to the wait parameter setting. Returns >>> * ODP_BUFFER_INVALID if reaches end of the wait period. >>> * >>> - * @param from Output parameter for the source queue (where the >>> buffer was >>> - * dequeued from). Ignored if NULL. >>> + * @param src The source queue (output). Indicates from which queue >>> the >>> + * buffer was dequeued. Ignored if NULL. >>> * @param wait Minimum time to wait for a buffer. Waits infinitely, >>> if set to >>> * ODP_SCHED_WAIT. Does not wait, if set to >>> ODP_SCHED_NO_WAIT. >>> * Use odp_schedule_wait_time() to convert time to other >>> wait >>> @@ -61,7 +61,7 @@ uint64_t odp_schedule_wait_time(uint64_t ns); >>> * >>> * @return Next highest priority buffer, or ODP_BUFFER_INVALID >>> */ >>> -odp_buffer_t odp_schedule(odp_queue_t *from, uint64_t wait); >>> +odp_buffer_t odp_schedule(odp_queue_t *src, uint64_t wait); >>> >>> /** >>> * Schedule one buffer >>> @@ -76,8 +76,8 @@ odp_buffer_t odp_schedule(odp_queue_t *from, uint64_t >>> wait); >>> * >>> * User can exit the schedule loop without first calling >>> odp_schedule_pause(). >>> * >>> - * @param from Output parameter for the source queue (where the >>> buffer was >>> - * dequeued from). Ignored if NULL. >>> + * @param src The source queue (output). Indicates from which queue >>> the >>> + * buffer was dequeued. Ignored if NULL. >>> * @param wait Minimum time to wait for a buffer. Waits infinitely, >>> if set to >>> * ODP_SCHED_WAIT. Does not wait, if set to >>> ODP_SCHED_NO_WAIT. >>> * Use odp_schedule_wait_time() to convert time to other >>> wait >>> @@ -85,7 +85,7 @@ odp_buffer_t odp_schedule(odp_queue_t *from, uint64_t >>> wait); >>> * >>> * @return Next highest priority buffer, or ODP_BUFFER_INVALID >>> */ >>> -odp_buffer_t odp_schedule_one(odp_queue_t *from, uint64_t wait); >>> +odp_buffer_t odp_schedule_one(odp_queue_t *src, uint64_t wait); >>> >>> >>> /** >>> @@ -93,8 +93,8 @@ odp_buffer_t odp_schedule_one(odp_queue_t *from, >>> uint64_t wait); >>> * >>> * Like odp_schedule(), but returns multiple buffers from a queue. >>> * >>> - * @param from Output parameter for the source queue (where the >>> buffer was >>> - * dequeued from). Ignored if NULL. >>> + * @param src The source queue (output). Indicates from which queue >>> the >>> + * buffer was dequeued. Ignored if NULL. >>> * @param wait Minimum time to wait for a buffer. Waits infinitely, >>> if set to >>> * ODP_SCHED_WAIT. Does not wait, if set to >>> ODP_SCHED_NO_WAIT. >>> * Use odp_schedule_wait_time() to convert time to other >>> wait >>> @@ -104,7 +104,7 @@ odp_buffer_t odp_schedule_one(odp_queue_t *from, >>> uint64_t wait); >>> * >>> * @return Number of buffers outputed (0 ... num) >>> */ >>> -int odp_schedule_multi(odp_queue_t *from, uint64_t wait, odp_buffer_t >>> out_buf[], >>> +int odp_schedule_multi(odp_queue_t *src, uint64_t wait, odp_buffer_t >>> out_buf[], >>> unsigned int num); >>> >>> /** >>> @@ -129,11 +129,36 @@ void odp_schedule_pause(void); >>> void odp_schedule_resume(void); >>> >>> /** >>> - * Release currently hold atomic context >>> + * Release the current atomic context >>> + * >>> + * This calls is valid only when the source queue has ATOMIC >>> synchronisation. It >>> + * hints the scheduler that the user has completed processing the >>> critical >>> + * section that needs atomic synchronisation. After the call, the >>> scheduler is >>> + * allowed to give next buffer from the same queue to another core. >>> + * >>> + * Usage of the call may increase parallelism and thus system >>> performance, but >>> + * carefulness is needed when splitting processing into critical vs. >>> + * non-critical sections. >>> */ >>> void odp_schedule_release_atomic(void); >>> >>> /** >>> + * Skip ordering of the buffer >>> + * >>> + * This calls is valid only when source queue has ORDERED >>> synchronisation. It >>> + * commands the scheduler to skip ordering of the buffer. Scheduler >>> maintains >>> + * ordering between two queues: source and destination. The dest >>> parameter >>> + * identifies the destination queue of that pair. After the call, >>> ordering is >>> + * not maintained for the buffer anymore but user still owns the >>> buffer. User >>> + * can e.g. store it, free it or enqueue it (to the same or another >>> queue). >>> + * >>> + * @param dest Destination queue >>> + * @param buf Buffer >>> + */ >>> +void odp_schedule_skip_order(odp_queue_t dest, odp_buffer_t buf); >>> + >>> + >>> +/** >>> * Number of scheduling priorities >>> * >>> * @return Number of scheduling priorities >>> -- >>> 2.1.1 >>> >>> >>> _______________________________________________ >>> lng-odp mailing list >>> lng-odp@lists.linaro.org >>> http://lists.linaro.org/mailman/listinfo/lng-odp >>> >>> >>> >>> >>> _______________________________________________ >>> lng-odp mailing list >>> lng-odp@lists.linaro.org >>> http://lists.linaro.org/mailman/listinfo/lng-odp >>> >>> >>> >> >> >
_______________________________________________ lng-odp mailing list lng-odp@lists.linaro.org http://lists.linaro.org/mailman/listinfo/lng-odp