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