The original design for the user metadata feature had persistence as an odp_pool_param option at pool creation. We should revisit this in that context as introducing more hardcoded #defines into odp_config.h doesn't seem the right way to go for these things.
On Thu, Jul 2, 2015 at 11:42 AM, Zoltan Kiss <[email protected]> wrote: > This requirement came from ODP-OVS: it handles buffers through 'struct > ofpbuf' > (in upstream it became 'struct dp_packet'), and they can be non-ODP > buffers as > well. Therefore after receiving a packet currently we have to reset three > fields in it: 'source' (to ODP), 'allocated' (segment size, OVS doesn't > support > multiple segments in this struct) and 'odp_pkt' (points to the containing > odp_packet_t) > The native DPDK implementation takes advantage of the fact that the buffer > and > user metadata area, where this struct is stored is allocated during pool > creation time, therefore it initializes it to static values at startup. > When > I've tried this behaviour with ODP-DPDK, the performance increased from > ~12.7 > to ~12.9 Mpp. That's only ~%1.6 increase, but in other words it's ~%17 of > the > gap between the current and OVS-DPDK performance (13.9 Mpp) > I would like a propose an optional feature where the implementation can > signal > if it guarantees this behaviour. I think most implementations would > preallocate these areas to achieve good performance, but e.g. linux-generic > does not AFAIK. > > Signed-off-by: Zoltan Kiss <[email protected]> > --- > include/odp/api/config.h | 10 ++++++++++ > include/odp/api/packet.h | 4 +++- > 2 files changed, 13 insertions(+), 1 deletion(-) > > diff --git a/include/odp/api/config.h b/include/odp/api/config.h > index 91ea34e..d48030e 100644 > --- a/include/odp/api/config.h > +++ b/include/odp/api/config.h > @@ -121,6 +121,16 @@ extern "C" { > */ > #define ODP_CONFIG_PACKET_BUF_LEN_MAX (ODP_CONFIG_PACKET_SEG_LEN_MIN*6) > > +/** > + * Guarantee that user metadata is allocated during pool creation > + * > + * If this parameter is 1, applications can avoid reseting persistent > parts of > + * the area returned by odp_packet_user_area() by setting them once, > after pool > + * creation. It will keep its content between odp_packet_free() and > + * odp_packet_alloc(). > + */ > +#define ODP_CONFIG_PACKET_PERSISTENT_MD 0 > + > /** Maximum number of shared memory blocks. > * > * This the the number of separate SHM areas that can be reserved > concurrently > diff --git a/include/odp/api/packet.h b/include/odp/api/packet.h > index 91a124a..d7aeb95 100644 > --- a/include/odp/api/packet.h > +++ b/include/odp/api/packet.h > @@ -448,7 +448,9 @@ void odp_packet_user_ptr_set(odp_packet_t pkt, const > void *ctx); > * User area address > * > * Each packet has an area for user data. Size of the area is fixed and > defined > - * in packet pool parameters. > + * in packet pool parameters. If ODP_CONFIG_PACKET_PERSISTENT_MD is 1, > this > + * area is allocated during pool creation, and keep its content between > + * odp_packet_free() and odp_packet_alloc(). > * > * @param pkt Packet handle > * > -- > 1.9.1 > > _______________________________________________ > lng-odp-dpdk mailing list > [email protected] > https://lists.linaro.org/mailman/listinfo/lng-odp-dpdk >
_______________________________________________ lng-odp mailing list [email protected] https://lists.linaro.org/mailman/listinfo/lng-odp
