Bill Fischofer(Bill-Fischofer-Linaro) replied on github web page:

platform/linux-generic/odp_pool.c
line 16
@@ -853,7 +857,8 @@ int odp_pool_capability(odp_pool_capability_t *capa)
        capa->pkt.max_pools        = ODP_CONFIG_POOLS;
        capa->pkt.max_len          = CONFIG_PACKET_MAX_SEGS * max_seg_len;
        capa->pkt.max_num          = CONFIG_POOL_MAX_NUM;
-       capa->pkt.min_headroom     = CONFIG_PACKET_HEADROOM;
+       capa->pkt.min_headroom     = 0;


Comment:
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_r138877158
updated_at 2017-09-14 12:23:43

Reply via email to