From: Petri Savolainen <petri.savolai...@linaro.org>

Inline packet IO interface handle to index conversion function
which may be used frequently.

Signed-off-by: Petri Savolainen <petri.savolai...@linaro.org>
---
/** Email created from pull request 437 (psavol:master-packet-optim)
 ** https://github.com/Linaro/odp/pull/437
 ** Patch: https://github.com/Linaro/odp/pull/437.patch
 ** Base sha: b95ccd3db6eeb7358a877541747e06354429acdd
 ** Merge commit sha: 3c2134ecc18e4fd52cd526b5c067815ca73864cc
 **/
 platform/linux-generic/Makefile.am                 |  3 +++
 .../include-abi/odp/api/abi/packet_io.h            |  4 +++
 .../include/odp/api/plat/pktio_inlines.h           | 27 +++++++++++++++++++
 .../include/odp/api/plat/pktio_inlines_api.h       | 31 ++++++++++++++++++++++
 .../linux-generic/include/odp_packet_io_internal.h | 13 ++++-----
 platform/linux-generic/odp_packet.c                |  4 ++-
 platform/linux-generic/odp_packet_io.c             | 17 +++---------
 platform/linux-generic/odp_pktio_api.c             | 14 ++++++++++
 8 files changed, 93 insertions(+), 20 deletions(-)
 create mode 100644 platform/linux-generic/include/odp/api/plat/pktio_inlines.h
 create mode 100644 
platform/linux-generic/include/odp/api/plat/pktio_inlines_api.h
 create mode 100644 platform/linux-generic/odp_pktio_api.c

diff --git a/platform/linux-generic/Makefile.am 
b/platform/linux-generic/Makefile.am
index 10e38ac3c..1c2b625cb 100644
--- a/platform/linux-generic/Makefile.am
+++ b/platform/linux-generic/Makefile.am
@@ -30,6 +30,8 @@ odpapiplatinclude_HEADERS = \
                  include/odp/api/plat/packet_inline_types.h \
                  include/odp/api/plat/packet_inlines.h \
                  include/odp/api/plat/packet_inlines_api.h \
+                 include/odp/api/plat/pktio_inlines.h \
+                 include/odp/api/plat/pktio_inlines_api.h \
                  include/odp/api/plat/pool_inline_types.h \
                  include/odp/api/plat/std_clib_inlines.h \
                  include/odp/api/plat/strong_types.h \
@@ -205,6 +207,7 @@ __LIB__libodp_linux_la_SOURCES += \
                           odp_byteorder.c \
                           odp_packet_api.c \
                           odp_packet_flags_api.c \
+                          odp_pktio_api.c \
                           odp_std_clib.c \
                           odp_sync.c \
                           odp_thread_api.c \
diff --git a/platform/linux-generic/include-abi/odp/api/abi/packet_io.h 
b/platform/linux-generic/include-abi/odp/api/abi/packet_io.h
index a84e858e6..07931b817 100644
--- a/platform/linux-generic/include-abi/odp/api/abi/packet_io.h
+++ b/platform/linux-generic/include-abi/odp/api/abi/packet_io.h
@@ -51,6 +51,10 @@ typedef struct odp_pktout_queue_t {
  * @}
  */
 
+#define _ODP_INLINE static inline
+#include <odp/api/plat/pktio_inlines.h>
+#include <odp/api/plat/pktio_inlines_api.h>
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/platform/linux-generic/include/odp/api/plat/pktio_inlines.h 
b/platform/linux-generic/include/odp/api/plat/pktio_inlines.h
new file mode 100644
index 000000000..6a2aa72d8
--- /dev/null
+++ b/platform/linux-generic/include/odp/api/plat/pktio_inlines.h
@@ -0,0 +1,27 @@
+/* Copyright (c) 2018, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#ifndef ODP_PLAT_PKTIO_INLINES_H_
+#define ODP_PLAT_PKTIO_INLINES_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** @cond _ODP_HIDE_FROM_DOXYGEN_ */
+
+static inline int _odp_pktio_index(odp_pktio_t pktio)
+{
+       return (int)(uintptr_t)pktio - 1;
+}
+
+/** @endcond */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/platform/linux-generic/include/odp/api/plat/pktio_inlines_api.h 
b/platform/linux-generic/include/odp/api/plat/pktio_inlines_api.h
new file mode 100644
index 000000000..5b59a4378
--- /dev/null
+++ b/platform/linux-generic/include/odp/api/plat/pktio_inlines_api.h
@@ -0,0 +1,31 @@
+/* Copyright (c) 2018, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+/**
+ * @file
+ */
+
+#ifndef ODP_PLAT_PKTIO_INLINES_API_H_
+#define ODP_PLAT_PKTIO_INLINES_API_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_ODP_INLINE int odp_pktio_index(odp_pktio_t pktio)
+{
+       return _odp_pktio_index(pktio);
+}
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/platform/linux-generic/include/odp_packet_io_internal.h 
b/platform/linux-generic/include/odp_packet_io_internal.h
index ad34e964a..1de0cbf90 100644
--- a/platform/linux-generic/include/odp_packet_io_internal.h
+++ b/platform/linux-generic/include/odp_packet_io_internal.h
@@ -18,6 +18,8 @@
 extern "C" {
 #endif
 
+#include <odp/api/packet_io.h>
+#include <odp/api/plat/pktio_inlines.h>
 #include <odp/api/spinlock.h>
 #include <odp/api/ticketlock.h>
 #include <odp_classification_datamodel.h>
@@ -235,13 +237,10 @@ typedef struct pktio_if_ops {
 
 extern void *pktio_entry_ptr[];
 
-static inline int pktio_to_id(odp_pktio_t pktio)
-{
-       return _odp_typeval(pktio) - 1;
-}
-
 static inline pktio_entry_t *get_pktio_entry(odp_pktio_t pktio)
 {
+       int idx;
+
        if (odp_unlikely(pktio == ODP_PKTIO_INVALID))
                return NULL;
 
@@ -251,7 +250,9 @@ static inline pktio_entry_t *get_pktio_entry(odp_pktio_t 
pktio)
                return NULL;
        }
 
-       return pktio_entry_ptr[pktio_to_id(pktio)];
+       idx = _odp_pktio_index(pktio);
+
+       return pktio_entry_ptr[idx];
 }
 
 static inline int pktio_cls_enabled(pktio_entry_t *entry)
diff --git a/platform/linux-generic/odp_packet.c 
b/platform/linux-generic/odp_packet.c
index 488dcbddf..1909bae25 100644
--- a/platform/linux-generic/odp_packet.c
+++ b/platform/linux-generic/odp_packet.c
@@ -13,6 +13,8 @@
 #include <odp/api/hints.h>
 #include <odp/api/byteorder.h>
 #include <odp/api/plat/byteorder_inlines.h>
+#include <odp/api/packet_io.h>
+#include <odp/api/plat/pktio_inlines.h>
 
 #include <protocols/eth.h>
 #include <protocols/ip.h>
@@ -1269,7 +1271,7 @@ void *odp_packet_offset(odp_packet_t pkt, uint32_t 
offset, uint32_t *len,
 
 int odp_packet_input_index(odp_packet_t pkt)
 {
-       return odp_pktio_index(packet_hdr(pkt)->input);
+       return _odp_pktio_index(packet_hdr(pkt)->input);
 }
 
 void odp_packet_user_ptr_set(odp_packet_t pkt, const void *ctx)
diff --git a/platform/linux-generic/odp_packet_io.c 
b/platform/linux-generic/odp_packet_io.c
index 460891d06..4eae4ed1e 100644
--- a/platform/linux-generic/odp_packet_io.c
+++ b/platform/linux-generic/odp_packet_io.c
@@ -9,6 +9,7 @@
 #include <odp_posix_extensions.h>
 
 #include <odp/api/packet_io.h>
+#include <odp/api/plat/pktio_inlines.h>
 #include <odp_packet_io_internal.h>
 #include <odp/api/packet.h>
 #include <odp_packet_internal.h>
@@ -481,7 +482,7 @@ int odp_pktio_start(odp_pktio_t hdl)
                        }
                }
 
-               sched_fn->pktio_start(pktio_to_id(hdl), num, index, odpq);
+               sched_fn->pktio_start(_odp_pktio_index(hdl), num, index, odpq);
        }
 
        return res;
@@ -1022,16 +1023,6 @@ int odp_pktio_info(odp_pktio_t hdl, odp_pktio_info_t 
*info)
        return 0;
 }
 
-int odp_pktio_index(odp_pktio_t pktio)
-{
-       pktio_entry_t *entry = get_pktio_entry(pktio);
-
-       if (!entry || is_free(entry))
-               return -1;
-
-       return pktio_to_id(pktio);
-}
-
 uint64_t odp_pktin_ts_res(odp_pktio_t hdl)
 {
        pktio_entry_t *entry;
@@ -1361,7 +1352,7 @@ int odp_pktin_queue_config(odp_pktio_t pktio,
                    mode == ODP_PKTIN_MODE_SCHED) {
                        odp_queue_param_t queue_param;
                        char name[ODP_QUEUE_NAME_LEN];
-                       int pktio_id = pktio_to_id(pktio);
+                       int pktio_id = _odp_pktio_index(pktio);
 
                        snprintf(name, sizeof(name), "odp-pktin-%i-%i",
                                 pktio_id, i);
@@ -1496,7 +1487,7 @@ int odp_pktout_queue_config(odp_pktio_t pktio,
                        odp_queue_param_t queue_param;
                        queue_t q_int;
                        char name[ODP_QUEUE_NAME_LEN];
-                       int pktio_id = pktio_to_id(pktio);
+                       int pktio_id = _odp_pktio_index(pktio);
 
                        snprintf(name, sizeof(name), "odp-pktout-%i-%i",
                                 pktio_id, i);
diff --git a/platform/linux-generic/odp_pktio_api.c 
b/platform/linux-generic/odp_pktio_api.c
new file mode 100644
index 000000000..f4dc33466
--- /dev/null
+++ b/platform/linux-generic/odp_pktio_api.c
@@ -0,0 +1,14 @@
+/* Copyright (c) 2018, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#include "config.h"
+
+#include <odp/api/packet_io.h>
+#include <odp/api/plat/pktio_inlines.h>
+
+/* Include non-inlined versions of API functions */
+#define _ODP_INLINE
+#include <odp/api/plat/pktio_inlines_api.h>

Reply via email to