mempool: move stack handler as a driver
authorShreyansh Jain <shreyansh.jain@nxp.com>
Fri, 31 Mar 2017 05:35:37 +0000 (11:05 +0530)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Mon, 3 Apr 2017 17:45:45 +0000 (19:45 +0200)
Moved from lib/librte_mempool, stack mempool handler is an independent
driver.
Shared builds would now require to link in librte_mempool_stack for
"stack" mempool handler.

Signed-off-by: Shreyansh Jain <shreyansh.jain@nxp.com>
Acked-by: Olivier Matz <olivier.matz@6wind.com>
MAINTAINERS
config/common_base
drivers/mempool/Makefile
drivers/mempool/stack/Makefile [new file with mode: 0644]
drivers/mempool/stack/rte_mempool_stack.c [new file with mode: 0644]
drivers/mempool/stack/rte_mempool_stack_version.map [new file with mode: 0644]
lib/librte_mempool/Makefile
lib/librte_mempool/rte_mempool_stack.c [deleted file]
mk/rte.app.mk

index ce7059d..ff0c141 100644 (file)
@@ -213,6 +213,7 @@ M: Olivier Matz <olivier.matz@6wind.com>
 F: lib/librte_mempool/
 F: drivers/mempool/Makefile
 F: drivers/mempool/ring/
+F: drivers/mempool/stack/
 F: doc/guides/prog_guide/mempool_lib.rst
 F: test/test/test_mempool*
 F: test/test/test_func_reentrancy.c
index 9acd557..41191c8 100644 (file)
@@ -464,6 +464,7 @@ CONFIG_RTE_LIBRTE_MEMPOOL_DEBUG=n
 # Compile Mempool drivers
 #
 CONFIG_RTE_DRIVER_MEMPOOL_RING=y
+CONFIG_RTE_DRIVER_MEMPOOL_STACK=y
 
 #
 # Compile librte_mbuf
index 6a8a1da..0c6c45c 100644 (file)
@@ -35,5 +35,7 @@ core-libs := librte_eal librte_mempool librte_ring
 
 DIRS-$(CONFIG_RTE_DRIVER_MEMPOOL_RING) += ring
 DEPDIRS-ring = $(core-libs)
+DIRS-$(CONFIG_RTE_DRIVER_MEMPOOL_STACK) += stack
+DEPDIRS-stack = $(core-libs)
 
 include $(RTE_SDK)/mk/rte.subdir.mk
diff --git a/drivers/mempool/stack/Makefile b/drivers/mempool/stack/Makefile
new file mode 100644 (file)
index 0000000..8f3125c
--- /dev/null
@@ -0,0 +1,51 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2017 NXP.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of NXP nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+include $(RTE_SDK)/mk/rte.vars.mk
+
+#
+# library name
+#
+LIB = librte_mempool_stack.a
+
+CFLAGS += -O3
+CFLAGS += $(WERROR_FLAGS)
+
+# Headers
+CFLAGS += -I$(RTE_SDK)/lib/librte_mempool
+
+EXPORT_MAP := rte_mempool_stack_version.map
+
+LIBABIVER := 1
+
+SRCS-$(CONFIG_RTE_DRIVER_MEMPOOL_STACK) += rte_mempool_stack.c
+
+include $(RTE_SDK)/mk/rte.lib.mk
diff --git a/drivers/mempool/stack/rte_mempool_stack.c b/drivers/mempool/stack/rte_mempool_stack.c
new file mode 100644 (file)
index 0000000..817f77e
--- /dev/null
@@ -0,0 +1,147 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2016 Intel Corporation. All rights reserved.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <stdio.h>
+#include <rte_mempool.h>
+#include <rte_malloc.h>
+
+struct rte_mempool_stack {
+       rte_spinlock_t sl;
+
+       uint32_t size;
+       uint32_t len;
+       void *objs[];
+};
+
+static int
+stack_alloc(struct rte_mempool *mp)
+{
+       struct rte_mempool_stack *s;
+       unsigned n = mp->size;
+       int size = sizeof(*s) + (n+16)*sizeof(void *);
+
+       /* Allocate our local memory structure */
+       s = rte_zmalloc_socket("mempool-stack",
+                       size,
+                       RTE_CACHE_LINE_SIZE,
+                       mp->socket_id);
+       if (s == NULL) {
+               RTE_LOG(ERR, MEMPOOL, "Cannot allocate stack!\n");
+               return -ENOMEM;
+       }
+
+       rte_spinlock_init(&s->sl);
+
+       s->size = n;
+       mp->pool_data = s;
+
+       return 0;
+}
+
+static int
+stack_enqueue(struct rte_mempool *mp, void * const *obj_table,
+               unsigned n)
+{
+       struct rte_mempool_stack *s = mp->pool_data;
+       void **cache_objs;
+       unsigned index;
+
+       rte_spinlock_lock(&s->sl);
+       cache_objs = &s->objs[s->len];
+
+       /* Is there sufficient space in the stack ? */
+       if ((s->len + n) > s->size) {
+               rte_spinlock_unlock(&s->sl);
+               return -ENOBUFS;
+       }
+
+       /* Add elements back into the cache */
+       for (index = 0; index < n; ++index, obj_table++)
+               cache_objs[index] = *obj_table;
+
+       s->len += n;
+
+       rte_spinlock_unlock(&s->sl);
+       return 0;
+}
+
+static int
+stack_dequeue(struct rte_mempool *mp, void **obj_table,
+               unsigned n)
+{
+       struct rte_mempool_stack *s = mp->pool_data;
+       void **cache_objs;
+       unsigned index, len;
+
+       rte_spinlock_lock(&s->sl);
+
+       if (unlikely(n > s->len)) {
+               rte_spinlock_unlock(&s->sl);
+               return -ENOENT;
+       }
+
+       cache_objs = s->objs;
+
+       for (index = 0, len = s->len - 1; index < n;
+                       ++index, len--, obj_table++)
+               *obj_table = cache_objs[len];
+
+       s->len -= n;
+       rte_spinlock_unlock(&s->sl);
+       return 0;
+}
+
+static unsigned
+stack_get_count(const struct rte_mempool *mp)
+{
+       struct rte_mempool_stack *s = mp->pool_data;
+
+       return s->len;
+}
+
+static void
+stack_free(struct rte_mempool *mp)
+{
+       rte_free((void *)(mp->pool_data));
+}
+
+static struct rte_mempool_ops ops_stack = {
+       .name = "stack",
+       .alloc = stack_alloc,
+       .free = stack_free,
+       .enqueue = stack_enqueue,
+       .dequeue = stack_dequeue,
+       .get_count = stack_get_count
+};
+
+MEMPOOL_REGISTER_OPS(ops_stack);
diff --git a/drivers/mempool/stack/rte_mempool_stack_version.map b/drivers/mempool/stack/rte_mempool_stack_version.map
new file mode 100644 (file)
index 0000000..8591cc0
--- /dev/null
@@ -0,0 +1,4 @@
+DPDK_17.05 {
+
+       local: *;
+};
index efd4383..7b5bdfe 100644 (file)
@@ -43,7 +43,6 @@ LIBABIVER := 2
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MEMPOOL) +=  rte_mempool.c
 SRCS-$(CONFIG_RTE_LIBRTE_MEMPOOL) +=  rte_mempool_ops.c
-SRCS-$(CONFIG_RTE_LIBRTE_MEMPOOL) +=  rte_mempool_stack.c
 # install includes
 SYMLINK-$(CONFIG_RTE_LIBRTE_MEMPOOL)-include := rte_mempool.h
 
diff --git a/lib/librte_mempool/rte_mempool_stack.c b/lib/librte_mempool/rte_mempool_stack.c
deleted file mode 100644 (file)
index 817f77e..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-/*-
- *   BSD LICENSE
- *
- *   Copyright(c) 2016 Intel Corporation. All rights reserved.
- *   All rights reserved.
- *
- *   Redistribution and use in source and binary forms, with or without
- *   modification, are permitted provided that the following conditions
- *   are met:
- *
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in
- *       the documentation and/or other materials provided with the
- *       distribution.
- *     * Neither the name of Intel Corporation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <stdio.h>
-#include <rte_mempool.h>
-#include <rte_malloc.h>
-
-struct rte_mempool_stack {
-       rte_spinlock_t sl;
-
-       uint32_t size;
-       uint32_t len;
-       void *objs[];
-};
-
-static int
-stack_alloc(struct rte_mempool *mp)
-{
-       struct rte_mempool_stack *s;
-       unsigned n = mp->size;
-       int size = sizeof(*s) + (n+16)*sizeof(void *);
-
-       /* Allocate our local memory structure */
-       s = rte_zmalloc_socket("mempool-stack",
-                       size,
-                       RTE_CACHE_LINE_SIZE,
-                       mp->socket_id);
-       if (s == NULL) {
-               RTE_LOG(ERR, MEMPOOL, "Cannot allocate stack!\n");
-               return -ENOMEM;
-       }
-
-       rte_spinlock_init(&s->sl);
-
-       s->size = n;
-       mp->pool_data = s;
-
-       return 0;
-}
-
-static int
-stack_enqueue(struct rte_mempool *mp, void * const *obj_table,
-               unsigned n)
-{
-       struct rte_mempool_stack *s = mp->pool_data;
-       void **cache_objs;
-       unsigned index;
-
-       rte_spinlock_lock(&s->sl);
-       cache_objs = &s->objs[s->len];
-
-       /* Is there sufficient space in the stack ? */
-       if ((s->len + n) > s->size) {
-               rte_spinlock_unlock(&s->sl);
-               return -ENOBUFS;
-       }
-
-       /* Add elements back into the cache */
-       for (index = 0; index < n; ++index, obj_table++)
-               cache_objs[index] = *obj_table;
-
-       s->len += n;
-
-       rte_spinlock_unlock(&s->sl);
-       return 0;
-}
-
-static int
-stack_dequeue(struct rte_mempool *mp, void **obj_table,
-               unsigned n)
-{
-       struct rte_mempool_stack *s = mp->pool_data;
-       void **cache_objs;
-       unsigned index, len;
-
-       rte_spinlock_lock(&s->sl);
-
-       if (unlikely(n > s->len)) {
-               rte_spinlock_unlock(&s->sl);
-               return -ENOENT;
-       }
-
-       cache_objs = s->objs;
-
-       for (index = 0, len = s->len - 1; index < n;
-                       ++index, len--, obj_table++)
-               *obj_table = cache_objs[len];
-
-       s->len -= n;
-       rte_spinlock_unlock(&s->sl);
-       return 0;
-}
-
-static unsigned
-stack_get_count(const struct rte_mempool *mp)
-{
-       struct rte_mempool_stack *s = mp->pool_data;
-
-       return s->len;
-}
-
-static void
-stack_free(struct rte_mempool *mp)
-{
-       rte_free((void *)(mp->pool_data));
-}
-
-static struct rte_mempool_ops ops_stack = {
-       .name = "stack",
-       .alloc = stack_alloc,
-       .free = stack_free,
-       .enqueue = stack_enqueue,
-       .dequeue = stack_dequeue,
-       .get_count = stack_get_count
-};
-
-MEMPOOL_REGISTER_OPS(ops_stack);
index 5ebb6ec..336e448 100644 (file)
@@ -102,6 +102,7 @@ _LDLIBS-$(CONFIG_RTE_LIBRTE_REORDER)        += -lrte_reorder
 ifeq ($(CONFIG_RTE_BUILD_SHARED_LIB),n)
 # plugins (link only if static libraries)
 _LDLIBS-$(CONFIG_RTE_DRIVER_MEMPOOL_RING)   += -lrte_mempool_ring
+_LDLIBS-$(CONFIG_RTE_DRIVER_MEMPOOL_STACK)  += -lrte_mempool_stack
 
 _LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_AF_PACKET)  += -lrte_pmd_af_packet
 _LDLIBS-$(CONFIG_RTE_LIBRTE_BNX2X_PMD)      += -lrte_pmd_bnx2x -lz