Petri Savolainen(psavol) replied on github web page:

platform/linux-generic/odp_pool.c
line 8
@@ -348,6 +348,10 @@ static odp_pool_t pool_create(const char *name, 
odp_pool_param_t *params,
                break;
 
        case ODP_POOL_PACKET:
+               if (params->pkt.min_headroom > CONFIG_PACKET_HEADROOM) {
+                       ODP_ERR("Packet headroom size not supported.");
+                       return ODP_POOL_INVALID;
+               }
                headroom    = CONFIG_PACKET_HEADROOM;


Comment:
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_r138852946
updated_at 2017-09-14 10:19:29

Reply via email to