Petri Savolainen(psavol) replied on github web page:

include/odp/api/spec/pool.h
@@ -214,6 +221,17 @@ typedef struct odp_pool_param_t {
                            defined by pool capability pkt.max_uarea_size.
                            Specify as 0 if no user area is needed. */
                        uint32_t uarea_size;
+
+                       /** Minimum Headroom size in bytes. Minimum number of
+                           bytes of space preceding packet data to reserve for
+                           use as headroom. Each newly allocated packet from
+                           the pool must have at least this much headroom.
+                           Must not exceed the implementation defined
+                           'max_headroom' in odp_pool_capability().
+                           @note If application does not require headroom it
+                           can configure 'min_headroom' as zero and
+                           implementation may or may not allocate headroom. */
+                       uint32_t min_headroom;


Comment:
Sorry, forgot to mention the rationale for "headroom" vs "min_headroom". Plain 
"headroom" is inline with the other parameter names in the struct 
(num/len/max_len/seg_len/uarea_size). Those describe in documentation text how 
implementation may round up things, but the variable names are not min_len, 
min_seg_len, min_uarea_size, etc 

For example, seg_len spec is very close to headroom spec. Application requires 
at least 'seg_len' bytes but implementation is free to round up:
"Minimum number of packet data bytes that are stored
in the first segment of a packet. The maximum value
is defined by pool capability pkt.max_seg_len.
Use 0 for default. "
uint32_t seg_len;

So, please rename to "headroom". 


> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
> Given Petri's other comments, I agree here. Sounds like we just want to make 
> these additional params available in the spec but ignore them in odp-linux. 
> We can revisit this in the cloud-dev branch.


>> Balasubramanian Manoharan(bala-manoharan) wrote:
>> I prefer naming it as min_headroom is coz the value given by application is 
>> not directly configured and implementation may roundup the value and hence 
>> the name "min_headroom"


>>> Petri Savolainen(psavol) wrote:
>>> Actually, min_headroom is still CONFIG_PACKET_HEADROOM since we always 
>>> round up to that.


>>>> Petri Savolainen(psavol) wrote:
>>>> Bala's implementation is correct. Currently, it's much more simpler to 
>>>> always use the default headroom. I'd rather optimize odp-linux for 
>>>> simplicity and performance than for saving memory. When memory usage is a 
>>>> worry, user can rebuild with smaller CONFIG_PACKET_HEADROOM. Also due to 
>>>> data align / cacheline round ups there will be always some headroom - so 
>>>> the potential memory saving in question would be 1 or 2 cachelines per 
>>>> packet, which is not much.


>>>>> Petri Savolainen(psavol) wrote:
>>>>> The parameter name can be just "headroom".
>>>>> 
>>>>> Text can be compressed a bit and made inline with documentation of the 
>>>>> other params:
>>>>> 
>>>>> "Minimum headroom size in bytes. Each newly allocated 
>>>>> packet from the pool will have at least this much headroom. 
>>>>> The maximum value is defined by pool capability pkt.max_headroom.
>>>>> Use zero if headroom is not needed."


>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>> To change this to:
>>>>>> 
>>>>>> ```
>>>>>> headroom = params->pkt.min_headroom;
>>>>>> ```
>>>>>> 
>>>>>> To reflect the API change being proposed in this PR all that's needed is 
>>>>>> a one line update to the `packet_init()` routine in 
>>>>>> `odp_packet_internal.h`:
>>>>>> 
>>>>>> Change 
>>>>>> 
>>>>>> ```
>>>>>>  pkt_hdr->headroom  = CONFIG_PACKET_HEADROOM;
>>>>>> ```
>>>>>> to 
>>>>>> 
>>>>>> ```
>>>>>>  pkt_hdr->headroom  = pkt_hdr->buf_hdr.pool_ptr->headroom;
>>>>>> ```
>>>>>> 
>>>>>> However since `pool_ptr` is currently defined as `void *` a few more 
>>>>>> simple infrastructure changes are needed to undo this "shortcut".
>>>>>> 
>>>>>> 1. `pool_ptr` should be of type `pool_t *`, not `void *` in 
>>>>>> `odp_buffer_internal.h`
>>>>>> 
>>>>>> 2. `odp_buffer_internal.h` needs to `#include <odp_pool_internal.h>` to 
>>>>>> get the definition of `pool_t`
>>>>>> 
>>>>>> 3.  Since there is now a circular dependency between 
>>>>>> `odp_buffer_internal.h` and `odp_pool_internal.h` the 
>>>>>> `odp_forward_typedefs_internal.h` file has to have the added line: 
>>>>>> `typedef struct pool_t pool_t;` added to it.
>>>>>> 
>>>>>> With these changes pools will properly use the headroom requested in by 
>>>>>> the new `min_headroom` field, as intended.
>>>>>> 
>>>>>> However, as @psavol is in the process or reworking the packet internals 
>>>>>> again I'll leave it to him as to whether he'd rather see this change 
>>>>>> before or after he makes his other changes. An alternate approach would 
>>>>>> be for pools to define an internal inline API that returns the 
>>>>>> configured headroom for this pool so `packet_init()` doesn't have to 
>>>>>> rummage for it.
>>>>>> 
>>>>>> My point remains is that if we're creating a reference implementation 
>>>>>> that reference implementation should reflect how we intend the APIs to 
>>>>>> be used. If we're now going to allow applications to specify headroom 
>>>>>> size on `odp_pool_create()` then odp-linux should honor those requests.


>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>> Typo: If (should be capitalized) and require, not required.


>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>> I see no reason not to change it now, since linux-generic can support 
>>>>>>>> zero headroom if that's what the application requests.  Besides, this 
>>>>>>>> is supposed to be a reference implementation which shows how we intend 
>>>>>>>> APIs to behave. We intend lower headroom requests to be honored, so we 
>>>>>>>> should do so here.


>>>>>>>>> Balasubramanian Manoharan(bala-manoharan) wrote:
>>>>>>>>> This PR helps implementation which have the ability to maintain zero 
>>>>>>>>> headroom size and our linux-generic implementation does not violate 
>>>>>>>>> the API spec. We can change linux-generic in future also.


>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>> True, but I don't see why we wouldn't want to honor the 
>>>>>>>>>> application's requested headroom size. Setting this unconditionally 
>>>>>>>>>> this way is just ignoring the request and if we're going to do that 
>>>>>>>>>> there's no reason to have this PR at all.


>>>>>>>>>>> Balasubramanian Manoharan(bala-manoharan) wrote:
>>>>>>>>>>> setting headroom = CONFIG_PACKET_HEADROOM does not violate the API 
>>>>>>>>>>> requirement and it also fits well with our linux-generic 
>>>>>>>>>>> implementation. 


>>>>>>>>>>>> Balasubramanian Manoharan(bala-manoharan) wrote:
>>>>>>>>>>>> Okay


>>>>>>>>>>>>> Balasubramanian Manoharan(bala-manoharan) wrote:
>>>>>>>>>>>>> Since we are now exposing max_headroom we need to fail the pool 
>>>>>>>>>>>>> creating if the headroom size requested could not be supported.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> pkt.min_headroom is odp_pool_param_init() is set to 
>>>>>>>>>>>>> CONFIG_PACKET_HEADROOM already. Its is the second part of this 
>>>>>>>>>>>>> patch.


>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>> I'd still like to see a usage note somewhere indicating that 
>>>>>>>>>>>>>> setting `min_headroom` to 0 means that the application does not 
>>>>>>>>>>>>>> require any packet headroom so the implementation may optimize 
>>>>>>>>>>>>>> pool storage usage accordingly.


>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>> It's not clear why we're making this change if we don't intend 
>>>>>>>>>>>>>>> to do anything with it. Shouldn't this be:
>>>>>>>>>>>>>>> `headroom = params->pkt.min_headroom;` ? 
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> To make this convention work correctly, `odp_pool_param_init()` 
>>>>>>>>>>>>>>> needs to be updated to set `pkt.min_headroom` to 
>>>>>>>>>>>>>>> `CONFIG_PACKET_HEADROOM` so that existing applications behave 
>>>>>>>>>>>>>>> unchanged, which you've already done. So this looks like an 
>>>>>>>>>>>>>>> omission?


>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>> Typo: at least


>>>>>>>>>>>>>>>>> Balasubramanian Manoharan(bala-manoharan) wrote:
>>>>>>>>>>>>>>>>> @psavol CONFIG_PACKET_HEADROOM is set as default in 
>>>>>>>>>>>>>>>>> odp_pool_params_init() function. So it should not break any 
>>>>>>>>>>>>>>>>> existing implementation.
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> Also do you mean to set CONFIG_PACKET_HEADROOM as the maximum 
>>>>>>>>>>>>>>>>> headroom in capability.


>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>>>> @psavol I'm not sure what you're saying here. This PR has 
>>>>>>>>>>>>>>>>>> two commits: One for the API changes and one to change the 
>>>>>>>>>>>>>>>>>> odp-linux pool implementation to reflect these new API 
>>>>>>>>>>>>>>>>>> changes. Are you suggesting that we ignore the API changes?


>>>>>>>>>>>>>>>>>>> Balasubramanian Manoharan(bala-manoharan) wrote:
>>>>>>>>>>>>>>>>>>> Okay


>>>>>>>>>>>>>>>>>>>> Balasubramanian Manoharan(bala-manoharan) wrote:
>>>>>>>>>>>>>>>>>>>> Okay.


>>>>>>>>>>>>>>>>>>>>> Petri Savolainen(psavol) wrote:
>>>>>>>>>>>>>>>>>>>>> It's better not to change headroom implementation in this 
>>>>>>>>>>>>>>>>>>>>> set but just implement the capability == return the 
>>>>>>>>>>>>>>>>>>>>> current headroom as the max. Other parts of the code 
>>>>>>>>>>>>>>>>>>>>> assume that init time headroom is constant:
>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>> return CONFIG_PACKET_HEADROOM + (head - base);


>>>>>>>>>>>>>>>>>>>>>> Petri Savolainen(psavol) wrote:
>>>>>>>>>>>>>>>>>>>>>> This is not hint, but minimum. Implementation may round 
>>>>>>>>>>>>>>>>>>>>>> up, but must not round down. When implementation has 
>>>>>>>>>>>>>>>>>>>>>> fixed headroom, it should set max capability to that.
>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>> Simply:
>>>>>>>>>>>>>>>>>>>>>> "Minimum headroom size in bytes. Every newly allocated 
>>>>>>>>>>>>>>>>>>>>>> packet must have at least this much headroom. Must not 
>>>>>>>>>>>>>>>>>>>>>> exceed max_headroom packet pool capability."


>>>>>>>>>>>>>>>>>>>>>>> Petri Savolainen(psavol) wrote:
>>>>>>>>>>>>>>>>>>>>>>> This should refer to the new headroom pool parameter: 
>>>>>>>>>>>>>>>>>>>>>>> "This is the maximum value for packet pool headroom 
>>>>>>>>>>>>>>>>>>>>>>> param ..." So, it's the maximum application may ask, 
>>>>>>>>>>>>>>>>>>>>>>> implementation may still round up from there. 


>>>>>>>>>>>>>>>>>>>>>>>> Petri Savolainen(psavol) wrote:
>>>>>>>>>>>>>>>>>>>>>>>> We should not change this field since that's not 
>>>>>>>>>>>>>>>>>>>>>>>> required for the new feature to be functional.


>>>>>>>>>>>>>>>>>>>>>>>>> Balasubramanian Manoharan(bala-manoharan) wrote:
>>>>>>>>>>>>>>>>>>>>>>>>> In that case the naming "default_headroom" makes more 
>>>>>>>>>>>>>>>>>>>>>>>>> sense than "min_headroom". Maybe we can leave it as 
>>>>>>>>>>>>>>>>>>>>>>>>> "min_headroom" in this release.


>>>>>>>>>>>>>>>>>>>>>>>>>> Balasubramanian Manoharan(bala-manoharan) wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>> Okay


>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>> Just to elaborate, it's always valid for an 
>>>>>>>>>>>>>>>>>>>>>>>>>>> application to request 0 headroom, so there's no 
>>>>>>>>>>>>>>>>>>>>>>>>>>> minimum in that sense. Whether that results in 
>>>>>>>>>>>>>>>>>>>>>>>>>>> packets having 0 headroom is up to the 
>>>>>>>>>>>>>>>>>>>>>>>>>>> implementation since implementations are free to 
>>>>>>>>>>>>>>>>>>>>>>>>>>> round up application requests to something larger. 
>>>>>>>>>>>>>>>>>>>>>>>>>>> So I agree with Petri that this particular wording 
>>>>>>>>>>>>>>>>>>>>>>>>>>> change probably isn't needed. It simply says that 
>>>>>>>>>>>>>>>>>>>>>>>>>>> in the absence of any specific requests from the 
>>>>>>>>>>>>>>>>>>>>>>>>>>> application, this is the minimum amount of headroom 
>>>>>>>>>>>>>>>>>>>>>>>>>>> that applications can expect to find in every newly 
>>>>>>>>>>>>>>>>>>>>>>>>>>> received or allocated packet.


>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>> Ok, but odp-linux really has no built-in maximum 
>>>>>>>>>>>>>>>>>>>>>>>>>>>> for this so we shouldn't impose one artificially. 
>>>>>>>>>>>>>>>>>>>>>>>>>>>> The effective max_headroom would be something like 
>>>>>>>>>>>>>>>>>>>>>>>>>>>> `CONFIG_PACKET_MAX_SEG_LEN - 1`.


>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Balasubramanian Manoharan(bala-manoharan) wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> We had a requirement from a customer for 256B 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> headroom and I am not aware of any request bigger 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> than this hence this magic number.


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Balasubramanian Manoharan(bala-manoharan) wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> The maximum headroom supported will be equal to 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the maximum segment size supported by the 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> platform and we can discuss in the ARCH call and 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> if required we can indicate either zero or 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> UINT32_MAX as value when the implementation does 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> not have any limitation.


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Trying to specify a headroom > 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> `CONFIG_PACKET_MAX_HEADROOM` should fail the 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> call, as noted earlier.


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Any particular reason for this "magic number"?


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> If we have defined min and max values, then 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> values outside this range should result in 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the `odp_pool_create()` call failing, not 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> being silently ignored. Such is the case for 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> other limits so headroom should be no 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> different.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> However, as noted previously, I don't think a 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> `min_headroom` is particularly 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> meaningful/useful so this should be reworded. 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> We should definitely include the use case 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> that a `min_headroom` of 0 indicates that the 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> application does not require headroom so the 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> implementation may omit this to conserve 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> storage.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> It may also be appropriate to revisit the 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> question of headroom and packet alignment. 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> The current linux-generic pool allocation 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> structure ensures that the IP header will be 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> misaligned due to the presence of a 14-byte 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Ethernet header, meaning 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> `odp_packet_l3_ptr()` will return an address 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> that is 2-byte rather than 4-byte aligned 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> because we're now aligning `data[offset]` 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> rather than `data[0]`.  I realize this is not 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> directly related to this PR, but since we're 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> making changes in this area something we 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> should make clear.


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Do we have to worry about implementations 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> that have no fixed `max_headroom` or must 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> these implementations make up a number or 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> use something like `UINT32_MAX` here? The 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> effective maximum headroom is going to be 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the `odp_pool_capability()` 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> `pkt.max_seg_len` field, which uses the 0 = 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> limited only by available memory convention. 


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Given how we intend to use this. 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> `default_headroom` would seem to be a 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> better name here than `min_headroom`. The 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> actual minimum headroom is always going to 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> be zero. Every implementation must support 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> zero headroom since 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> `odp_packet_push_head(pkt, 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> odp_packet_headroom(pkt))` always results 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> in `odp_packet_headroom(pkt)` returning 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> zero anyway.


https://github.com/Linaro/odp/pull/152#discussion_r139083233
updated_at 2017-09-15 07:44:19

Reply via email to