Alll we want to get this change in to help define the 1.0 API, can we get reviews finalised for it.
On 5 November 2014 03:00, Alexandru Badicioiu < alexandru.badici...@linaro.org> wrote: > The specific case I was talking about is when a packet is dequeued from an > ordered queue and it needs fragmentation as part of the processing before > the next enqueue which is supposed to restore the order - for example IPsec > red side fragmentation (fragmentation before encryption) or fragmentation > before transmission on an interface having a MTU smaller than the packet > size. > The fragments of the same packet are ordered with respect to each other > but they can be interleaved with other packets from the same queue or with > fragments of another packet. > As we have skip order function which essentially tells the order > restoration logic to give up on the current expected packet in sequence and > move to the next packet we also need a way to tell that a sequence of > buffers share the same ordering information so the order restoration logic > treats them as a whole rather as separate packets. > > Alex > > > > > On 4 November 2014 17:15, Gilad Ben Yossef <gil...@ezchip.com> wrote: > >> >> >> I don't think it can use the first fragment place in the order. It can >> use the last fragment to arrive place in the queue. >> >> Otherwise you have to stop forwarding until all fragments arrive to keep >> the order… no? >> >> >> >> *Gilad Ben-Yossef* >> >> Software Architect >> >> EZchip Technologies Ltd. >> >> 37 Israel Pollak Ave, Kiryat Gat 82025 ,Israel >> >> Tel: +972-4-959-6666 ext. 576, Fax: +972-8-681-1483 >> Mobile: +972-52-826-0388, US Mobile: +1-973-826-0388 >> >> Email: gil...@ezchip.com, Web: http://www.ezchip.com >> >> >> >> *"Ethernet always wins."* >> >> — Andy Bechtolsheim >> >> >> >> *From:* Alexandru Badicioiu [mailto:alexandru.badici...@linaro.org] >> *Sent:* Tuesday, November 04, 2014 4:13 PM >> *To:* Bill Fischofer >> *Cc:* Gilad Ben Yossef; Savolainen, Petri (NSN - FI/Espoo); >> lng-odp@lists.linaro.org >> >> *Subject:* Re: [lng-odp] [PATCH] Scheduler atomic and ordered definitions >> >> >> >> In addition to skip order function I think we need to handle the case >> when a packet gets fragmented (e.g. IP fragmentation). In this case the >> fragments should share the original sequence number and the order >> restoration logic should be aware when the last fragment occurs. >> >> >> >> Alex >> >> >> >> On 3 November 2014 13:45, Bill Fischofer <bill.fischo...@linaro.org> >> wrote: >> >> OK, thanks. That certainly matches the step-by-step semantics Petri >> proposed. We'll have to discuss what, if anything, more we need regarding >> ORDERED queues post-v1.0 next year. >> >> >> >> Bill >> >> >> >> On Mon, Nov 3, 2014 at 3:03 AM, Gilad Ben Yossef <gil...@ezchip.com> >> wrote: >> >> >> >> >> >> What NPS does in HW is that each buffer you dequeue actually stays on the >> queue (but is marked as consumed by the application) and you are given a >> "tag" for it. >> >> >> >> When I want to queue the buffer to the next, I give the HW the tag I got, >> not the buffer handle and what the HW does is only than fully dequeue the >> buffer from the original queue before queuing it into the new queue – but >> only after all preceding (older) buffers on the original queue have been >> fully dequeued, >> >> >> >> Free of a buffer causes a dequeue from the original queue as well. >> >> >> >> And I can also give release a buffer from the original queue (give the HW >> the tag back and say "you don't have to wait for this buffer any longer). >> >> >> >> I hope this helps, >> >> Gilad >> >> >> >> *Gilad Ben-Yossef* >> >> Software Architect >> >> EZchip Technologies Ltd. >> >> 37 Israel Pollak Ave, Kiryat Gat 82025 ,Israel >> >> Tel: +972-4-959-6666 ext. 576, Fax: +972-8-681-1483 >> Mobile: +972-52-826-0388, US Mobile: +1-973-826-0388 >> >> Email: gil...@ezchip.com, Web: http://www.ezchip.com >> >> >> >> *"Ethernet always wins."* >> >> — Andy Bechtolsheim >> >> >> >> *From:* Bill Fischofer [mailto:bill.fischo...@linaro.org] >> *Sent:* Sunday, November 02, 2014 5:44 PM >> *To:* Gilad Ben Yossef >> *Cc:* Savolainen, Petri (NSN - FI/Espoo); lng-odp@lists.linaro.org >> >> >> *Subject:* Re: [lng-odp] [PATCH] Scheduler atomic and ordered definitions >> >> >> >> Thanks Gilad. Can you elaborate on that a bit more? I can understand >> how step-by-step would be potentially easier to implement, but does it also >> capture the majority of expected application use cases? >> >> >> >> A good confirmation that this is the correct approach for v1.0 though. >> >> >> >> On Sun, Nov 2, 2014 at 9:26 AM, Gilad Ben Yossef <gil...@ezchip.com> >> wrote: >> >> >> >> For what it's worth, as a SoC vendor rep. that has ordered queue in HW, >> Petri's definition is actually preferred for us even going forward J >> >> >> >> >> >> Thanks, >> >> Gilad >> >> >> >> *Gilad Ben-Yossef* >> >> Software Architect >> >> EZchip Technologies Ltd. >> >> 37 Israel Pollak Ave, Kiryat Gat 82025 ,Israel >> >> Tel: +972-4-959-6666 ext. 576, Fax: +972-8-681-1483 >> Mobile: +972-52-826-0388, US Mobile: +1-973-826-0388 >> >> Email: gil...@ezchip.com, Web: http://www.ezchip.com >> >> >> >> *"Ethernet always wins."* >> >> — Andy Bechtolsheim >> >> >> >> *From:* lng-odp-boun...@lists.linaro.org [mailto: >> lng-odp-boun...@lists.linaro.org] *On Behalf Of *Bill Fischofer >> *Sent:* Friday, October 31, 2014 2:59 PM >> *To:* Savolainen, Petri (NSN - FI/Espoo) >> *Cc:* lng-odp@lists.linaro.org >> >> >> *Subject:* Re: [lng-odp] [PATCH] Scheduler atomic and ordered definitions >> >> >> >> 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 >> >> >> > > > _______________________________________________ > lng-odp mailing list > lng-odp@lists.linaro.org > http://lists.linaro.org/mailman/listinfo/lng-odp > > -- *Mike Holmes* Linaro Sr Technical Manager LNG - ODP
_______________________________________________ lng-odp mailing list lng-odp@lists.linaro.org http://lists.linaro.org/mailman/listinfo/lng-odp