Bill Fischofer(Bill-Fischofer-Linaro) replied on github web page:
platform/linux-generic/include/odp_pktio_ops_subsystem.h
@@ -88,10 +89,40 @@ typedef ODP_MODULE_CLASS(pktio_ops) {
/* Maximum size of pktio specific ops data.*/
#define ODP_PKTIO_ODPS_DATA_MAX_SIZE 80000
+/* Pktio ops data pool */
+#define ODP_PKTIO_OPS_DATA_POOL_SIZE 160000
+#define ODP_PKTIO_OPS_DATA_POOL_NAME "ODP_PKTIO_OPS_DATA"
+
/* Extract pktio ops data from pktio entry structure */
#define odp_ops_data(_p, _mod) \
Comment:
Macros should be CAPITALIZED to indicate that they are macros rather than
callable APIs. So `ODP_OPS_DATA()` would be used here.
> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
> Where does this number come from? Is it subject to configuration?
>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>> 2017, not 2013 here.
>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>> Are these intended to be new ODP APIs? If so they need to be specified in
>>> `odp/api/spec/packet.h`. Or are they supposed to be new Southbound APIs for
>>> use by drivers? Need some clarification here. The use of the `odp_` prefix
>>> implies that these are Northbound APIs. If these are Southbound APIs, then
>>> the prefix should be `odpdrv_`.
>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>> Both pools and shmem's are ODP objects. The difference is a pool is a
>>>> structured collection of objects that can be allocated and freed from the
>>>> pool and that contain both data and metadata, while a shmem is a "slab" of
>>>> memory that has no structure beyond how the application chooses to use it.
>>>> Given this distinction, a pool seems more useful here.
>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>> This definitely should not be part of the API spec. It's an
>>>>> implementation artifact.
>>>>>> nagarahalli wrote
>>>>>> This should be part of odp_pktio_ops_subsystem.h file.
>>>>>>> nagarahalli wrote
>>>>>>> Should we rename it to odp_packet_io_shm.h and odp_packet_io_shm.c?
>>>>>>>> nagarahalli wrote
>>>>>>>> '_p' is not required as the macro is returning 'ops_data'. Makes the
>>>>>>>> macro simple as well.
>>>>>>>>
>>>>>>>> Similarly for odp_ops_data_free can just take 'ops_data' as input.
>>>>>>>>
>>>>>>>> This will be inline with future plans to not expose 'pktio_entry_t' to
>>>>>>>> the drivers.
>>>>>>>>> He Yi(heyi-linaro) wrote:
>>>>>>>>> In future, since each pktio_ops module will not expose their private
>>>>>>>>> data type, this macro can be changed to
>>>>>>>>> >`#define odp_ops_data(_entry, _pdata) \
>>>>>>>>> pdata = (typeof(_pdata))(_entry->s.ops_data)`
>>>>>>>>>
>>>>>>>>> So the odp_pktio_ops_subsystem.h header won't need to know all
>>>>>>>>> pktio_ops' private data structure declaration. Can be considered next
>>>>>>>>> time.
>>>>>>>>>> He Yi(heyi-linaro) wrote:
>>>>>>>>>> Like this!
>>>>>>>>>>> He Yi(heyi-linaro) wrote:
>>>>>>>>>>> Look good no more comments from me to this commit after Honnappa
>>>>>>>>>>> and Josep's, this is a step forward for the pktio ops data
>>>>>>>>>>>
>>>>>>>>>>> This commit also reveals how complex in ODP to allocate an
>>>>>>>>>>> arbitrary sized piece of memory, need to prepare a pool (and guess
>>>>>>>>>>> the largest usage), lookup this pool in every allocation/free by
>>>>>>>>>>> name, and do the allocation/free after then.
>>>>>>>>>>>> He Yi(heyi-linaro) wrote:
>>>>>>>>>>>> seems no need to add an extra macro here?
>>>>>>>>>>>>
>>>>>>>>>>>> ODP_SUBSYSTEM_FOREACH_TEMPLATE(...) is extern
>>>>>>>>>>>> we can just use to generate a static function use the same macro:
>>>>>>>>>>>> static ODP_SUBSYSTEM_FOREACH_TEMPLATE(...)
>>>>>>>>>>>>> nagarahalli wrote
>>>>>>>>>>>>> Temporarily, roundup the size to cache line size. This way all
>>>>>>>>>>>>> the memory allocations will be cache line aligned.
>>>>>>>>>>>>>> nagarahalli wrote
>>>>>>>>>>>>>> Should be odp_ops_data_alloc(_p, size).
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> As per the pkt I/O changes document, _p (pktio_entry_t) is not
>>>>>>>>>>>>>> required to be exposed to drivers. Do you plan to do it as part
>>>>>>>>>>>>>> of this PR?
>>>>>>>>>>>>>>> nagarahalli wrote
>>>>>>>>>>>>>>> Same here, this can be part of odp_pktio_term_global
>>>>>>>>>>>>>>>> nagarahalli wrote
>>>>>>>>>>>>>>>> This functionality can be done in odp_pktio_global_init
>>>>>>>>>>>>>>>> function. This will avoid the changes to modular framework as
>>>>>>>>>>>>>>>> well.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> When we have done additional enhancements to shared memory,
>>>>>>>>>>>>>>>> this code will be deleted. So, can be part of
>>>>>>>>>>>>>>>> odp_pktio_global_init without affecting the modular framework.
>>>>>>>>>>>>>>>>> Josep Puigdemont(joseppc) wrote:
>>>>>>>>>>>>>>>>> ah, yes, true, I didn't think about this detail...
>>>>>>>>>>>>>>>>>> bogdanPricope wrote
>>>>>>>>>>>>>>>>>> @joseppc Btw, 'odp_ops_data_alloc(_p, _mod)' vs.
>>>>>>>>>>>>>>>>>> odp_ops_data_alloc(_p, _size) ?
>>>>>>>>>>>>>>>>>>> bogdanPricope wrote
>>>>>>>>>>>>>>>>>>> No, this pool is used to allocate packets (for recv side).
>>>>>>>>>>>>>>>>>>>> Josep Puigdemont(joseppc) wrote:
>>>>>>>>>>>>>>>>>>>> Ok, I may be splitting hairs now, but I thought we were
>>>>>>>>>>>>>>>>>>>> just checking whether the pool parameter passed to
>>>>>>>>>>>>>>>>>>>> pktio_open was valid, and bail out if not. We are not
>>>>>>>>>>>>>>>>>>>> actually using this pool to allocate this pktio's private
>>>>>>>>>>>>>>>>>>>> data, right?
>>>>>>>>>>>>>>>>>>>>> bogdanPricope wrote
>>>>>>>>>>>>>>>>>>>>> Alloc/free vs. array has this disadvantage: you need to
>>>>>>>>>>>>>>>>>>>>> allocate the memory at some point and free it if the
>>>>>>>>>>>>>>>>>>>>> operation fails for any reason. It is better to delay the
>>>>>>>>>>>>>>>>>>>>> allocation until after some common checks.
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> stncmp: open calls are not on fast path ... no reason to
>>>>>>>>>>>>>>>>>>>>> optimize the performance ... but repeated memory
>>>>>>>>>>>>>>>>>>>>> alloc/free may affect some pool implementations
>>>>>>>>>>>>>>>>>>>>>> bogdanPricope wrote
>>>>>>>>>>>>>>>>>>>>>> It will require a cast when is called.
>>>>>>>>>>>>>>>>>>>>>> A pktio_type may implement another way to allocate
>>>>>>>>>>>>>>>>>>>>>> memory starting form the name of the pool / is not
>>>>>>>>>>>>>>>>>>>>>> mandatory to use those macros but are helpful for
>>>>>>>>>>>>>>>>>>>>>> existing pktio types.
>>>>>>>>>>>>>>>>>>>>>>> bogdanPricope wrote
>>>>>>>>>>>>>>>>>>>>>>> _p comes form (pktio_entry_t *)
>>>>>>>>>>>>>>>>>>>>>>>> Josep Puigdemont(joseppc) wrote:
>>>>>>>>>>>>>>>>>>>>>>>> It probably belongs to its own patch, but now that you
>>>>>>>>>>>>>>>>>>>>>>>> are at it, it could even be moved even further up, as
>>>>>>>>>>>>>>>>>>>>>>>> it is probably faster than checking for "tap:" in the
>>>>>>>>>>>>>>>>>>>>>>>> device string.
>>>>>>>>>>>>>>>>>>>>>>>>> Josep Puigdemont(joseppc) wrote:
>>>>>>>>>>>>>>>>>>>>>>>>> (_p)? There are a couple more, also in
>>>>>>>>>>>>>>>>>>>>>>>>> odp_ops_data_free.
>>>>>>>>>>>>>>>>>>>>>>>>>> Josep Puigdemont(joseppc) wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>> Maybe we can return (void *)? This way we would not
>>>>>>>>>>>>>>>>>>>>>>>>>> care if pktios name (or define) their private
>>>>>>>>>>>>>>>>>>>>>>>>>> structures according to the naming conventions
>>>>>>>>>>>>>>>>>>>>>>>>>> implicit in the macro.
https://github.com/Linaro/odp/pull/297#discussion_r151800809
updated_at 2017-11-20 12:52:30