Just tested this and it works like a charm. This is a very convenient
option to have for some use-cases that include the shared object file.


*Miroslav Kiradzhiyski*
*Software Developer*
Virtual Open Systems

Web*:* *www.virtualopensystems.com <http://www.virtualopensystems.com/>*

On Fri, Apr 22, 2016 at 9:11 PM, Zoltan Kiss <zoltan.k...@linaro.org> wrote:

> In order to have a fixed ABI, we need each function to be in the library
> file. But that hurts performance a bit, as small accessor functions
> couldn't be inlined. To have the ability to use both, this patch
> creates a new configure option, which enables the use of inline
> functions for users who want better performance.
> The accessors are moved to a packet_inlines.h file, by default it is
> included from odp_packet.c, and they appear as fully fledged functions.
> If --enable-inlines=yes is added to ./configure, they won't be compiled
> into the .so file, but the application has to add "#define INLINES" before
> including odp.h
>
> Signed-off-by: Zoltan Kiss <zoltan.k...@linaro.org>
> ---
>  configure.ac                                       |  9 +++
>  platform/linux-dpdk/Makefile.am                    |  1 +
>  platform/linux-dpdk/include/odp/api/packet.h       | 59 +--------------
>  .../linux-dpdk/include/odp/api/packet_inlines.h    | 86
> ++++++++++++++++++++++
>  platform/linux-dpdk/odp_packet.c                   |  3 +
>  5 files changed, 102 insertions(+), 56 deletions(-)
>  create mode 100644 platform/linux-dpdk/include/odp/api/packet_inlines.h
>
> diff --git a/configure.ac b/configure.ac
> index 99772a1..6b8fb76 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -173,6 +173,15 @@ AC_ARG_ENABLE([debug],
>  ODP_CFLAGS="$ODP_CFLAGS -DODP_DEBUG=$ODP_DEBUG"
>
>  ##########################################################################
> +# Enable/disable static inlines
> +##########################################################################
> +AC_ARG_ENABLE([inlines],
> +    [  --enable-inlines          allow inlines],
> +    [if test "x$enableval" = "xyes"; then
> +        ODP_CFLAGS="$ODP_CFLAGS -DINLINES"
> +    fi])
> +
> +##########################################################################
>  # Save and set temporary compilation flags
>  ##########################################################################
>  OLD_LDFLAGS=$LDFLAGS
> diff --git a/platform/linux-dpdk/Makefile.am
> b/platform/linux-dpdk/Makefile.am
> index eadaf63..b8cba23 100644
> --- a/platform/linux-dpdk/Makefile.am
> +++ b/platform/linux-dpdk/Makefile.am
> @@ -49,6 +49,7 @@ odpapiinclude_HEADERS = \
>                   $(srcdir)/include/odp/api/init.h \
>                   $(srcdir)/include/odp/api/packet_flags.h \
>                   $(srcdir)/include/odp/api/packet.h \
> +                 $(srcdir)/include/odp/api/packet_inlines.h \
>                   $(srcdir)/include/odp/api/packet_io.h \
>                   $(srcdir)/include/odp/api/pool.h \
>                   $(srcdir)/include/odp/api/queue.h \
> diff --git a/platform/linux-dpdk/include/odp/api/packet.h
> b/platform/linux-dpdk/include/odp/api/packet.h
> index 7c0db32..e2ba78a 100644
> --- a/platform/linux-dpdk/include/odp/api/packet.h
> +++ b/platform/linux-dpdk/include/odp/api/packet.h
> @@ -27,62 +27,9 @@ extern "C" {
>  /** @ingroup odp_packet
>   *  @{
>   */
> -
> -extern const unsigned int buf_addr_offset;
> -extern const unsigned int data_off_offset;
> -extern const unsigned int pkt_len_offset;
> -extern const unsigned int seg_len_offset;
> -extern const unsigned int udata_len_offset;
> -extern const unsigned int udata_offset;
> -extern const unsigned int rss_offset;
> -extern const unsigned int ol_flags_offset;
> -extern const uint64_t rss_flag;
> -
> -/*
> - * NOTE: These functions are inlined because they are on a performance
> hot path.
> - * As we can't force the application to directly include DPDK headers we
> have to
> - * export these fields through constants calculated compile time in
> - * odp_packet.c, where we can see the DPDK definitions.
> - *
> - */
> -static inline uint32_t odp_packet_len(odp_packet_t pkt)
> -{
> -       return *(uint32_t *)(void *)((char *)pkt + pkt_len_offset);
> -}
> -
> -static inline uint32_t odp_packet_seg_len(odp_packet_t pkt)
> -{
> -       return *(uint16_t *)(void *)((char *)pkt + seg_len_offset);
> -}
> -
> -static inline void *odp_packet_user_area(odp_packet_t pkt)
> -{
> -       return (void *)((char *)pkt + udata_offset);
> -}
> -
> -static inline uint32_t odp_packet_user_area_size(odp_packet_t pkt)
> -{
> -       return *(uint32_t *)(void *)((char *)pkt + udata_len_offset);
> -}
> -
> -static inline void *odp_packet_data(odp_packet_t pkt)
> -{
> -       char** buf_addr = (char **)(void *)((char *)pkt + buf_addr_offset);
> -       uint16_t data_off = *(uint16_t *)(void *)((char *)pkt +
> data_off_offset);
> -       return (void *)(*buf_addr + data_off);
> -}
> -
> -static inline uint32_t odp_packet_flow_hash(odp_packet_t pkt)
> -{
> -       return *(uint32_t *)(void *)((char *)pkt + rss_offset);
> -}
> -
> -static inline void odp_packet_flow_hash_set(odp_packet_t pkt, uint32_t
> flow_hash)
> -{
> -       *(uint32_t *)(void *)((char *)pkt + rss_offset) = flow_hash;
> -       *(uint64_t *)(void *)((char *)pkt + ol_flags_offset) |= rss_flag;
> -}
> -
> +#ifdef INLINES
> +#include <odp/api/packet_inlines.h>
> +#endif
>  /**
>   * @}
>   */
> diff --git a/platform/linux-dpdk/include/odp/api/packet_inlines.h
> b/platform/linux-dpdk/include/odp/api/packet_inlines.h
> new file mode 100644
> index 0000000..3d3ca81
> --- /dev/null
> +++ b/platform/linux-dpdk/include/odp/api/packet_inlines.h
> @@ -0,0 +1,86 @@
> +/* Copyright (c) 2016, Linaro Limited
> + * All rights reserved.
> + *
> + * SPDX-License-Identifier: BSD-3-Clause
> + */
> +
> +/**
> + * @file
> + *
> + * ODP packet inline functions
> + */
> +
> +#ifndef ODP_PLAT_PACKET_INLINES_H_
> +#define ODP_PLAT_PACKET_INLINES_H_
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +#ifdef INLINES
> +#define _STATIC static inline
> +
> +extern const unsigned int buf_addr_offset;
> +extern const unsigned int data_off_offset;
> +extern const unsigned int pkt_len_offset;
> +extern const unsigned int seg_len_offset;
> +extern const unsigned int udata_len_offset;
> +extern const unsigned int udata_offset;
> +extern const unsigned int rss_offset;
> +extern const unsigned int ol_flags_offset;
> +extern const uint64_t rss_flag;
> +
> +#else
> +#define _STATIC
> +#endif
> +
> +/*
> + * NOTE: These functions are inlined because they are on a performance
> hot path.
> + * As we can't force the application to directly include DPDK headers we
> have to
> + * export these fields through constants calculated compile time in
> + * odp_packet.c, where we can see the DPDK definitions.
> + *
> + */
> +_STATIC uint32_t odp_packet_len(odp_packet_t pkt)
> +{
> +       return *(uint32_t *)(void *)((char *)pkt + pkt_len_offset);
> +}
> +
> +_STATIC uint32_t odp_packet_seg_len(odp_packet_t pkt)
> +{
> +       return *(uint16_t *)(void *)((char *)pkt + seg_len_offset);
> +}
> +
> +_STATIC void *odp_packet_user_area(odp_packet_t pkt)
> +{
> +       return (void *)((char *)pkt + udata_offset);
> +}
> +
> +_STATIC uint32_t odp_packet_user_area_size(odp_packet_t pkt)
> +{
> +       return *(uint32_t *)(void *)((char *)pkt + udata_len_offset);
> +}
> +
> +_STATIC void *odp_packet_data(odp_packet_t pkt)
> +{
> +       char** buf_addr = (char **)(void *)((char *)pkt + buf_addr_offset);
> +       uint16_t data_off = *(uint16_t *)(void *)((char *)pkt +
> data_off_offset);
> +       return (void *)(*buf_addr + data_off);
> +}
> +
> +_STATIC uint32_t odp_packet_flow_hash(odp_packet_t pkt)
> +{
> +       return *(uint32_t *)(void *)((char *)pkt + rss_offset);
> +}
> +
> +_STATIC void odp_packet_flow_hash_set(odp_packet_t pkt, uint32_t
> flow_hash)
> +{
> +       *(uint32_t *)(void *)((char *)pkt + rss_offset) = flow_hash;
> +       *(uint64_t *)(void *)((char *)pkt + ol_flags_offset) |= rss_flag;
> +}
> +
> +#ifdef __cplusplus
> +}
> +#endif
> +
> +#endif /* ODP_PLAT_PACKET_INLINES_H_ */
> diff --git a/platform/linux-dpdk/odp_packet.c
> b/platform/linux-dpdk/odp_packet.c
> index e031b09..456ced6 100644
> --- a/platform/linux-dpdk/odp_packet.c
> +++ b/platform/linux-dpdk/odp_packet.c
> @@ -60,6 +60,9 @@ _ODP_STATIC_ASSERT(sizeof(dummy.hash.rss) ==
> sizeof(uint32_t),
>  _ODP_STATIC_ASSERT(sizeof(dummy.ol_flags) == sizeof(uint64_t),
>                    "ol_flags should be uint64_t");
>
> +#ifndef INLINES
> +#include <odp/api/packet_inlines.h>
> +#endif
>
>  odp_packet_t _odp_packet_from_buffer(odp_buffer_t buf)
>  {
> --
> 1.9.1
>
> _______________________________________________
> lng-odp-dpdk mailing list
> lng-odp-d...@lists.linaro.org
> https://lists.linaro.org/mailman/listinfo/lng-odp-dpdk
>
_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to