[v3] rte_ring: clarify preemptible nature of ring algorithm

Message ID 1531195247-22612-1-git-send-email-honnappa.nagarahalli@arm.com
State New
Headers show
Series
  • [v3] rte_ring: clarify preemptible nature of ring algorithm
Related show

Commit Message

Honnappa Nagarahalli July 10, 2018, 4 a.m.
rte_ring implementation is not preemptible only under certain
circumstances. This clarification is helpful for data plane and
control plane communication using rte_ring.

Signed-off-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>

Reviewed-by: Gavin Hu <gavin.hu@arm.com>

Reviewed-by: Ola Liljedahl <ola.liljedahl@arm.com>

---
v3:
* Corrected known issues for rte_ring
* Referred to known issues in rte_ring.h (Burakov, Oliver)

v2:
* Fixed checkpatch warnings

 doc/guides/prog_guide/env_abstraction_layer.rst | 27 ++++++++++++++-----------
 lib/librte_ring/rte_ring.h                      |  5 +++--
 2 files changed, 18 insertions(+), 14 deletions(-)

-- 
2.7.4

Comments

Olivier Matz July 16, 2018, 7 a.m. | #1
Hi,

On Mon, Jul 09, 2018 at 11:00:47PM -0500, Honnappa Nagarahalli wrote:
> rte_ring implementation is not preemptible only under certain

> circumstances. This clarification is helpful for data plane and

> control plane communication using rte_ring.

> 

> Signed-off-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>

> Reviewed-by: Gavin Hu <gavin.hu@arm.com>

> Reviewed-by: Ola Liljedahl <ola.liljedahl@arm.com>

> ---

> v3:

> * Corrected known issues for rte_ring

> * Referred to known issues in rte_ring.h (Burakov, Oliver)

> 

> v2:

> * Fixed checkpatch warnings

> 

>  doc/guides/prog_guide/env_abstraction_layer.rst | 27 ++++++++++++++-----------

>  lib/librte_ring/rte_ring.h                      |  5 +++--

>  2 files changed, 18 insertions(+), 14 deletions(-)

> 

> diff --git a/doc/guides/prog_guide/env_abstraction_layer.rst b/doc/guides/prog_guide/env_abstraction_layer.rst

> index a22640d..f47a4be 100644

> --- a/doc/guides/prog_guide/env_abstraction_layer.rst

> +++ b/doc/guides/prog_guide/env_abstraction_layer.rst

> @@ -435,23 +435,26 @@ Known Issues

>  

>      The "non-preemptive" constraint means:

>  

> -    - a pthread doing multi-producers enqueues on a given ring must not

> -      be preempted by another pthread doing a multi-producer enqueue on

> -      the same ring.

> -    - a pthread doing multi-consumers dequeues on a given ring must not

> -      be preempted by another pthread doing a multi-consumer dequeue on

> -      the same ring.

> +      A preempted pthread can block other pthreads (operating on the same ring)

> +      from completing their operations, only if those pthreads are performing

> +      the same ring operation (enqueue/dequeue) as the preempted pthread.

> +      In other words, a preempted consumer pthread will not block any producer

> +      pthreads and vice versa.

>  

> -    Bypassing this constraint may cause the 2nd pthread to spin until the 1st one is scheduled again.

> -    Moreover, if the 1st pthread is preempted by a context that has an higher priority, it may even cause a dead lock.

> +    Bypassing this constraint may cause other pthreads to spin until the preempted pthread is scheduled again.

> +    Moreover, if the pthread is preempted by a context that has a higher priority, it may even cause a dead lock.


Your reword makes this section more generic, but I'm not sure it is
really clearer. IMO it can stay as it was.

John, Anatoly, do you have any opinion?


> -  This does not mean it cannot be used, simply, there is a need to narrow down the situation when it is used by multi-pthread on the same core.

> +  This means, use cases involving preemptible pthreads should consider using rte_ring carefully.

>  

> -  1. It CAN be used for any single-producer or single-consumer situation.

> +  1. It CAN be used for preemptible single-producer and single-consumer use case.

>  

> -  2. It MAY be used by multi-producer/consumer pthread whose scheduling policy are all SCHED_OTHER(cfs). User SHOULD be aware of the performance penalty before using it.

> +  2. It CAN be used for non-preemptible multi-producer and preemptible single-consumer use case.

>  

> -  3. It MUST not be used by multi-producer/consumer pthreads, whose scheduling policies are SCHED_FIFO or SCHED_RR.

> +  3. It CAN be used for preemptible single-producer and non-preemptible multi-consumer use case.

> +

> +  4. It MAY be used by preemptible multi-producer and/or preemptible multi-consumer pthreads whose scheduling policy are all SCHED_OTHER(cfs), SCHED_IDLE or SCHED_BATCH. User SHOULD be aware of the performance penalty before using it.

> +

> +  5. It MUST not be used by multi-producer/consumer pthreads, whose scheduling policies are SCHED_FIFO or SCHED_RR.

>  

>  + rte_timer

>  

> diff --git a/lib/librte_ring/rte_ring.h b/lib/librte_ring/rte_ring.h

> index 1245822..e680101 100644

> --- a/lib/librte_ring/rte_ring.h

> +++ b/lib/librte_ring/rte_ring.h

> @@ -26,8 +26,9 @@

>   * - Bulk dequeue.

>   * - Bulk enqueue.

>   *

> - * Note: the ring implementation is not preemptable. A lcore must not

> - * be interrupted by another task that uses the same ring.

> + * Note: the ring implementation is not preemptible. Refer to Programmer's

> + * guide/Environment Abstraction Layer/Multiple pthread/Known Issues/rte_ring

> + * for more information.



The other parts looks good to me, thank you.
Burakov, Anatoly July 16, 2018, 4:28 p.m. | #2
On 16-Jul-18 8:00 AM, Olivier Matz wrote:
> Hi,

> 

> On Mon, Jul 09, 2018 at 11:00:47PM -0500, Honnappa Nagarahalli wrote:

>> rte_ring implementation is not preemptible only under certain

>> circumstances. This clarification is helpful for data plane and

>> control plane communication using rte_ring.

>>

>> Signed-off-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>

>> Reviewed-by: Gavin Hu <gavin.hu@arm.com>

>> Reviewed-by: Ola Liljedahl <ola.liljedahl@arm.com>

>> ---

>> v3:

>> * Corrected known issues for rte_ring

>> * Referred to known issues in rte_ring.h (Burakov, Oliver)

>>

>> v2:

>> * Fixed checkpatch warnings

>>

>>   doc/guides/prog_guide/env_abstraction_layer.rst | 27 ++++++++++++++-----------

>>   lib/librte_ring/rte_ring.h                      |  5 +++--

>>   2 files changed, 18 insertions(+), 14 deletions(-)

>>

>> diff --git a/doc/guides/prog_guide/env_abstraction_layer.rst b/doc/guides/prog_guide/env_abstraction_layer.rst

>> index a22640d..f47a4be 100644

>> --- a/doc/guides/prog_guide/env_abstraction_layer.rst

>> +++ b/doc/guides/prog_guide/env_abstraction_layer.rst

>> @@ -435,23 +435,26 @@ Known Issues

>>   

>>       The "non-preemptive" constraint means:

>>   

>> -    - a pthread doing multi-producers enqueues on a given ring must not

>> -      be preempted by another pthread doing a multi-producer enqueue on

>> -      the same ring.

>> -    - a pthread doing multi-consumers dequeues on a given ring must not

>> -      be preempted by another pthread doing a multi-consumer dequeue on

>> -      the same ring.

>> +      A preempted pthread can block other pthreads (operating on the same ring)

>> +      from completing their operations, only if those pthreads are performing

>> +      the same ring operation (enqueue/dequeue) as the preempted pthread.

>> +      In other words, a preempted consumer pthread will not block any producer

>> +      pthreads and vice versa.

>>   

>> -    Bypassing this constraint may cause the 2nd pthread to spin until the 1st one is scheduled again.

>> -    Moreover, if the 1st pthread is preempted by a context that has an higher priority, it may even cause a dead lock.

>> +    Bypassing this constraint may cause other pthreads to spin until the preempted pthread is scheduled again.

>> +    Moreover, if the pthread is preempted by a context that has a higher priority, it may even cause a dead lock.

> 

> Your reword makes this section more generic, but I'm not sure it is

> really clearer. IMO it can stay as it was.

> 

> John, Anatoly, do you have any opinion?


I think that part can stay as it was. As much as avoiding overly 
specific wording is useful, in this case the original specificity is 
warranted because thinking about this stuff makes enough heads hurt as 
it is :)

> 

> 

>> -  This does not mean it cannot be used, simply, there is a need to narrow down the situation when it is used by multi-pthread on the same core.

>> +  This means, use cases involving preemptible pthreads should consider using rte_ring carefully.

>>   

>> -  1. It CAN be used for any single-producer or single-consumer situation.

>> +  1. It CAN be used for preemptible single-producer and single-consumer use case.

>>   

>> -  2. It MAY be used by multi-producer/consumer pthread whose scheduling policy are all SCHED_OTHER(cfs). User SHOULD be aware of the performance penalty before using it.

>> +  2. It CAN be used for non-preemptible multi-producer and preemptible single-consumer use case.

>>   

>> -  3. It MUST not be used by multi-producer/consumer pthreads, whose scheduling policies are SCHED_FIFO or SCHED_RR.

>> +  3. It CAN be used for preemptible single-producer and non-preemptible multi-consumer use case.

>> +

>> +  4. It MAY be used by preemptible multi-producer and/or preemptible multi-consumer pthreads whose scheduling policy are all SCHED_OTHER(cfs), SCHED_IDLE or SCHED_BATCH. User SHOULD be aware of the performance penalty before using it.

>> +

>> +  5. It MUST not be used by multi-producer/consumer pthreads, whose scheduling policies are SCHED_FIFO or SCHED_RR.

>>   

>>   + rte_timer

>>   

>> diff --git a/lib/librte_ring/rte_ring.h b/lib/librte_ring/rte_ring.h

>> index 1245822..e680101 100644

>> --- a/lib/librte_ring/rte_ring.h

>> +++ b/lib/librte_ring/rte_ring.h

>> @@ -26,8 +26,9 @@

>>    * - Bulk dequeue.

>>    * - Bulk enqueue.

>>    *

>> - * Note: the ring implementation is not preemptable. A lcore must not

>> - * be interrupted by another task that uses the same ring.

>> + * Note: the ring implementation is not preemptible. Refer to Programmer's

>> + * guide/Environment Abstraction Layer/Multiple pthread/Known Issues/rte_ring

>> + * for more information.

> 

> 

> The other parts looks good to me, thank you.

> 

> 



-- 
Thanks,
Anatoly

Patch

diff --git a/doc/guides/prog_guide/env_abstraction_layer.rst b/doc/guides/prog_guide/env_abstraction_layer.rst
index a22640d..f47a4be 100644
--- a/doc/guides/prog_guide/env_abstraction_layer.rst
+++ b/doc/guides/prog_guide/env_abstraction_layer.rst
@@ -435,23 +435,26 @@  Known Issues
 
     The "non-preemptive" constraint means:
 
-    - a pthread doing multi-producers enqueues on a given ring must not
-      be preempted by another pthread doing a multi-producer enqueue on
-      the same ring.
-    - a pthread doing multi-consumers dequeues on a given ring must not
-      be preempted by another pthread doing a multi-consumer dequeue on
-      the same ring.
+      A preempted pthread can block other pthreads (operating on the same ring)
+      from completing their operations, only if those pthreads are performing
+      the same ring operation (enqueue/dequeue) as the preempted pthread.
+      In other words, a preempted consumer pthread will not block any producer
+      pthreads and vice versa.
 
-    Bypassing this constraint may cause the 2nd pthread to spin until the 1st one is scheduled again.
-    Moreover, if the 1st pthread is preempted by a context that has an higher priority, it may even cause a dead lock.
+    Bypassing this constraint may cause other pthreads to spin until the preempted pthread is scheduled again.
+    Moreover, if the pthread is preempted by a context that has a higher priority, it may even cause a dead lock.
 
-  This does not mean it cannot be used, simply, there is a need to narrow down the situation when it is used by multi-pthread on the same core.
+  This means, use cases involving preemptible pthreads should consider using rte_ring carefully.
 
-  1. It CAN be used for any single-producer or single-consumer situation.
+  1. It CAN be used for preemptible single-producer and single-consumer use case.
 
-  2. It MAY be used by multi-producer/consumer pthread whose scheduling policy are all SCHED_OTHER(cfs). User SHOULD be aware of the performance penalty before using it.
+  2. It CAN be used for non-preemptible multi-producer and preemptible single-consumer use case.
 
-  3. It MUST not be used by multi-producer/consumer pthreads, whose scheduling policies are SCHED_FIFO or SCHED_RR.
+  3. It CAN be used for preemptible single-producer and non-preemptible multi-consumer use case.
+
+  4. It MAY be used by preemptible multi-producer and/or preemptible multi-consumer pthreads whose scheduling policy are all SCHED_OTHER(cfs), SCHED_IDLE or SCHED_BATCH. User SHOULD be aware of the performance penalty before using it.
+
+  5. It MUST not be used by multi-producer/consumer pthreads, whose scheduling policies are SCHED_FIFO or SCHED_RR.
 
 + rte_timer
 
diff --git a/lib/librte_ring/rte_ring.h b/lib/librte_ring/rte_ring.h
index 1245822..e680101 100644
--- a/lib/librte_ring/rte_ring.h
+++ b/lib/librte_ring/rte_ring.h
@@ -26,8 +26,9 @@ 
  * - Bulk dequeue.
  * - Bulk enqueue.
  *
- * Note: the ring implementation is not preemptable. A lcore must not
- * be interrupted by another task that uses the same ring.
+ * Note: the ring implementation is not preemptible. Refer to Programmer's
+ * guide/Environment Abstraction Layer/Multiple pthread/Known Issues/rte_ring
+ * for more information.
  *
  */