Petri Savolainen(psavol) replied on github web page:

include/odp/api/spec/pool.h
line 28
@@ -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:
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_r138850667
updated_at 2017-09-14 10:08:20

Reply via email to