Petri Savolainen(psavol) replied on github web page:
include/odp/api/spec/classification.h
@@ -107,6 +108,55 @@ typedef union odp_cls_pmr_terms_t {
uint64_t all_bits;
} odp_cls_pmr_terms_t;
+/** Random Early Detection (RED)
+ * Random Early Detection is enabled to initiate a drop probability
+ * for the incoming packet when the packets in the queue/pool reaches
+ * a specified threshold.
+ * When RED is enabled for a particular flow then further incoming
+ * packets are assigned a drop probability based on the size of the
+ * pool/queue and the drop probability becomes 100% when the queue/pool
+ * is full.
+ * RED is logically configured in the CoS and could be implemented
+ * in either pool or queue linked to the CoS depending on
+ * platform capabilities. Application should make sure not to link
+ * multiple CoS with different RED or BP configuration to the same queue
+ * or pool.
+ * RED is enabled when the resource limit is equal to or greater than
+ * the maximum threshold value and is disabled when resource limit
+ * is less than or equal to minimum threshold value. */
+typedef struct odp_red_param_t {
+ /** A boolean to enable RED
+ * When true, RED is enabled and configured with RED parameters.
+ * Otherwise, RED parameters are ignored. */
+ odp_bool_t red_enable;
+
+ /** Threshold parameters for RED
+ * RED is enabled when the resource limit is equal to or greater than
+ * the maximum threshold value and is disabled when resource limit
+ * is less than or equal to minimum threshold value. */
+ odp_threshold_t red_threshold;
Comment:
"... RED is enabled when the resource limit is equal to ..."
This refers still to "resource limit", it should be "resource usage" which is a
term that has been define above.
> Petri Savolainen(psavol) wrote:
> red_ prefix can be dropped from the struct field names. When red param is
> used, the name of the variable is likely red or red_param, etc. So, after
> removing the prefix it looks like this
>
> red.enable = 1;
> red.threshold.packets.min = 1000;
>
> vs
>
> red.red_enable = 1;
> red.red_threshold....
> ...
>> Petri Savolainen(psavol) wrote:
>> "Reaches between" is not valid since drop probability is defined also when
>> <min and >max. "... when the packets in the queue/pool reaches between the
>> specified threshold." -> "... when the packets in the queue/pool cross
>> specified threshold values."
>>
>> The "resource limit" needs to be specified: is it free or used space? Or is
>> it different for pools and queues: free space in a pool, used space in a
>> queue? May be the text is easier to understand with a bullet list:
>> * drop probability is 100%, when resource usage > threshold.max
>> * drop probability is 0%, when resource usage < threshold.min
>> * drop probability is between 0 ... 100%, when resource usage is between
>> threshold.min and threshold.max
>>
>> ... and then define what "resource usage" means. Pools: space used, queues
>> packet/bytes in queue
>>> Petri Savolainen(psavol) wrote:
>>> This should match the type enum: byte. Also better description is needed:
>>> e.g. "Sum of all data bytes of all packets". Packet size does not tell if
>>> it's the size of one or many packets.
>>>> Petri Savolainen(psavol) wrote:
>>>> This should match the type enum: packet
>>>>> Petri Savolainen(psavol) wrote:
>>>>> When percent is not abbreviated, then this should not be either. So,
>>>>> _PERCENT and _PACKET, or PCT and PKT.
>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>> As we discussed during today's ARCH call. `max` and `min` can be renamed
>>>>>> `start` and `stop` to more accurately reflect the actions. RED /
>>>>>> backpressure begins when utilization hits the `start` threshold and is
>>>>>> deasserted when utilization drops back to the `stop` threshold. So
>>>>>> `start` >= `stop`. If the two are equal it means there is no hysteresis.
>>>>>>
>>>>>> The question arises whether a third `max` threshold value should exist
>>>>>> at which drops / backpressure is held at 100%. The idea here is to
>>>>>> reserve a portion of the pool/queue resource for application use
>>>>>> independent of use by PktIOs. Since this may not be feasible in all
>>>>>> implementations this should probably be advertised with additional
>>>>>> capability info.
>>>>>>> Balasubramanian Manoharan(bala-manoharan) wrote:
>>>>>>> I can move the typedef here.
>>>>>>> Not sure if I understand the need to move to uint32_t, I have only
>>>>>>> defined 100% as 10,000 and we should be fine with uin16_t. Any other
>>>>>>> specific reason for using uint32_t?
>>>>>>>> Balasubramanian Manoharan(bala-manoharan) wrote:
>>>>>>>> The drop probability is 100% only when the pool is completely full i.e
>>>>>>>> there is no further buffer to allocate packet. The intention of this
>>>>>>>> description is that when resource usage is greater than threshold.max
>>>>>>>> then the drop probability is enabled and packets will get dropped on
>>>>>>>> an increasing drop probability and when it is less than min threshold
>>>>>>>> then drop probability is disabled.
>>>>>>>>> Petri Savolainen(psavol) wrote:
>>>>>>>>> I think it should be:
>>>>>>>>> * drop probability == 100%, when resource usage > threshold.max
>>>>>>>>> * drop probability == 0%, when resource usage < threshold.min
>>>>>>>>> * drop probability between 0 ... 100%, when resource usage
>>>>>>>>> between min and max
>>>>>>>>>
>>>>>>>>> Now the text describe min/max as hysteresis: > max enables, < min
>>>>>>>>> disables. Which is not the intention, I guess.
>>>>>>>>>> Petri Savolainen(psavol) wrote:
>>>>>>>>>> Another option for enums: ODP_THRESHOLD_PCT, ODP_THRESHOLD_PKT,
>>>>>>>>>> ODP_THRESHOLD_BYTE
>>>>>>>>>>> Petri Savolainen(psavol) wrote:
>>>>>>>>>>> the enum: odp_threshold_type_t
>>>>>>>>>>> the bitfield: odp_threshold_types_t
>>>>>>>>>>>
>>>>>>>>>>> The enum values need to be UPPERCASE and contain a common prefix:
>>>>>>>>>>> ODP_THLD_PERCENT, ODP_THLD_PACKET, ODP_THLD_BYTE
>>>>>>>>>>>
>>>>>>>>>>> If bitfield is only needed in one place (one capability struct) it
>>>>>>>>>>> could be defined there only (no typedef needed).
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>> Petri Savolainen(psavol) wrote:
>>>>>>>>>>>> Since API specifies already what odp_percent_t is, it's better do
>>>>>>>>>>>> also the typedef here. Also the documentation should say that it's
>>>>>>>>>>>> _unsigned_ integer. May be uint32_t is safer choice than uint16_t,
>>>>>>>>>>>> so that percent calculations do not easily wrap around.
>>>>>>>>>>>>> Balasubramanian Manoharan(bala-manoharan) wrote:
>>>>>>>>>>>>> Done.
>>>>>>>>>>>>>> Balasubramanian Manoharan(bala-manoharan) wrote:
>>>>>>>>>>>>>> Currently, I have followed the syntax existing in api-next. If
>>>>>>>>>>>>>> ABI changes are merged first I will change my patch to match the
>>>>>>>>>>>>>> specifications. If my patch gets merged first, change this as
>>>>>>>>>>>>>> part of your ABI spec.
>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>> We shouldn't leave fields undefined in the returned
>>>>>>>>>>>>>>> `odp_cls_capability_t` struct. Either set `threshold_red` and
>>>>>>>>>>>>>>> `threshold_bp` explicitly or just clear the struct to zeros at
>>>>>>>>>>>>>>> the start of this routine.
>>>>>>>>>>>>>>>> Dmitry Eremin-Solenikov(lumag) wrote:
>>>>>>>>>>>>>>>> No, `odp_bool_t` exact implementation is not part of the spec,
>>>>>>>>>>>>>>>> as it is part of platform ABI. Percent type is just data, so
>>>>>>>>>>>>>>>> from my point of view it should not be a part of ABI, but
>>>>>>>>>>>>>>>> rather be a part of API spec.
>>>>>>>>>>>>>>>>> Balasubramanian Manoharan(bala-manoharan) wrote:
>>>>>>>>>>>>>>>>> They typedef for odp_bool_t is still under
>>>>>>>>>>>>>>>>> platform/linux-generic directory hence I had this here. I am
>>>>>>>>>>>>>>>>> fine pushing this to spec/std_types.h but is odp_bool_t going
>>>>>>>>>>>>>>>>> to be moved later?
>>>>>>>>>>>>>>>>>> Dmitry Eremin-Solenikov(lumag) wrote:
>>>>>>>>>>>>>>>>>> @bala-manoharan @Bill-Fischofer-Linaro In my opinion, let's
>>>>>>>>>>>>>>>>>> just push it into `odp/api/spec/std_types.h`.
>>>>>>>>>>>>>>>>>>> Balasubramanian Manoharan(bala-manoharan) wrote:
>>>>>>>>>>>>>>>>>>> Oops. Will take care of that in next version.
>>>>>>>>>>>>>>>>>>>> Balasubramanian Manoharan(bala-manoharan) wrote:
>>>>>>>>>>>>>>>>>>>> I felt using a bitfield is more useful in exposing the
>>>>>>>>>>>>>>>>>>>> platform capability whereas using an enum makes more sense
>>>>>>>>>>>>>>>>>>>> during configuration. I am open for suggestions along
>>>>>>>>>>>>>>>>>>>> these lines.
>>>>>>>>>>>>>>>>>>>>> Balasubramanian Manoharan(bala-manoharan) wrote:
>>>>>>>>>>>>>>>>>>>>> Back pressure is to indicate the remote peer that there
>>>>>>>>>>>>>>>>>>>>> is a network congestion on this particular flow. Whether
>>>>>>>>>>>>>>>>>>>>> the remote peer takes respective action is beyond the
>>>>>>>>>>>>>>>>>>>>> scope of this RFC.
>>>>>>>>>>>>>>>>>>>>>> Balasubramanian Manoharan(bala-manoharan) wrote:
>>>>>>>>>>>>>>>>>>>>>> NXP is implementing RED at queue level. Hence I had
>>>>>>>>>>>>>>>>>>>>>> added this based on the feedback from Nikhil.
>>>>>>>>>>>>>>>>>>>>>>> Balasubramanian Manoharan(bala-manoharan) wrote:
>>>>>>>>>>>>>>>>>>>>>>> The previous PR was handling this RED and BP at cos
>>>>>>>>>>>>>>>>>>>>>>> level. There were some concerns from NXP since CoS is a
>>>>>>>>>>>>>>>>>>>>>>> logical entity and application configuration should
>>>>>>>>>>>>>>>>>>>>>>> make sure that multiple CoS with different RED
>>>>>>>>>>>>>>>>>>>>>>> configuration should not direct to the same pool or
>>>>>>>>>>>>>>>>>>>>>>> queue.
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> HW implements the RED and BP effectively either at the
>>>>>>>>>>>>>>>>>>>>>>> pool or the queue.
>>>>>>>>>>>>>>>>>>>>>>> Since a pool represents the real bottleneck for
>>>>>>>>>>>>>>>>>>>>>>> resource exhausion and packet drop.
>>>>>>>>>>>>>>>>>>>>>>> We can discuss further in todays Public call.
>>>>>>>>>>>>>>>>>>>>>>>> Balasubramanian Manoharan(bala-manoharan) wrote:
>>>>>>>>>>>>>>>>>>>>>>>> The implementation provides preference whether the RED
>>>>>>>>>>>>>>>>>>>>>>>> and BP are configured either in pool or queue and
>>>>>>>>>>>>>>>>>>>>>>>> provide support for which threshold method is
>>>>>>>>>>>>>>>>>>>>>>>> supported using capability.
>>>>>>>>>>>>>>>>>>>>>>>> I believe this is sufficient from the implementation
>>>>>>>>>>>>>>>>>>>>>>>> point of view.
>>>>>>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>>>>>>>>>>> Adding new files requires updates to the various
>>>>>>>>>>>>>>>>>>>>>>>>> Makefile.am and related autotools. That's why Travis
>>>>>>>>>>>>>>>>>>>>>>>>> is reporting failures since these new files aren't
>>>>>>>>>>>>>>>>>>>>>>>>> able to be found / used.
>>>>>>>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>> Need to clarify under what conditions RED (and BP)
>>>>>>>>>>>>>>>>>>>>>>>>>> apply to pools. If an application calls
>>>>>>>>>>>>>>>>>>>>>>>>>> `odp_packet_alloc()` that should either succeed or
>>>>>>>>>>>>>>>>>>>>>>>>>> fail. "Drop probability" doesn't make any obvious
>>>>>>>>>>>>>>>>>>>>>>>>>> sense here. Tying these concepts to `odp_pktio_t`
>>>>>>>>>>>>>>>>>>>>>>>>>> configurations seems more in keeping with what's
>>>>>>>>>>>>>>>>>>>>>>>>>> needed, but I understand the difficulties that that
>>>>>>>>>>>>>>>>>>>>>>>>>> caused in the previous PR.
>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>> Perhaps tying this to a `odp_cos_t` might work? An
>>>>>>>>>>>>>>>>>>>>>>>>>> `odp_cos_t` has an associated queue and pool and
>>>>>>>>>>>>>>>>>>>>>>>>>> these can then be viewed as admission controls to
>>>>>>>>>>>>>>>>>>>>>>>>>> packets being added to a CoS. That would mean that
>>>>>>>>>>>>>>>>>>>>>>>>>> these features would only be applicable if the
>>>>>>>>>>>>>>>>>>>>>>>>>> classifier is being used, but is that a significant
>>>>>>>>>>>>>>>>>>>>>>>>>> drawback since we want to encourage its use anyway?
>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>> Back pressure in this context presumably means that
>>>>>>>>>>>>>>>>>>>>>>>>>>> `odp_queue_enq()` calls stall until the back
>>>>>>>>>>>>>>>>>>>>>>>>>>> pressure is relieved. Not sure if that's what's
>>>>>>>>>>>>>>>>>>>>>>>>>>> really desired for queues in general.
>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>> RED for a queue in doesn't seem to make sense for
>>>>>>>>>>>>>>>>>>>>>>>>>>>> queues in general. RED is used for admission
>>>>>>>>>>>>>>>>>>>>>>>>>>>> control, which is why it's tied to PktIOs. If an
>>>>>>>>>>>>>>>>>>>>>>>>>>>> application calls `odp_queue_enq()` that should
>>>>>>>>>>>>>>>>>>>>>>>>>>>> either succeed or fail. A "drop probability"
>>>>>>>>>>>>>>>>>>>>>>>>>>>> doesn't make sense here. We need to clarify that
>>>>>>>>>>>>>>>>>>>>>>>>>>>> somehow and I'm not sure how that can be done
>>>>>>>>>>>>>>>>>>>>>>>>>>>> without tying the configuration back to an
>>>>>>>>>>>>>>>>>>>>>>>>>>>> `odp_pktio_t`.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Same comment as for pools. It would seem these
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> should be individual `odp_support_t` indications.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Wouldn't these be better done as individual
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> `odp_support_t` configurations? That way
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> implementations can indicate not just support
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> but preferences.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> We've defined what we mean by RED as assigning
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> a drop probability but what we mean by "back
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> pressure" seems very fuzzy here. This needs to
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> be more specific if an application is to know
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> how to make use of this.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> We use `_t` suffixes rather than `_e` for
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> `enums` so `odp_threshold_type_t` would be
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> more standard here, but we already have an
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> `odp_threshold_type_t` defined above. The
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> problem seems to be `_t` already implies type,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> so "type type" is redundant.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Perhaps a better choice is an
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> `odp_threshold_t` has an
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> `odp_threshold_metric_t metric` field that is
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the enum above. It's not clear how the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> `odp_threshold_type_t` bits are intended to be
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> used. Capabilities?
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Need Doxygen for each struct and union
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Doxygen 1.8.13 requires every element to be
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> documented.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Again this new type should follow the PR
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> #250 model.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Since we've given conceptual approval to
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> PR #250, these changes should be based on
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> that and this definition would be part of
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> abi-default/std_types.h.
https://github.com/Linaro/odp/pull/277#discussion_r151949438
updated_at 2017-11-20 13:07:56