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

include/odp/api/spec/pool.h
line 13
@@ -290,10 +290,16 @@ odp_pool_t odp_pool_lookup(const char *name);
 /**
  * Pool information struct
  * Used to get information about a pool.
+ * @note The difference between end_addr & start_addr
+ * will result in buffers address range belong to this pool.
  */
 typedef struct odp_pool_info_t {
        const char *name;          /**< pool name */
        odp_pool_param_t params;   /**< pool parameters */
+       /** Minimum address of any packet contained in this pool */
+       uintptr_t start_addr;
+       /** Maximum address of any packet contained in this pool */
+       uintptr_t end_addr;


Comment:
The only other ambiguity is whether the address that applications see for a 
packet is constant. VPP clearly assumes this but this is not implied by the ODP 
spec. The "lifetime" of packet visibility is from the time a call like 
`odp_packet_data()` is made until the thread releases the `odp_packet_t` that 
was used to obtain this address. If some other thread receives that handle and 
calls `odp_packet_data()` there's no requirement or guarantee that it will get 
the same address as the previous owner. 

> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
> I'd change these to "visible address" rather than "address". The point is 
> that the spec says nothing about how packets are represented within an 
> implementation. It only states what applications may see by using other ODP 
> APIs that manipulate odp_packet_t object.


>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>> I'd delete this note as it's not necessary and not complete for the ODP API 
>> spec. 


>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>> As we discussed earlier today. We should only need an extension to 
>>> `odp_pool_info()` to return the `min_addr` and `max_addr` of any packet 
>>> contained in the pool. This can simply be added to the end of the 
>>> `odp_pool_info_t` struct. The application (in this case VPP) can then 
>>> verify that the range is usable by it (_i.e.,_ is containable in 32 bits) 
>>> and can store the info it needs to do its indexing from this info. 


>>>> Petri Savolainen(psavol) wrote:
>>>> How sparse a "linear pool" may be? All implementations can claim linear 
>>>> pool support by returning info.first_addr = 0, info.last_addr = 
>>>> (uintptr_t) -1, where address size may be 64bits.
>>>> 
>>>> Addresses could be used for debugging, but not much more than that. What 
>>>> VPP is going to do with this information ?
>>>>  
>>>> 
>>>> 


>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>> @muvarov To your points:
>>>>> 
>>>>> 1. No, VPP only deals with packets so there's no need to generalize this 
>>>>> since it is an accommodation for VPP, not something we want to encourage 
>>>>> other applications to use.
>>>>> 
>>>>> 2. We abandoned that approach because it required the application to know 
>>>>> how much memory the ODP implementation needed for its internal use, which 
>>>>> is not something it can reasonably know. So `odp_pool_create()` is 
>>>>> responsible for allocating any shm used by the pool based on input 
>>>>> provided by the caller. 
>>>>> 
>>>>> 3. Agree, the union seems strange here. Since having an output parameter 
>>>>> in the `odp_pool_param_t` is not something we want this will have to be 
>>>>> reworked anyway.


>>>>>> muvarov wrote
>>>>>> 1) is it needed for tmo and bufs also? why it's on only inside packets? 
>>>>>> 2) How memory for *start_addr is allocated in VPP? In previous version 
>>>>>> of odp_pool_create() was odp_shm_t parameter which said to reuse already 
>>>>>> created shm.  Maybe that needs to be reconsidered. 3) why union is 
>>>>>> needed? why it's not with uintptr_t ?


>>>>>>> Dmitry Eremin-Solenikov(lumag) wrote:
>>>>>>> @Bill-Fischofer-Linaro yes, this looks like a good approach.
>>>>>>> @sachin-saxena could you please reimplement your PR following 
>>>>>>> @Bill-Fischofer-Linaro 's suggestion?


>>>>>>>> Dmitry Eremin-Solenikov(lumag) wrote:
>>>>>>>> Got confused between single-segment packet and linear space for 
>>>>>>>> packets, sorry.


>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>> Yes the existing `seg_len` parameter is set to the minimum size 
>>>>>>>>> segment that the application requires. This can be set to be equal to 
>>>>>>>>> `max_len` to require single-segment packets.
>>>>>>>>> 
>>>>>>>>> However @sachin-saxena mentioned at SFO17 that VPP can deal with 
>>>>>>>>> multi-segment packets, though I'm not sure how that works.


>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>> VPP will not run on such platforms without modification. If the goal 
>>>>>>>>>> is to not modify VPP then an `odp_pool_capability()` output that 
>>>>>>>>>> says whether pools can present a linear interface. During Connect 
>>>>>>>>>> @psavol also mentioned that a separate API to get this info would be 
>>>>>>>>>> more appropriate than bending the input to `odp_pool_create()` to 
>>>>>>>>>> give output parameters.
>>>>>>>>>> 
>>>>>>>>>> My personal preference would be something like:
>>>>>>>>>> 
>>>>>>>>>> * `odp_pool_capability()` indicates whether pools can be created 
>>>>>>>>>> that provide linear addressing.
>>>>>>>>>> 
>>>>>>>>>> * An option on `odp_pool_create()` to request a linear pool.
>>>>>>>>>> 
>>>>>>>>>> * A new API (or an extension to the existing `odp_pool_info()` API) 
>>>>>>>>>> to get the mapping info that VPP needs.
>>>>>>>>>> 
>>>>>>>>>> That would seem to be more consistent with overall ODP structure.


>>>>>>>>>>> Dmitry Eremin-Solenikov(lumag) wrote:
>>>>>>>>>>> What will happen for platforms where `odp_packet_t` is not mapped 
>>>>>>>>>>> to the virtual memory?


>>>>>>>>>>>> Dmitry Eremin-Solenikov(lumag) wrote:
>>>>>>>>>>>> Isn't setting `seg_len` enough? Maybe we should provide an updated 
>>>>>>>>>>>> definition for `seg_len`  (e.g. in case `seg_len > max_len`, 
>>>>>>>>>>>> always use single segment).


https://github.com/Linaro/odp/pull/200#discussion_r143715810
updated_at 2017-10-10 12:47:07

Reply via email to