Petri Savolainen(psavol) 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:
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_r138853139
updated_at 2017-09-14 10:20:28

Reply via email to