All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/15] dpdk: Separate compile time linkage between eal lib and pmd's
@ 2014-04-15 18:05 Neil Horman
       [not found] ` <1397585169-14537-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
  0 siblings, 1 reply; 77+ messages in thread
From: Neil Horman @ 2014-04-15 18:05 UTC (permalink / raw)
  To: dev-VfR2kkLFssw

Disconnect compile time linkage between eal library / applications and pmd's

I noticed that, while tinkering with dpdk, building for shared libraries still
resulted in all the test applications linking to all the built pmd's, despite
not actually needing them all.  We are able to tell an application at run time
(via the -d/--blacklist/--whitelist/--vdev options) which pmd's we want to use,
and so have no need to link them at all. The only reason they get pulled in is
because rte_eal_non_pci_init_etherdev and rte_pmd_init_all contain static lists
to the individual pmd init functions. The result is that, even when building as
DSO's, we have to load all the pmd libraries, which is space inefficient and
defeating of some of the purpose of shared objects.

To correct this, I developed this patch series, which introduces a new macro,
PMD_REGISTER_DRIVER, which wraps up Oliviers work using constructors on the
virtual device pmds, then expands on it to include the physical device pmds,
allowing us to break linkages between dpdk applications and pmd's almost
entirely (save for the ring and xenvirt drivers, which have additional api's
outside of the standard dpdk code that we need to further fix).  This also
allows us to completely remove the rte_pmd_init_all routine, hiding its function
internally to the rte_eal_init path. 

I've tested this feature using the igb and pcap pmd's, both statically and
dynamically linked with the test and testpmd sample applications, and it seems
to work well.

Note, I encountered  a few bugs along the way, which I fixed and noted in the
series.

Regards
Neil

^ permalink raw reply	[flat|nested] 77+ messages in thread

* [PATCH 01/15] makefiles: Fixed -share command line option error
       [not found] ` <1397585169-14537-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
@ 2014-04-15 18:05   ` Neil Horman
       [not found]     ` <1397585169-14537-2-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
  2014-04-15 18:05   ` [PATCH 02/15] make: include whole archive on static link Neil Horman
                     ` (14 subsequent siblings)
  15 siblings, 1 reply; 77+ messages in thread
From: Neil Horman @ 2014-04-15 18:05 UTC (permalink / raw)
  To: dev-VfR2kkLFssw

The shared libraries built with the current makefile set produce static
libraries rather than actual shared objects.  This is due to several missing
options that are required to correctly build shared objects using ld, as well as
a mis-specified -share option (which should be -shared). Switching to the use of
CC rather than LD and fixing the -shared option corrects these problems and
builds the DSOs correctly.

Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
---
 mk/rte.lib.mk      | 4 ++--
 mk/rte.sharelib.mk | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index f75ca92..8a914db 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -68,7 +68,7 @@ O_TO_A_DO = @set -e; \
 	$(O_TO_A) && \
 	echo $(O_TO_A_CMD) > $(call exe2cmd,$(@))
 
-O_TO_S = $(LD) $(CPU_LDFLAGS) -z muldefs -share $(OBJS-y) -o $(LIB)
+O_TO_S = $(CC) $(CPU_LDFLAGS) -z muldefs -shared $(OBJS-y) -o $(LIB)
 O_TO_S_STR = $(subst ','\'',$(O_TO_S)) #'# fix syntax highlight
 O_TO_S_DISP = $(if $(V),"$(O_TO_S_STR)","  LD $(@)")
 O_TO_S_DO = @set -e; \
@@ -84,7 +84,7 @@ O_TO_C_DO = @set -e; \
 	$(lib_dir) \
 	$(copy_obj)
 else
-O_TO_C = $(LD) -z muldefs -share $(OBJS-y) -o $(LIB_ONE)
+O_TO_C = $(CC) -z muldefs -shared $(OBJS-y) -o $(LIB_ONE)
 O_TO_C_STR = $(subst ','\'',$(O_TO_C)) #'# fix syntax highlight
 O_TO_C_DISP = $(if $(V),"$(O_TO_C_STR)","  LD_C $(@)")
 O_TO_C_DO = @set -e; \
diff --git a/mk/rte.sharelib.mk b/mk/rte.sharelib.mk
index 3967b51..8e821e0 100644
--- a/mk/rte.sharelib.mk
+++ b/mk/rte.sharelib.mk
@@ -45,7 +45,7 @@ sharelib: $(LIB_ONE) FORCE
 
 OBJS = $(wildcard $(RTE_OUTPUT)/build/lib/*.o)
 
-O_TO_S = $(LD) $(CPU_LDFLAGS) -share $(OBJS) -o $(RTE_OUTPUT)/lib/$(LIB_ONE)
+O_TO_S = $(CC) $(CPU_LDFLAGS) -shared $(OBJS) -o $(RTE_OUTPUT)/lib/$(LIB_ONE)
 O_TO_S_STR = $(subst ','\'',$(O_TO_S)) #'# fix syntax highlight
 O_TO_S_DISP = $(if $(V),"$(O_TO_S_STR)","  LD $(@)")
 O_TO_S_CMD = "cmd_$@ = $(O_TO_S_STR)"
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 77+ messages in thread

* [PATCH 02/15] make: include whole archive on static link
       [not found] ` <1397585169-14537-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
  2014-04-15 18:05   ` [PATCH 01/15] makefiles: Fixed -share command line option error Neil Horman
@ 2014-04-15 18:05   ` Neil Horman
       [not found]     ` <1397585169-14537-3-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
  2014-04-15 18:05   ` [PATCH 03/15] pmd: Add PMD_REGISTER_DRIVER macro Neil Horman
                     ` (13 subsequent siblings)
  15 siblings, 1 reply; 77+ messages in thread
From: Neil Horman @ 2014-04-15 18:05 UTC (permalink / raw)
  To: dev-VfR2kkLFssw

This happens automatically on dyanmic linking, but when linking an archive we
need to to include the whole archive to make sure we call all the constructors.
Not doing this causes them to be discarded due to the fact theres no symbolic
reference connecting the pmds to the application.

Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
---
 mk/rte.app.mk | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/mk/rte.app.mk b/mk/rte.app.mk
index 072718a..5a0ef0c 100644
--- a/mk/rte.app.mk
+++ b/mk/rte.app.mk
@@ -206,6 +206,8 @@ endif
 ifeq ($(LINK_USING_CC),1)
 comma := ,
 LDLIBS := $(addprefix -Wl$(comma),$(LDLIBS))
+LDLIBS := -Wl$(comma)--whole-archive $(LDLIBS)
+LDLIBS += -Wl,--no-whole-archive -Wl,-z -Wl,muldefs
 LDFLAGS := $(addprefix -Wl$(comma),$(LDFLAGS))
 override EXTRA_LDFLAGS := $(addprefix -Wl$(comma),$(EXTRA_LDFLAGS))
 O_TO_EXE = $(CC) $(CFLAGS) $(LDFLAGS_$(@)) \
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 77+ messages in thread

* [PATCH 03/15] pmd: Add PMD_REGISTER_DRIVER macro
       [not found] ` <1397585169-14537-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
  2014-04-15 18:05   ` [PATCH 01/15] makefiles: Fixed -share command line option error Neil Horman
  2014-04-15 18:05   ` [PATCH 02/15] make: include whole archive on static link Neil Horman
@ 2014-04-15 18:05   ` Neil Horman
       [not found]     ` <1397585169-14537-4-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
  2014-04-15 18:05   ` [PATCH 04/15] pcap: Convert to use of PMD_REGISTER_DRIVER and fix linking Neil Horman
                     ` (12 subsequent siblings)
  15 siblings, 1 reply; 77+ messages in thread
From: Neil Horman @ 2014-04-15 18:05 UTC (permalink / raw)
  To: dev-VfR2kkLFssw

Rather than have each driver have to remember to add a constructor to it to make
sure its gets registered properly, wrap that process up in a macro to make
registration a one line affair.  This also sets the stage for us to make
registration of vdev pmds and physical pmds a uniform process

Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
---
 lib/librte_eal/common/Makefile          |  2 +-
 lib/librte_eal/common/include/rte_pmd.h | 69 +++++++++++++++++++++++++++++++++
 2 files changed, 70 insertions(+), 1 deletion(-)
 create mode 100644 lib/librte_eal/common/include/rte_pmd.h

diff --git a/lib/librte_eal/common/Makefile b/lib/librte_eal/common/Makefile
index 2f99bf4..b918a73 100644
--- a/lib/librte_eal/common/Makefile
+++ b/lib/librte_eal/common/Makefile
@@ -37,7 +37,7 @@ INC += rte_log.h rte_memcpy.h rte_memory.h rte_memzone.h rte_pci.h
 INC += rte_pci_dev_ids.h rte_per_lcore.h rte_prefetch.h rte_random.h
 INC += rte_rwlock.h rte_spinlock.h rte_tailq.h rte_interrupts.h rte_alarm.h
 INC += rte_string_fns.h rte_cpuflags.h rte_version.h rte_tailq_elem.h
-INC += rte_eal_memconfig.h rte_malloc_heap.h
+INC += rte_eal_memconfig.h rte_malloc_heap.h rte_pmd.h
 INC += rte_hexdump.h rte_devargs.h rte_vdev.h
 
 ifeq ($(CONFIG_RTE_INSECURE_FUNCTION_WARNING),y)
diff --git a/lib/librte_eal/common/include/rte_pmd.h b/lib/librte_eal/common/include/rte_pmd.h
new file mode 100644
index 0000000..b37fa28
--- /dev/null
+++ b/lib/librte_eal/common/include/rte_pmd.h
@@ -0,0 +1,69 @@
+/*-
+ *   BSD LICENSE
+ * 
+ *   Copyright(c) 2010-2014 Neil Horman <nhorman-2XuSBdqkA4TL+VOYFs8Niw@public.gmane.org 
+ *   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.
+ */
+
+/**
+ * @file
+ *
+ * API for error cause tracking
+ */
+
+#ifndef _RTE_PMD_H_
+#define _RTE_PMD_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum rte_pmd_driver_type {
+	PMD_VDEV = 1
+};
+
+extern void rte_eal_nonpci_dev_init_register(const char *name, int (*dev_initfn)(const char *, const char *));
+#define PMD_REGISTER_DRIVER(d, t)\
+void devinitfn_ ##d(void);\
+void __attribute__((constructor, used)) devinitfn_ ##d(void)\
+{\
+	enum rte_pmd_driver_type _t = (t);\
+	switch(_t)\
+	{\
+		case PMD_VDEV:\
+			rte_eal_vdev_driver_register(&d);\
+			break;\
+	};\
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RTE_PMD_H_ */
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 77+ messages in thread

* [PATCH 04/15] pcap: Convert to use of PMD_REGISTER_DRIVER and fix linking
       [not found] ` <1397585169-14537-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
                     ` (2 preceding siblings ...)
  2014-04-15 18:05   ` [PATCH 03/15] pmd: Add PMD_REGISTER_DRIVER macro Neil Horman
@ 2014-04-15 18:05   ` Neil Horman
  2014-04-15 18:05   ` [PATCH 05/15] ring: " Neil Horman
                     ` (11 subsequent siblings)
  15 siblings, 0 replies; 77+ messages in thread
From: Neil Horman @ 2014-04-15 18:05 UTC (permalink / raw)
  To: dev-VfR2kkLFssw

convert the pcap driver to use the PMD_REGISTER_DRIVER macro and fix up the
Makefile so that its linkage is only done if we are building static libraries.
This means that the test applications now have no reference to the pcap library
when building DSO's and must specify its use on the command line with the -d
option.  Static linking will still initalize the driver automatically.

Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
---
 lib/librte_pmd_pcap/rte_eth_pcap.c | 8 ++------
 mk/rte.app.mk                      | 2 ++
 2 files changed, 4 insertions(+), 6 deletions(-)

diff --git a/lib/librte_pmd_pcap/rte_eth_pcap.c b/lib/librte_pmd_pcap/rte_eth_pcap.c
index 680dfdc..4167a26 100644
--- a/lib/librte_pmd_pcap/rte_eth_pcap.c
+++ b/lib/librte_pmd_pcap/rte_eth_pcap.c
@@ -41,6 +41,7 @@
 #include <rte_cycles.h>
 #include <rte_kvargs.h>
 #include <rte_vdev.h>
+#include <rte_pmd.h>
 
 #include <net/if.h>
 
@@ -772,9 +773,4 @@ static struct rte_vdev_driver pmd_pcap_drv = {
 	.init = rte_pmd_pcap_devinit,
 };
 
-__attribute__((constructor))
-static void
-rte_pmd_pcap_init(void)
-{
-	rte_eal_vdev_driver_register(&pmd_pcap_drv);
-}
+PMD_REGISTER_DRIVER(pmd_pcap_drv, PMD_VDEV);
diff --git a/mk/rte.app.mk b/mk/rte.app.mk
index 5a0ef0c..e6d09b8 100644
--- a/mk/rte.app.mk
+++ b/mk/rte.app.mk
@@ -172,9 +172,11 @@ ifeq ($(CONFIG_RTE_LIBRTE_CMDLINE),y)
 LDLIBS += -lrte_cmdline
 endif
 
+ifeq ($(RTE_BUILD_SHARED_LIB),n)
 ifeq ($(CONFIG_RTE_LIBRTE_PMD_PCAP),y)
 LDLIBS += -lrte_pmd_pcap -lpcap
 endif
+endif
 
 LDLIBS += $(EXECENV_LDLIBS)
 
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 77+ messages in thread

* [PATCH 05/15] ring: Convert to use of PMD_REGISTER_DRIVER and fix linking
       [not found] ` <1397585169-14537-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
                     ` (3 preceding siblings ...)
  2014-04-15 18:05   ` [PATCH 04/15] pcap: Convert to use of PMD_REGISTER_DRIVER and fix linking Neil Horman
@ 2014-04-15 18:05   ` Neil Horman
       [not found]     ` <1397585169-14537-6-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
  2014-04-15 18:06   ` [PATCH 06/15] xenvirt: " Neil Horman
                     ` (10 subsequent siblings)
  15 siblings, 1 reply; 77+ messages in thread
From: Neil Horman @ 2014-04-15 18:05 UTC (permalink / raw)
  To: dev-VfR2kkLFssw

convert the ring driver to use the PMD_REGISTER_DRIVER macro and fix up the
Makefile so that its linkage is only done if we are building static libraries.
This means that the test applications now have no reference to the ring library
when building DSO's and must specify its use on the command line with the -d
option.  Static linking will still initalize the driver automatically.

Note that the ring driver was also written in such a way that it violated some
general layering principles, several functions were contained in the pmd which
were being called by example from the test application in the app/test
directory.  Specifically it was calling eth_ring_pair_attach,
eth_ring_pair_create and rte_eth_ring_devinit, which should only be called
internally to the dpdk core library.  To correct this I've removed those
functions, and instead allowed them to be called indirectly at initalization
time using the vdev command line argument key nodeaction=<name>:<node>:<action>
where action is one of ATTACH or CREATE.  I've tested out the functionality of
the command line with the testpmd utility, with success, and have removed the
called functions from the test utility.  This will affect how the test utility
is invoked (the -d and --vdev option will need to be specified on the command
line now), but honestly, given the way it was coded, I think the testing of the
ring pmd was not the best example of how to code with dpdk to begin with.  I
have also left the two layer violating functions in place, so as not to break
existing applications, but added deprecation warnings to them so that apps can
migrate off them.

Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
---
 app/test/test_pmd_ring.c           |  95 ----------------------------
 lib/librte_pmd_ring/Makefile       |   1 +
 lib/librte_pmd_ring/rte_eth_ring.c | 123 ++++++++++++++++++++++++++++++++++---
 mk/rte.app.mk                      |  14 +++--
 4 files changed, 124 insertions(+), 109 deletions(-)

diff --git a/app/test/test_pmd_ring.c b/app/test/test_pmd_ring.c
index 4d9c2ba..1fe38fa 100644
--- a/app/test/test_pmd_ring.c
+++ b/app/test/test_pmd_ring.c
@@ -42,7 +42,6 @@
 /* two test rings, r1 is used by two ports, r2 just by one */
 static struct rte_ring *r1[2], *r2;
 
-static struct rte_ring *nullring = NULL;
 static struct rte_mempool *mp;
 static uint8_t start_idx; /* will store the port id of the first of our new ports */
 
@@ -59,58 +58,6 @@ static uint8_t start_idx; /* will store the port id of the first of our new port
 #define MBUF_SIZE (2048 + sizeof(struct rte_mbuf) + RTE_PKTMBUF_HEADROOM)
 #define NB_MBUF   512
 
-
-static int
-test_ring_ethdev_create(void)
-{
-	int retval;
-	printf("Testing ring pmd create\n");
-
-	retval = rte_eth_from_rings(NULL, 0, NULL, 0, SOCKET0);
-	if (retval < 0) {
-		printf("Failure, failed to create zero-sized RXTX ring pmd\n");
-		return -1;
-	}
-
-	retval = rte_eth_from_rings(NULL, 0, NULL, 0, RTE_MAX_NUMA_NODES);
-	if (retval >= 0) {
-		printf("Failure, can create ring pmd on socket %d\n", RTE_MAX_NUMA_NODES);
-		return -1;
-	}
-
-	retval = rte_eth_from_rings(NULL, 1, &r2, 1, SOCKET0);
-	if (retval >= 0) {
-		printf("Failure, can create pmd with null rx rings\n");
-		return -1;
-	}
-
-	retval = rte_eth_from_rings(r1, 1, NULL, 1, SOCKET0);
-	if (retval >= 0) {
-		printf("Failure, can create pmd with null tx rings\n");
-		return -1;
-	}
-
-	retval = rte_eth_from_rings(&nullring, 1, r1, 2, SOCKET0);
-	if (retval < 0) {
-		printf("Failure, failed to create TX-only ring pmd\n");
-		return -1;
-	}
-
-	retval = rte_eth_from_rings(r1, 1, &nullring, 1, SOCKET0);
-	if (retval < 0) {
-		printf("Failure, failed to create RX-only ring pmd\n");
-		return -1;
-	}
-
-	retval = rte_eth_from_rings(&r2, 1, &r2, 1, SOCKET0);
-	if (retval < 0) {
-		printf("Failure, failed to create RXTX ring pmd\n");
-		return -1;
-	}
-
-	return 0;
-}
-
 static int
 test_ethdev_configure(void)
 {
@@ -305,26 +252,12 @@ test_stats_reset(void)
 static int 
 test_pmd_ring_init(void)
 {
-	const char * name1 = "R3";
-	const char * name2 = "R4";
-	const char * params_null = NULL;
-	const char * params = "PARAMS";
 	struct rte_eth_stats stats;
 	struct rte_mbuf buf, *pbuf = &buf;
 	struct rte_eth_conf null_conf;
 
 	printf("Testing ring pmd init\n");
 
-	if (rte_pmd_ring_devinit(name1, params_null) < 0) {
-		printf("Testing ring pmd init fail\n");
-		return -1;
-	}
-
-	if (rte_pmd_ring_devinit(name2, params) < 0) {
-		printf("Testing ring pmd init fail\n");
-		return -1;
-	}
-
 	if (RXTX_PORT2 >= RTE_MAX_ETHPORTS) {
 		printf(" TX/RX port exceed max eth ports\n");
 		return -1;
@@ -371,24 +304,16 @@ test_pmd_ring_init(void)
 
 	rte_eth_dev_stop(RXTX_PORT2);
 
-	/* Test init same name pmd ring */
-	rte_pmd_ring_devinit(name1, params_null);
 	return 0;
 }
 
 static int
 test_pmd_ring_pair_create(void)
 {
-	const char * name1 = "_RNG_P0";
 	struct rte_eth_stats stats, stats2;
 	struct rte_mbuf buf, *pbuf = &buf;
 	struct rte_eth_conf null_conf;
 
-	if (rte_eth_ring_pair_create(name1, SOCKET0) < 0) {
-		printf("Create ring pair failed\n");
-		return -1;
-	}
-
 	if ((RXTX_PORT4 >= RTE_MAX_ETHPORTS) || (RXTX_PORT5 >= RTE_MAX_ETHPORTS)) {
 		printf(" TX/RX port exceed max eth ports\n");
 		return -1;
@@ -447,28 +372,16 @@ test_pmd_ring_pair_create(void)
 	rte_eth_dev_stop(RXTX_PORT4);
 	rte_eth_dev_stop(RXTX_PORT5);
 
-	/* Test create same name ring pair */
-	if (rte_eth_ring_pair_create(name1, SOCKET0) == 0) {
-		printf("Create same name ring pair error\n");
-		return -1;
-	}
 	return 0;
 }
 
 static int
 test_pmd_ring_pair_attach(void)
 {
-	const char * name1 = "_RNG_P0";
-	const char * name2 = "_RNG_P1";
 	struct rte_eth_stats stats, stats2;
 	struct rte_mbuf buf, *pbuf = &buf;
 	struct rte_eth_conf null_conf;
 
-	if (rte_eth_ring_pair_attach(name1, SOCKET0) < 0) {
-		printf("Attach ring pair failed\n");
-		return -1;
-	}
-
 	if ((RXTX_PORT4 >= RTE_MAX_ETHPORTS) || (RXTX_PORT5 >= RTE_MAX_ETHPORTS)) {
 		printf(" TX/RX port exceed max eth ports\n");
 		return -1;
@@ -529,11 +442,6 @@ test_pmd_ring_pair_attach(void)
 	rte_eth_dev_stop(RXTX_PORT4);
 	rte_eth_dev_stop(RXTX_PORT5);
 	
-	/* Test attach non-existing ring pair */
-	if (rte_eth_ring_pair_attach(name2, SOCKET0) == 0) {
-		printf("Attach non-existing ring pair error\n");
-		return -1;
-	}
 	return 0;
 }
 
@@ -568,9 +476,6 @@ test_pmd_ring(void)
 		return -1;
 	}
 
-	if (test_ring_ethdev_create() < 0)
-		return -1;
-
 	if (test_ethdev_configure() < 0)
 		return -1;
 
diff --git a/lib/librte_pmd_ring/Makefile b/lib/librte_pmd_ring/Makefile
index 73b2d38..a62f805 100644
--- a/lib/librte_pmd_ring/Makefile
+++ b/lib/librte_pmd_ring/Makefile
@@ -52,5 +52,6 @@ SYMLINK-y-include += rte_eth_ring.h
 # this lib depends upon:
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_RING) += lib/librte_eal lib/librte_ring
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_RING) += lib/librte_mbuf lib/librte_ether
+DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_PCAP) += lib/librte_kvargs
 
 include $(RTE_SDK)/mk/rte.lib.mk
diff --git a/lib/librte_pmd_ring/rte_eth_ring.c b/lib/librte_pmd_ring/rte_eth_ring.c
index cee3fff..266cfc0 100644
--- a/lib/librte_pmd_ring/rte_eth_ring.c
+++ b/lib/librte_pmd_ring/rte_eth_ring.c
@@ -38,6 +38,15 @@
 #include <rte_memcpy.h>
 #include <rte_string_fns.h>
 #include <rte_vdev.h>
+#include <rte_pmd.h>
+#include <rte_kvargs.h>
+
+#define ETH_RING_NUMA_NODE_ACTION_ARG    "nodeaction"
+
+static const char *valid_arguments[] = {
+	ETH_RING_NUMA_NODE_ACTION_ARG,
+	NULL
+};
 
 struct ring_queue {
 	struct rte_ring *rng;
@@ -373,28 +382,127 @@ eth_dev_ring_pair_create(const char *name, const unsigned numa_node,
 int
 rte_eth_ring_pair_create(const char *name, const unsigned numa_node)
 {
+	RTE_LOG(WARNING, PMD, "rte_eth_ring_pair_create is deprecated\n");
 	return eth_dev_ring_pair_create(name, numa_node, DEV_CREATE);
 }
 
 int
 rte_eth_ring_pair_attach(const char *name, const unsigned numa_node)
 {
+	RTE_LOG(WARNING, PMD, "rte_eth_ring_pair_attach is deprecated\n");
 	return eth_dev_ring_pair_create(name, numa_node, DEV_ATTACH);
 }
 
+struct node_action_pair {
+	char name[PATH_MAX];
+	unsigned node;
+	enum dev_action action;
+};
+
+struct node_action_list {
+	unsigned total;
+	unsigned count;
+	struct node_action_pair *list;
+};
+
+static int parse_kvlist (const char *key __rte_unused, const char *value, void *data)
+{
+	struct node_action_list *info = data;
+	int ret;
+	char *name;
+	char *action;
+	char *node;
+
+	name = strdup(value);
+
+	ret = -1;
+
+	if (!name)
+		goto out;
+
+	node = strchr(name, ':');
+	*node = '\0';
+	node++;
+
+	action = strchr(node, ':');
+	*action = '\0';
+	action++;
+
+	/*
+	 * Need to do some sanity checking here
+	 */
+
+	if (strcmp(action, "ATTACH"))
+		if (strcmp(action, "CREATE"))
+			goto out;
+
+	info->list[info->count].node = strtol(node, NULL, 10);
+
+	info->list[info->count].action = strcmp(action, "ATTACH") ? DEV_CREATE : DEV_ATTACH;
+
+	strncpy(info->list[info->count].name, name, PATH_MAX);
+
+	info->count++;
+
+	ret = 0;
+out:
+	free(name);
+	return ret;
+}
+
 int
 rte_pmd_ring_devinit(const char *name, const char *params)
 {
+	struct rte_kvargs *kvlist;
+	int ret = 0;
+	struct node_action_list *info = NULL;
+
 	RTE_LOG(INFO, PMD, "Initializing pmd_ring for %s\n", name);
 
+
 	if (params == NULL || params[0] == '\0')
 		eth_dev_ring_create(name, rte_socket_id(), DEV_CREATE);
 	else {
-		RTE_LOG(INFO, PMD, "Ignoring unsupported parameters when creating"
-				" rings-backed ethernet device\n");
-		eth_dev_ring_create(name, rte_socket_id(), DEV_CREATE);
+		printf("Parsing kvargs\n");
+		kvlist = rte_kvargs_parse(params, valid_arguments);
+
+		if (!kvlist) {
+			RTE_LOG(INFO, PMD, "Ignoring unsupported parameters when creating"
+					" rings-backed ethernet device\n");
+			eth_dev_ring_create(name, rte_socket_id(), DEV_CREATE);
+			return 0;
+		} else {
+			eth_dev_ring_create(name, rte_socket_id(), DEV_CREATE);
+			printf("counting kvargs\n");
+			ret = rte_kvargs_count(kvlist, ETH_RING_NUMA_NODE_ACTION_ARG);
+			info = rte_zmalloc("struct node_action_list", sizeof(struct node_action_list) +
+					   (sizeof(struct node_action_pair) * ret), 0);
+			if (!info)
+				goto out;
+
+			info->total = ret;
+			info->list = (struct node_action_pair*)(info + 1);
+
+			printf("We have %d nodeaction pairs\n", info->total);
+			ret = rte_kvargs_process(kvlist, ETH_RING_NUMA_NODE_ACTION_ARG,
+						 parse_kvlist, info); 
+
+			if (ret < 0)
+				goto out_free;
+
+			for (info->count = 0; info->count < info->total; info->count++) {
+				printf("Doing something with a ring\n");
+				eth_dev_ring_pair_create(name, info->list[info->count].node,
+						    info->list[info->count].action);
+			}
+				
+		}
 	}
-	return 0;
+
+out_free:
+	rte_free(info);
+out:
+	return ret;
 }
 
 static struct rte_vdev_driver pmd_ring_drv = {
@@ -402,9 +510,4 @@ static struct rte_vdev_driver pmd_ring_drv = {
 	.init = rte_pmd_ring_devinit,
 };
 
-__attribute__((constructor))
-static void
-rte_pmd_ring_init(void)
-{
-	rte_eal_vdev_driver_register(&pmd_ring_drv);
-}
+PMD_REGISTER_DRIVER(pmd_ring_drv, PMD_VDEV);
diff --git a/mk/rte.app.mk b/mk/rte.app.mk
index e6d09b8..4f167aa 100644
--- a/mk/rte.app.mk
+++ b/mk/rte.app.mk
@@ -133,10 +133,6 @@ ifeq ($(CONFIG_RTE_LIBRTE_ETHER),y)
 LDLIBS += -lethdev
 endif
 
-ifeq ($(CONFIG_RTE_LIBRTE_PMD_RING),y)
-LDLIBS += -lrte_pmd_ring
-endif
-
 ifeq ($(CONFIG_RTE_LIBRTE_MALLOC),y)
 LDLIBS += -lrte_malloc
 endif
@@ -173,9 +169,19 @@ LDLIBS += -lrte_cmdline
 endif
 
 ifeq ($(RTE_BUILD_SHARED_LIB),n)
+
+ifeq ($(CONFIG_RTE_LIBRTE_PMD_RING),y)
+LDLIBS += -lrte_pmd_ring
+endif
+
+ifeq ($(CONFIG_RTE_LIBRTE_PMD_RING),y)
+LDLIBS += -lrte_pmd_ring
+endif
+
 ifeq ($(CONFIG_RTE_LIBRTE_PMD_PCAP),y)
 LDLIBS += -lrte_pmd_pcap -lpcap
 endif
+
 endif
 
 LDLIBS += $(EXECENV_LDLIBS)
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 77+ messages in thread

* [PATCH 06/15] xenvirt: Convert to use of PMD_REGISTER_DRIVER and fix linking
       [not found] ` <1397585169-14537-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
                     ` (4 preceding siblings ...)
  2014-04-15 18:05   ` [PATCH 05/15] ring: " Neil Horman
@ 2014-04-15 18:06   ` Neil Horman
  2014-04-15 18:06   ` [PATCH 07/15] eal: Make vdev init path generic for both virtual and physcial devices Neil Horman
                     ` (9 subsequent siblings)
  15 siblings, 0 replies; 77+ messages in thread
From: Neil Horman @ 2014-04-15 18:06 UTC (permalink / raw)
  To: dev-VfR2kkLFssw

convert the xenvirt driver to use the PMD_REGISTER_DRIVER macro.
This means that the test applications now have no reference to the xenvirt library
when building DSO's and must specify its use on the command line with the -d
option.  Static linking will still initalize the driver automatically.

A few notes:

xenvirt was unbuildable as of commit 4c39baf297d10c217e7d3e7370f26a1fede58308..
That commit neglected to include the rte_vdev.h header, so several structs were
left undefined.  This patch includes a fix for that as well.

Also, The linkage for xenvirt is broken in much the same way pmd_ring was, in
that the xenvirt pmd has a function that is called directly from applications
(the example being the testpmd application).  The function is
rte_mempool_gntalloc_create, and should clearly be moved into the rte_mempool
library, with the supporting code in the function implementation moved to a new
xenvirt library separate from the pmd.  This is a large undertaking that
detracts from the purpose of this series however, and so for now, I'm leaving
the linkage to the application in place, and will address this issue in a later
series

Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
---
 lib/librte_pmd_xenvirt/rte_eth_xenvirt.c | 9 +++------
 mk/rte.app.mk                            | 7 +++----
 2 files changed, 6 insertions(+), 10 deletions(-)

diff --git a/lib/librte_pmd_xenvirt/rte_eth_xenvirt.c b/lib/librte_pmd_xenvirt/rte_eth_xenvirt.c
index 533aa76..df19d07 100644
--- a/lib/librte_pmd_xenvirt/rte_eth_xenvirt.c
+++ b/lib/librte_pmd_xenvirt/rte_eth_xenvirt.c
@@ -53,6 +53,8 @@
 #include <rte_malloc.h>
 #include <rte_memcpy.h>
 #include <rte_string_fns.h>
+#include <rte_vdev.h>
+#include <rte_pmd.h>
 #include <cmdline_parse.h>
 #include <cmdline_parse_etheraddr.h>
 
@@ -710,9 +712,4 @@ static struct rte_vdev_driver pmd_xenvirt_drv = {
 	.init = rte_pmd_xenvirt_devinit,
 };
 
-__attribute__((constructor))
-static void
-rte_pmd_xenvirt_init(void)
-{
-	rte_eal_vdev_driver_register(&pmd_xenvirt_drv);
-}
+PMD_REGISTER_DRIVER(pmd_xenvirt_drv, PMD_VDEV);
diff --git a/mk/rte.app.mk b/mk/rte.app.mk
index 4f167aa..e77bf39 100644
--- a/mk/rte.app.mk
+++ b/mk/rte.app.mk
@@ -158,16 +158,15 @@ ifeq ($(CONFIG_RTE_LIBRTE_EAL),y)
 LDLIBS += -lrte_eal
 endif
 
+ifeq ($(CONFIG_RTE_LIBRTE_CMDLINE),y)
+LDLIBS += -lrte_cmdline
+endif
 
 ifeq ($(CONFIG_RTE_LIBRTE_PMD_XENVIRT),y)
 LDLIBS += -lrte_pmd_xenvirt
 LDLIBS += -lxenstore
 endif
 
-ifeq ($(CONFIG_RTE_LIBRTE_CMDLINE),y)
-LDLIBS += -lrte_cmdline
-endif
-
 ifeq ($(RTE_BUILD_SHARED_LIB),n)
 
 ifeq ($(CONFIG_RTE_LIBRTE_PMD_RING),y)
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 77+ messages in thread

* [PATCH 07/15] eal: Make vdev init path generic for both virtual and physcial devices
       [not found] ` <1397585169-14537-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
                     ` (5 preceding siblings ...)
  2014-04-15 18:06   ` [PATCH 06/15] xenvirt: " Neil Horman
@ 2014-04-15 18:06   ` Neil Horman
       [not found]     ` <1397585169-14537-8-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
  2014-04-15 18:06   ` [PATCH 08/15] igb: Convert to use of PMD_REGISTER_DRIVER and fix linking Neil Horman
                     ` (8 subsequent siblings)
  15 siblings, 1 reply; 77+ messages in thread
From: Neil Horman @ 2014-04-15 18:06 UTC (permalink / raw)
  To: dev-VfR2kkLFssw

Currently, physical device pmds use a separate initalization path
(rte_pmd_init_all) while virtual devices use a constructor registration and
rte_eal_dev_init.  Theres no reason to have them be separate.  This patch
removes the vdev specific nomenclature from the vdev init path and makes it more
generic for use with all pmds.  This is the first step in converting the
physical device pmds to using the same constructor based registration path that
the virtual devices use

Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
---
 lib/librte_eal/bsdapp/eal/Makefile          |   2 +-
 lib/librte_eal/bsdapp/eal/eal.c             |   2 +-
 lib/librte_eal/common/Makefile              |   2 +-
 lib/librte_eal/common/eal_common_dev.c      | 108 ++++++++++++++++++++++++++++
 lib/librte_eal/common/eal_common_vdev.c     |  97 -------------------------
 lib/librte_eal/common/include/eal_private.h |   2 +-
 lib/librte_eal/common/include/rte_dev.h     | 104 +++++++++++++++++++++++++++
 lib/librte_eal/common/include/rte_pmd.h     |  16 +----
 lib/librte_eal/common/include/rte_vdev.h    |  90 -----------------------
 lib/librte_eal/linuxapp/eal/Makefile        |   2 +-
 lib/librte_eal/linuxapp/eal/eal.c           |   2 +-
 lib/librte_pmd_pcap/rte_eth_pcap.c          |   7 +-
 lib/librte_pmd_ring/rte_eth_ring.c          |   7 +-
 lib/librte_pmd_xenvirt/rte_eth_xenvirt.c    |   7 +-
 14 files changed, 233 insertions(+), 215 deletions(-)
 create mode 100644 lib/librte_eal/common/eal_common_dev.c
 delete mode 100644 lib/librte_eal/common/eal_common_vdev.c
 create mode 100644 lib/librte_eal/common/include/rte_dev.h
 delete mode 100644 lib/librte_eal/common/include/rte_vdev.h

diff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile
index 4c2a4f1..abf1ad2 100644
--- a/lib/librte_eal/bsdapp/eal/Makefile
+++ b/lib/librte_eal/bsdapp/eal/Makefile
@@ -69,7 +69,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_common_errno.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_common_cpuflags.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_common_hexdump.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_common_whitelist.c
-SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_common_vdev.c
+SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_common_dev.c
 
 CFLAGS_eal.o := -D_GNU_SOURCE
 #CFLAGS_eal_thread.o := -D_GNU_SOURCE
diff --git a/lib/librte_eal/bsdapp/eal/eal.c b/lib/librte_eal/bsdapp/eal/eal.c
index e944aba..4f5baef 100644
--- a/lib/librte_eal/bsdapp/eal/eal.c
+++ b/lib/librte_eal/bsdapp/eal/eal.c
@@ -854,7 +854,7 @@ rte_eal_init(int argc, char **argv)
 
 	rte_eal_mcfg_complete();
 
-	if (rte_eal_vdev_init() < 0)
+	if (rte_eal_dev_init() < 0)
 		rte_panic("Cannot init virtual devices\n");
 
 	RTE_LCORE_FOREACH_SLAVE(i) {
diff --git a/lib/librte_eal/common/Makefile b/lib/librte_eal/common/Makefile
index b918a73..9b6ea78 100644
--- a/lib/librte_eal/common/Makefile
+++ b/lib/librte_eal/common/Makefile
@@ -38,7 +38,7 @@ INC += rte_pci_dev_ids.h rte_per_lcore.h rte_prefetch.h rte_random.h
 INC += rte_rwlock.h rte_spinlock.h rte_tailq.h rte_interrupts.h rte_alarm.h
 INC += rte_string_fns.h rte_cpuflags.h rte_version.h rte_tailq_elem.h
 INC += rte_eal_memconfig.h rte_malloc_heap.h rte_pmd.h
-INC += rte_hexdump.h rte_devargs.h rte_vdev.h
+INC += rte_hexdump.h rte_devargs.h rte_dev.h
 
 ifeq ($(CONFIG_RTE_INSECURE_FUNCTION_WARNING),y)
 INC += rte_warnings.h
diff --git a/lib/librte_eal/common/eal_common_dev.c b/lib/librte_eal/common/eal_common_dev.c
new file mode 100644
index 0000000..8b0cfa4
--- /dev/null
+++ b/lib/librte_eal/common/eal_common_dev.c
@@ -0,0 +1,108 @@
+/*-
+ *   BSD LICENSE
+ * 
+ *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
+ *   Copyright(c) 2014 6WIND S.A.
+ *   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 <string.h>
+#include <inttypes.h>
+#include <sys/queue.h>
+
+#include <rte_dev.h>
+#include <rte_devargs.h>
+#include <rte_debug.h>
+#include <rte_devargs.h>
+
+#include "eal_private.h"
+
+/** Global list of virtual device drivers. */
+static struct rte_driver_list dev_driver_list =
+	TAILQ_HEAD_INITIALIZER(dev_driver_list);
+
+/* register a driver */
+void
+rte_eal_driver_register(struct rte_driver *driver)
+{
+	TAILQ_INSERT_TAIL(&dev_driver_list, driver, next);
+}
+
+/* unregister a driver */
+void
+rte_eal_driver_unregister(struct rte_driver *driver)
+{
+	TAILQ_REMOVE(&dev_driver_list, driver, next);
+}
+
+int
+rte_eal_dev_init(void)
+{
+	struct rte_devargs *devargs;
+	struct rte_driver *driver;
+
+	/* No need to register drivers that are embeded in DPDK
+	 * (pmd_pcap, pmd_ring, ...). The initialization function have
+	 * the ((constructor)) attribute so they will register at
+	 * startup. */
+
+	/* call the init function for each virtual device */
+	TAILQ_FOREACH(devargs, &devargs_list, next) {
+
+		if (devargs->type != RTE_DEVTYPE_VIRTUAL)
+			continue;
+
+		TAILQ_FOREACH(driver, &dev_driver_list, next) {
+			if (driver->type != PMD_VDEV)
+				continue;
+
+			/* search a driver prefix in virtual device name */
+			if (!strncmp(driver->name, devargs->virtual.drv_name,
+					strlen(driver->name))) {
+				driver->init(devargs->virtual.drv_name,
+					devargs->args);
+				break;
+			}
+		}
+
+		if (driver == NULL) {
+			rte_panic("no driver found for %s\n",
+				  devargs->virtual.drv_name);
+		}
+	}
+
+	/* Once the vdevs are initalized, start calling all the pdev drivers */
+	TAILQ_FOREACH(driver, &dev_driver_list, next) {
+		if (driver->type != PMD_PDEV)
+			continue;
+		/* PDEV drivers don't get passed any parameters */
+		driver->init(NULL, NULL);
+	}
+	return 0;
+}
diff --git a/lib/librte_eal/common/eal_common_vdev.c b/lib/librte_eal/common/eal_common_vdev.c
deleted file mode 100644
index 62d0302..0000000
--- a/lib/librte_eal/common/eal_common_vdev.c
+++ /dev/null
@@ -1,97 +0,0 @@
-/*-
- *   BSD LICENSE
- * 
- *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
- *   Copyright(c) 2014 6WIND S.A.
- *   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 <string.h>
-#include <inttypes.h>
-#include <sys/queue.h>
-
-#include <rte_vdev.h>
-#include <rte_devargs.h>
-#include <rte_debug.h>
-#include <rte_devargs.h>
-
-#include "eal_private.h"
-
-/** Global list of virtual device drivers. */
-static struct rte_vdev_driver_list vdev_driver_list =
-	TAILQ_HEAD_INITIALIZER(vdev_driver_list);
-
-/* register a driver */
-void
-rte_eal_vdev_driver_register(struct rte_vdev_driver *driver)
-{
-	TAILQ_INSERT_TAIL(&vdev_driver_list, driver, next);
-}
-
-/* unregister a driver */
-void
-rte_eal_vdev_driver_unregister(struct rte_vdev_driver *driver)
-{
-	TAILQ_REMOVE(&vdev_driver_list, driver, next);
-}
-
-int
-rte_eal_vdev_init(void)
-{
-	struct rte_devargs *devargs;
-	struct rte_vdev_driver *driver;
-
-	/* No need to register drivers that are embeded in DPDK
-	 * (pmd_pcap, pmd_ring, ...). The initialization function have
-	 * the ((constructor)) attribute so they will register at
-	 * startup. */
-
-	/* call the init function for each virtual device */
-	TAILQ_FOREACH(devargs, &devargs_list, next) {
-
-		if (devargs->type != RTE_DEVTYPE_VIRTUAL)
-			continue;
-
-		TAILQ_FOREACH(driver, &vdev_driver_list, next) {
-			/* search a driver prefix in virtual device name */
-			if (!strncmp(driver->name, devargs->virtual.drv_name,
-					strlen(driver->name))) {
-				driver->init(devargs->virtual.drv_name,
-					devargs->args);
-				break;
-			}
-		}
-
-		if (driver == NULL) {
-			rte_panic("no driver found for %s\n",
-				  devargs->virtual.drv_name);
-		}
-	}
-	return 0;
-}
diff --git a/lib/librte_eal/common/include/eal_private.h b/lib/librte_eal/common/include/eal_private.h
index 22d8b08..b99ad23 100644
--- a/lib/librte_eal/common/include/eal_private.h
+++ b/lib/librte_eal/common/include/eal_private.h
@@ -201,6 +201,6 @@ int rte_eal_alarm_init(void);
  *
  * This function is private to the EAL.
  */
-int rte_eal_vdev_init(void);
+int rte_eal_dev_init(void);
 
 #endif /* _EAL_PRIVATE_H_ */
diff --git a/lib/librte_eal/common/include/rte_dev.h b/lib/librte_eal/common/include/rte_dev.h
new file mode 100644
index 0000000..5f982c7
--- /dev/null
+++ b/lib/librte_eal/common/include/rte_dev.h
@@ -0,0 +1,104 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2014 6WIND S.A.
+ *   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 6WIND S.A. 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.
+ */
+
+#ifndef _RTE_VDEV_H_
+#define _RTE_VDEV_H_
+
+/**
+ * @file
+ *
+ * RTE Virtual Devices Interface
+ *
+ * This file manages the list of the virtual device drivers.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <sys/queue.h>
+
+/** Double linked list of virtual device drivers. */
+TAILQ_HEAD(rte_driver_list, rte_driver);
+
+/**
+ * Initialization function called for each virtual device probing.
+ */
+typedef int (rte_dev_init_t)(const char *name, const char *args);
+
+/**
+ * Driver type enumeration
+ */
+enum pmd_type {
+	PMD_VDEV = 0,
+	PMD_PDEV = 1,
+};
+
+/**
+ * A structure describing a virtual device driver.
+ */
+struct rte_driver {
+	TAILQ_ENTRY(rte_driver) next;  /**< Next in list. */
+	enum pmd_type type;		   /**< PMD Driver type */
+	const char *name;                   /**< Driver name. */
+	rte_dev_init_t *init;              /**< Device init. function. */
+};
+
+/**
+ * Register a virtual device driver.
+ *
+ * @param driver
+ *   A pointer to a rte_dev structure describing the driver
+ *   to be registered.
+ */
+void rte_eal_driver_register(struct rte_driver *driver);
+
+/**
+ * Unregister a virtual device driver.
+ *
+ * @param driver
+ *   A pointer to a rte_dev structure describing the driver
+ *   to be unregistered.
+ */
+void rte_eal_driver_unregister(struct rte_driver *driver);
+
+/**
+ * Initalize all the registered drivers in this process
+ */
+int rte_eal_dev_init(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RTE_VDEV_H_ */
diff --git a/lib/librte_eal/common/include/rte_pmd.h b/lib/librte_eal/common/include/rte_pmd.h
index b37fa28..8a76dcf 100644
--- a/lib/librte_eal/common/include/rte_pmd.h
+++ b/lib/librte_eal/common/include/rte_pmd.h
@@ -43,23 +43,13 @@
 #ifdef __cplusplus
 extern "C" {
 #endif
+#include <rte_dev.h>
 
-enum rte_pmd_driver_type {
-	PMD_VDEV = 1
-};
-
-extern void rte_eal_nonpci_dev_init_register(const char *name, int (*dev_initfn)(const char *, const char *));
-#define PMD_REGISTER_DRIVER(d, t)\
+#define PMD_REGISTER_DRIVER(d)\
 void devinitfn_ ##d(void);\
 void __attribute__((constructor, used)) devinitfn_ ##d(void)\
 {\
-	enum rte_pmd_driver_type _t = (t);\
-	switch(_t)\
-	{\
-		case PMD_VDEV:\
-			rte_eal_vdev_driver_register(&d);\
-			break;\
-	};\
+		rte_eal_driver_register(&d);\
 }
 
 #ifdef __cplusplus
diff --git a/lib/librte_eal/common/include/rte_vdev.h b/lib/librte_eal/common/include/rte_vdev.h
deleted file mode 100644
index 48f71b7..0000000
--- a/lib/librte_eal/common/include/rte_vdev.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/*-
- *   BSD LICENSE
- *
- *   Copyright(c) 2014 6WIND S.A.
- *   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 6WIND S.A. 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.
- */
-
-#ifndef _RTE_VDEV_H_
-#define _RTE_VDEV_H_
-
-/**
- * @file
- *
- * RTE Virtual Devices Interface
- *
- * This file manages the list of the virtual device drivers.
- */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <sys/queue.h>
-
-/** Double linked list of virtual device drivers. */
-TAILQ_HEAD(rte_vdev_driver_list, rte_vdev_driver);
-
-/**
- * Initialization function called for each virtual device probing.
- */
-typedef int (rte_vdev_init_t)(const char *name, const char *args);
-
-/**
- * A structure describing a virtual device driver.
- */
-struct rte_vdev_driver {
-	TAILQ_ENTRY(rte_vdev_driver) next;  /**< Next in list. */
-	const char *name;                   /**< Driver name. */
-	rte_vdev_init_t *init;              /**< Device init. function. */
-};
-
-/**
- * Register a virtual device driver.
- *
- * @param driver
- *   A pointer to a rte_vdev structure describing the driver
- *   to be registered.
- */
-void rte_eal_vdev_driver_register(struct rte_vdev_driver *driver);
-
-/**
- * Unregister a virtual device driver.
- *
- * @param driver
- *   A pointer to a rte_vdev structure describing the driver
- *   to be unregistered.
- */
-void rte_eal_vdev_driver_unregister(struct rte_vdev_driver *driver);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _RTE_VDEV_H_ */
diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
index 00f7367..e800e60 100644
--- a/lib/librte_eal/linuxapp/eal/Makefile
+++ b/lib/librte_eal/linuxapp/eal/Makefile
@@ -77,7 +77,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_errno.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_cpuflags.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_hexdump.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_devargs.c
-SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_vdev.c
+SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_dev.c
 
 CFLAGS_eal.o := -D_GNU_SOURCE
 CFLAGS_eal_thread.o := -D_GNU_SOURCE
diff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c
index 3ded563..49f7596 100644
--- a/lib/librte_eal/linuxapp/eal/eal.c
+++ b/lib/librte_eal/linuxapp/eal/eal.c
@@ -1059,7 +1059,7 @@ rte_eal_init(int argc, char **argv)
 			RTE_LOG(WARNING, EAL, "%s\n", dlerror());
 	}
 
-	if (rte_eal_vdev_init() < 0)
+	if (rte_eal_dev_init() < 0)
 		rte_panic("Cannot init virtual devices\n");
 
 	RTE_LOG(DEBUG, EAL, "Master core %u is ready (tid=%x)\n",
diff --git a/lib/librte_pmd_pcap/rte_eth_pcap.c b/lib/librte_pmd_pcap/rte_eth_pcap.c
index 4167a26..fa5c8aa 100644
--- a/lib/librte_pmd_pcap/rte_eth_pcap.c
+++ b/lib/librte_pmd_pcap/rte_eth_pcap.c
@@ -40,7 +40,7 @@
 #include <rte_string_fns.h>
 #include <rte_cycles.h>
 #include <rte_kvargs.h>
-#include <rte_vdev.h>
+#include <rte_dev.h>
 #include <rte_pmd.h>
 
 #include <net/if.h>
@@ -768,9 +768,10 @@ rte_pmd_pcap_devinit(const char *name, const char *params)
 
 }
 
-static struct rte_vdev_driver pmd_pcap_drv = {
+static struct rte_driver pmd_pcap_drv = {
 	.name = "eth_pcap",
+	.type = PMD_VDEV,
 	.init = rte_pmd_pcap_devinit,
 };
 
-PMD_REGISTER_DRIVER(pmd_pcap_drv, PMD_VDEV);
+PMD_REGISTER_DRIVER(pmd_pcap_drv);
diff --git a/lib/librte_pmd_ring/rte_eth_ring.c b/lib/librte_pmd_ring/rte_eth_ring.c
index 266cfc0..c918141 100644
--- a/lib/librte_pmd_ring/rte_eth_ring.c
+++ b/lib/librte_pmd_ring/rte_eth_ring.c
@@ -37,7 +37,7 @@
 #include <rte_malloc.h>
 #include <rte_memcpy.h>
 #include <rte_string_fns.h>
-#include <rte_vdev.h>
+#include <rte_dev.h>
 #include <rte_pmd.h>
 #include <rte_kvargs.h>
 
@@ -505,9 +505,10 @@ out:
 	return ret;
 }
 
-static struct rte_vdev_driver pmd_ring_drv = {
+static struct rte_driver pmd_ring_drv = {
 	.name = "eth_ring",
+	.type = PMD_VDEV,
 	.init = rte_pmd_ring_devinit,
 };
 
-PMD_REGISTER_DRIVER(pmd_ring_drv, PMD_VDEV);
+PMD_REGISTER_DRIVER(pmd_ring_drv);
diff --git a/lib/librte_pmd_xenvirt/rte_eth_xenvirt.c b/lib/librte_pmd_xenvirt/rte_eth_xenvirt.c
index df19d07..4392a9e 100644
--- a/lib/librte_pmd_xenvirt/rte_eth_xenvirt.c
+++ b/lib/librte_pmd_xenvirt/rte_eth_xenvirt.c
@@ -53,7 +53,7 @@
 #include <rte_malloc.h>
 #include <rte_memcpy.h>
 #include <rte_string_fns.h>
-#include <rte_vdev.h>
+#include <rte_dev.h>
 #include <rte_pmd.h>
 #include <cmdline_parse.h>
 #include <cmdline_parse_etheraddr.h>
@@ -707,9 +707,10 @@ rte_pmd_xenvirt_devinit(const char *name, const char *params)
 	return 0;
 }
 
-static struct rte_vdev_driver pmd_xenvirt_drv = {
+static struct rte_driver pmd_xenvirt_drv = {
 	.name = "eth_xenvirt",
+	.type = PMD_VDEV,
 	.init = rte_pmd_xenvirt_devinit,
 };
 
-PMD_REGISTER_DRIVER(pmd_xenvirt_drv, PMD_VDEV);
+PMD_REGISTER_DRIVER(pmd_xenvirt_drv);
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 77+ messages in thread

* [PATCH 08/15] igb: Convert to use of PMD_REGISTER_DRIVER and fix linking
       [not found] ` <1397585169-14537-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
                     ` (6 preceding siblings ...)
  2014-04-15 18:06   ` [PATCH 07/15] eal: Make vdev init path generic for both virtual and physcial devices Neil Horman
@ 2014-04-15 18:06   ` Neil Horman
  2014-04-15 18:06   ` [PATCH 09/15] igbvf: " Neil Horman
                     ` (7 subsequent siblings)
  15 siblings, 0 replies; 77+ messages in thread
From: Neil Horman @ 2014-04-15 18:06 UTC (permalink / raw)
  To: dev-VfR2kkLFssw

convert the igb pmd driver to use the PMD_REGISTER_DRIVER macro.
This means that the test applications now have no reference to the igb library
when building DSO's and must specify its use on the command line with the -d
option.  Static linking will still initalize the driver automatically.

Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
---
 examples/dpdk_qat/main.c          |  4 ----
 lib/librte_ether/rte_ethdev.h     | 13 -------------
 lib/librte_pmd_e1000/igb_ethdev.c | 13 +++++++++++--
 3 files changed, 11 insertions(+), 19 deletions(-)

diff --git a/examples/dpdk_qat/main.c b/examples/dpdk_qat/main.c
index cdf6832..64cb610 100644
--- a/examples/dpdk_qat/main.c
+++ b/examples/dpdk_qat/main.c
@@ -697,10 +697,6 @@ MAIN(int argc, char **argv)
 		return -1;
 
 	/* init driver */
-#ifdef RTE_LIBRTE_IGB_PMD
-	if (rte_igb_pmd_init() < 0)
-		rte_panic("Cannot init igb pmd\n");
-#endif
 #ifdef RTE_LIBRTE_IXGBE_PMD
 	if (rte_ixgbe_pmd_init() < 0)
 		rte_panic("Cannot init ixgbe pmd\n");
diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index dea7471..e50ed48 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -1317,15 +1317,6 @@ extern void rte_eth_driver_register(struct eth_driver *eth_drv);
 
 /**
  * The initialization function of the driver for
- * Intel(r) IGB Gigabit Ethernet Controller devices.
- * This function is invoked once at EAL start time.
- * @return
- *   0 on success
- */
-extern int rte_igb_pmd_init(void);
-
-/**
- * The initialization function of the driver for
  * Intel(r) EM Gigabit Ethernet Controller devices.
  * This function is invoked once at EAL start time.
  * @return
@@ -1402,10 +1393,6 @@ int rte_pmd_init_all(void)
 	int ret = -ENODEV;
 
 #ifdef RTE_LIBRTE_IGB_PMD
-	if ((ret = rte_igb_pmd_init()) != 0) {
-		RTE_LOG(ERR, PMD, "Cannot init igb PMD\n");
-		return (ret);
-	}
 	if ((ret = rte_igbvf_pmd_init()) != 0) {
 		RTE_LOG(ERR, PMD, "Cannot init igbvf PMD\n");
 		return (ret);
diff --git a/lib/librte_pmd_e1000/igb_ethdev.c b/lib/librte_pmd_e1000/igb_ethdev.c
index 673b4de..246474d 100644
--- a/lib/librte_pmd_e1000/igb_ethdev.c
+++ b/lib/librte_pmd_e1000/igb_ethdev.c
@@ -51,6 +51,8 @@
 #include <rte_eal.h>
 #include <rte_atomic.h>
 #include <rte_malloc.h>
+#include <rte_dev.h>
+#include <rte_pmd.h>
 
 #include "e1000_logs.h"
 #include "e1000/e1000_api.h"
@@ -619,8 +621,8 @@ static struct eth_driver rte_igbvf_pmd = {
 	.dev_private_size = sizeof(struct e1000_adapter),
 };
 
-int
-rte_igb_pmd_init(void)
+static int
+rte_igb_pmd_init(const char *name __rte_unused, const char *params __rte_unused)
 {
 	rte_eth_driver_register(&rte_igb_pmd);
 	return 0;
@@ -2182,3 +2184,10 @@ eth_igb_rss_reta_query(struct rte_eth_dev *dev,
  
 	return 0;
 }
+
+static struct rte_driver pmd_igb_drv = {
+        .type = PMD_PDEV,
+	.init = rte_igb_pmd_init,
+};
+
+PMD_REGISTER_DRIVER(pmd_igb_drv);
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 77+ messages in thread

* [PATCH 09/15] igbvf: Convert to use of PMD_REGISTER_DRIVER and fix linking
       [not found] ` <1397585169-14537-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
                     ` (7 preceding siblings ...)
  2014-04-15 18:06   ` [PATCH 08/15] igb: Convert to use of PMD_REGISTER_DRIVER and fix linking Neil Horman
@ 2014-04-15 18:06   ` Neil Horman
  2014-04-15 18:06   ` [PATCH 10/15] e1000: " Neil Horman
                     ` (6 subsequent siblings)
  15 siblings, 0 replies; 77+ messages in thread
From: Neil Horman @ 2014-04-15 18:06 UTC (permalink / raw)
  To: dev-VfR2kkLFssw

convert the igbvf pmd driver to use the PMD_REGISTER_DRIVER macro.
This means that the test applications now have no reference to the igbvf library
when building DSO's and must specify its use on the command line with the -d
option.  Static linking will still initalize the driver automatically.

Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
---
 lib/librte_ether/rte_ethdev.h     | 16 ----------------
 lib/librte_pmd_e1000/igb_ethdev.c | 10 ++++++++--
 2 files changed, 8 insertions(+), 18 deletions(-)

diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index e50ed48..d13cc4f 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -1325,15 +1325,6 @@ extern void rte_eth_driver_register(struct eth_driver *eth_drv);
 extern int rte_em_pmd_init(void);
 
 /**
- * The initialization function of the driver for 1Gbps Intel IGB_VF
- * Ethernet devices.
- * Invoked once at EAL start time.
- * @return
- *   0 on success
- */
-extern int rte_igbvf_pmd_init(void);
-
-/**
  * The initialization function of the driver for 10Gbps Intel IXGBE
  * Ethernet devices.
  * Invoked once at EAL start time.
@@ -1392,13 +1383,6 @@ int rte_pmd_init_all(void)
 {
 	int ret = -ENODEV;
 
-#ifdef RTE_LIBRTE_IGB_PMD
-	if ((ret = rte_igbvf_pmd_init()) != 0) {
-		RTE_LOG(ERR, PMD, "Cannot init igbvf PMD\n");
-		return (ret);
-	}
-#endif /* RTE_LIBRTE_IGB_PMD */
-
 #ifdef RTE_LIBRTE_EM_PMD
 	if ((ret = rte_em_pmd_init()) != 0) {
 		RTE_LOG(ERR, PMD, "Cannot init em PMD\n");
diff --git a/lib/librte_pmd_e1000/igb_ethdev.c b/lib/librte_pmd_e1000/igb_ethdev.c
index 246474d..5cf14c2 100644
--- a/lib/librte_pmd_e1000/igb_ethdev.c
+++ b/lib/librte_pmd_e1000/igb_ethdev.c
@@ -644,8 +644,8 @@ igb_vmdq_vlan_hw_filter_enable(struct rte_eth_dev *dev)
  * Invoked one at EAL init time.
  * Register itself as the [Virtual Poll Mode] Driver of PCI IGB devices.
  */
-int
-rte_igbvf_pmd_init(void)
+static int
+rte_igbvf_pmd_init(const char *name __rte_unused, const char *params __rte_unused)
 {
 	DEBUGFUNC("rte_igbvf_pmd_init");
 
@@ -2190,4 +2190,10 @@ static struct rte_driver pmd_igb_drv = {
 	.init = rte_igb_pmd_init,
 };
 
+static struct rte_driver pmd_igbvf_drv = {
+	.type = PMD_PDEV,
+	.init = rte_igbvf_pmd_init,
+};
+
 PMD_REGISTER_DRIVER(pmd_igb_drv);
+PMD_REGISTER_DRIVER(pmd_igbvf_drv);
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 77+ messages in thread

* [PATCH 10/15] e1000: Convert to use of PMD_REGISTER_DRIVER and fix linking
       [not found] ` <1397585169-14537-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
                     ` (8 preceding siblings ...)
  2014-04-15 18:06   ` [PATCH 09/15] igbvf: " Neil Horman
@ 2014-04-15 18:06   ` Neil Horman
  2014-04-15 18:06   ` [PATCH 11/15] ixgbe: " Neil Horman
                     ` (5 subsequent siblings)
  15 siblings, 0 replies; 77+ messages in thread
From: Neil Horman @ 2014-04-15 18:06 UTC (permalink / raw)
  To: dev-VfR2kkLFssw

convert the e1000 pmd driver to use the PMD_REGISTER_DRIVER macro.
This means that the test applications now have no reference to the e1000 library
when building DSO's and must specify its use on the command line with the -d
option.  Static linking will still initalize the driver automatically.

Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
---
 lib/librte_ether/rte_ethdev.h    | 16 ----------------
 lib/librte_pmd_e1000/em_ethdev.c | 13 +++++++++++--
 mk/rte.app.mk                    |  8 ++++----
 3 files changed, 15 insertions(+), 22 deletions(-)

diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index d13cc4f..9e32f56 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -1316,15 +1316,6 @@ struct eth_driver {
 extern void rte_eth_driver_register(struct eth_driver *eth_drv);
 
 /**
- * The initialization function of the driver for
- * Intel(r) EM Gigabit Ethernet Controller devices.
- * This function is invoked once at EAL start time.
- * @return
- *   0 on success
- */
-extern int rte_em_pmd_init(void);
-
-/**
  * The initialization function of the driver for 10Gbps Intel IXGBE
  * Ethernet devices.
  * Invoked once at EAL start time.
@@ -1383,13 +1374,6 @@ int rte_pmd_init_all(void)
 {
 	int ret = -ENODEV;
 
-#ifdef RTE_LIBRTE_EM_PMD
-	if ((ret = rte_em_pmd_init()) != 0) {
-		RTE_LOG(ERR, PMD, "Cannot init em PMD\n");
-		return (ret);
-	}
-#endif /* RTE_LIBRTE_EM_PMD */
-
 #ifdef RTE_LIBRTE_IXGBE_PMD
 	if ((ret = rte_ixgbe_pmd_init()) != 0) {
 		RTE_LOG(ERR, PMD, "Cannot init ixgbe PMD\n");
diff --git a/lib/librte_pmd_e1000/em_ethdev.c b/lib/librte_pmd_e1000/em_ethdev.c
index d8c9a9b..858aa7c 100644
--- a/lib/librte_pmd_e1000/em_ethdev.c
+++ b/lib/librte_pmd_e1000/em_ethdev.c
@@ -51,6 +51,8 @@
 #include <rte_eal.h>
 #include <rte_atomic.h>
 #include <rte_malloc.h>
+#include <rte_dev.h>
+#include <rte_pmd.h>
 
 #include "e1000_logs.h"
 #include "e1000/e1000_api.h"
@@ -285,8 +287,8 @@ static struct eth_driver rte_em_pmd = {
 	.dev_private_size = sizeof(struct e1000_adapter),
 };
 
-int
-rte_em_pmd_init(void)
+static int
+rte_em_pmd_init(const char *name __rte_unused, const char *params __rte_unused)
 {
 	rte_eth_driver_register(&rte_em_pmd);
 	return 0;
@@ -1433,3 +1435,10 @@ eth_em_rar_clear(struct rte_eth_dev *dev, uint32_t index)
 
 	e1000_rar_set(hw, addr, index);
 }
+
+struct rte_driver em_pmd_drv = {
+	.type = PMD_PDEV,
+	.init = rte_em_pmd_init,
+};
+
+PMD_REGISTER_DRIVER(em_pmd_drv);
diff --git a/mk/rte.app.mk b/mk/rte.app.mk
index e77bf39..f5f137c 100644
--- a/mk/rte.app.mk
+++ b/mk/rte.app.mk
@@ -73,10 +73,6 @@ LDLIBS += -lrte_ivshmem
 endif
 endif
 
-ifeq ($(CONFIG_RTE_LIBRTE_E1000_PMD),y)
-LDLIBS += -lrte_pmd_e1000
-endif
-
 ifeq ($(CONFIG_RTE_LIBRTE_IXGBE_PMD),y)
 LDLIBS += -lrte_pmd_ixgbe
 endif
@@ -169,6 +165,10 @@ endif
 
 ifeq ($(RTE_BUILD_SHARED_LIB),n)
 
+ifeq ($(CONFIG_RTE_LIBRTE_E1000_PMD),y)
+LDLIBS += -lrte_pmd_e1000
+endif
+
 ifeq ($(CONFIG_RTE_LIBRTE_PMD_RING),y)
 LDLIBS += -lrte_pmd_ring
 endif
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 77+ messages in thread

* [PATCH 11/15] ixgbe: Convert to use of PMD_REGISTER_DRIVER and fix linking
       [not found] ` <1397585169-14537-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
                     ` (9 preceding siblings ...)
  2014-04-15 18:06   ` [PATCH 10/15] e1000: " Neil Horman
@ 2014-04-15 18:06   ` Neil Horman
  2014-04-15 18:06   ` [PATCH 12/15] ixgbevf: " Neil Horman
                     ` (4 subsequent siblings)
  15 siblings, 0 replies; 77+ messages in thread
From: Neil Horman @ 2014-04-15 18:06 UTC (permalink / raw)
  To: dev-VfR2kkLFssw

convert the ixgbe pmd driver to use the PMD_REGISTER_DRIVER macro.
This means that the test applications now have no reference to the ixgbe library
when building DSO's and must specify its use on the command line with the -d
option.  Static linking will still initalize the driver automatically.

Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
---
 examples/dpdk_qat/main.c            |  6 ------
 examples/vmdq_dcb/main.c            |  4 ----
 lib/librte_ether/rte_ethdev.h       | 13 -------------
 lib/librte_pmd_ixgbe/ixgbe_ethdev.c | 13 +++++++++++--
 4 files changed, 11 insertions(+), 25 deletions(-)

diff --git a/examples/dpdk_qat/main.c b/examples/dpdk_qat/main.c
index 64cb610..741d3f3 100644
--- a/examples/dpdk_qat/main.c
+++ b/examples/dpdk_qat/main.c
@@ -696,12 +696,6 @@ MAIN(int argc, char **argv)
 	if (ret < 0)
 		return -1;
 
-	/* init driver */
-#ifdef RTE_LIBRTE_IXGBE_PMD
-	if (rte_ixgbe_pmd_init() < 0)
-		rte_panic("Cannot init ixgbe pmd\n");
-#endif
-
 	if (rte_eal_pci_probe() < 0)
 		rte_panic("Cannot probe PCI\n");
 
diff --git a/examples/vmdq_dcb/main.c b/examples/vmdq_dcb/main.c
index 844f334..1626ba5 100644
--- a/examples/vmdq_dcb/main.c
+++ b/examples/vmdq_dcb/main.c
@@ -455,10 +455,6 @@ MAIN(int argc, char *argv[])
 	if (ret < 0)
 		rte_exit(EXIT_FAILURE, "Invalid VMDQ argument\n");
 
-	if (rte_ixgbe_pmd_init() != 0 ||
-			rte_eal_pci_probe() != 0)
-		rte_exit(EXIT_FAILURE, "Error with NIC driver initialization\n");
-	
 	cores = rte_lcore_count();
 	if ((cores & (cores - 1)) != 0 || cores > 128) {
 		rte_exit(EXIT_FAILURE,"This program can only run on an even"
diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index 9e32f56..9621be7 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -1316,15 +1316,6 @@ struct eth_driver {
 extern void rte_eth_driver_register(struct eth_driver *eth_drv);
 
 /**
- * The initialization function of the driver for 10Gbps Intel IXGBE
- * Ethernet devices.
- * Invoked once at EAL start time.
- * @return
- *   0 on success
- */
-extern int rte_ixgbe_pmd_init(void);
-
-/**
  * The initialization function of the driver for 10Gbps Intel IXGBE_VF
  * Ethernet devices.
  * Invoked once at EAL start time.
@@ -1375,10 +1366,6 @@ int rte_pmd_init_all(void)
 	int ret = -ENODEV;
 
 #ifdef RTE_LIBRTE_IXGBE_PMD
-	if ((ret = rte_ixgbe_pmd_init()) != 0) {
-		RTE_LOG(ERR, PMD, "Cannot init ixgbe PMD\n");
-		return (ret);
-	}
 	if ((ret = rte_ixgbevf_pmd_init()) != 0) {
 		RTE_LOG(ERR, PMD, "Cannot init ixgbevf PMD\n");
 		return (ret);
diff --git a/lib/librte_pmd_ixgbe/ixgbe_ethdev.c b/lib/librte_pmd_ixgbe/ixgbe_ethdev.c
index a5a7f9a..92ba064 100644
--- a/lib/librte_pmd_ixgbe/ixgbe_ethdev.c
+++ b/lib/librte_pmd_ixgbe/ixgbe_ethdev.c
@@ -58,6 +58,8 @@
 #include <rte_ethdev.h>
 #include <rte_atomic.h>
 #include <rte_malloc.h>
+#include <rte_dev.h>
+#include <rte_pmd.h>
 
 #include "ixgbe_logs.h"
 #include "ixgbe/ixgbe_api.h"
@@ -955,8 +957,8 @@ static struct eth_driver rte_ixgbevf_pmd = {
  * Invoked once at EAL init time.
  * Register itself as the [Poll Mode] Driver of PCI IXGBE devices.
  */
-int
-rte_ixgbe_pmd_init(void)
+static int
+rte_ixgbe_pmd_init(const char *name __rte_unused, const char *params __rte_unused)
 {
 	PMD_INIT_FUNC_TRACE();
 
@@ -3060,3 +3062,10 @@ ixgbe_mirror_rule_reset(struct rte_eth_dev *dev, uint8_t rule_id)
 
 	return 0;
 }
+
+struct rte_driver rte_ixgbe_driver = {
+	.type = PMD_PDEV,
+	.init = rte_ixgbe_pmd_init,
+};
+
+PMD_REGISTER_DRIVER(rte_ixgbe_driver);
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 77+ messages in thread

* [PATCH 12/15] ixgbevf: Convert to use of PMD_REGISTER_DRIVER and fix linking
       [not found] ` <1397585169-14537-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
                     ` (10 preceding siblings ...)
  2014-04-15 18:06   ` [PATCH 11/15] ixgbe: " Neil Horman
@ 2014-04-15 18:06   ` Neil Horman
  2014-04-15 18:06   ` [PATCH 13/15] virtio: " Neil Horman
                     ` (3 subsequent siblings)
  15 siblings, 0 replies; 77+ messages in thread
From: Neil Horman @ 2014-04-15 18:06 UTC (permalink / raw)
  To: dev-VfR2kkLFssw

convert the ixgbevf pmd driver to use the PMD_REGISTER_DRIVER macro.
This means that the test applications now have no reference to the ixgbevf library
when building DSO's and must specify its use on the command line with the -d
option.  Static linking will still initalize the driver automatically.

Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
---
 lib/librte_ether/rte_ethdev.h       | 16 ----------------
 lib/librte_pmd_ixgbe/ixgbe_ethdev.c | 12 +++++++++---
 mk/rte.app.mk                       |  8 ++++----
 3 files changed, 13 insertions(+), 23 deletions(-)

diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index 9621be7..ba535dc 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -1316,15 +1316,6 @@ struct eth_driver {
 extern void rte_eth_driver_register(struct eth_driver *eth_drv);
 
 /**
- * The initialization function of the driver for 10Gbps Intel IXGBE_VF
- * Ethernet devices.
- * Invoked once at EAL start time.
- * @return
- *   0 on success
- */
-extern int rte_ixgbevf_pmd_init(void);
-
-/**
  * The initialization function of the driver for Qumranet virtio-net
  * Ethernet devices.
  * Invoked once at EAL start time.
@@ -1365,13 +1356,6 @@ int rte_pmd_init_all(void)
 {
 	int ret = -ENODEV;
 
-#ifdef RTE_LIBRTE_IXGBE_PMD
-	if ((ret = rte_ixgbevf_pmd_init()) != 0) {
-		RTE_LOG(ERR, PMD, "Cannot init ixgbevf PMD\n");
-		return (ret);
-	}
-#endif /* RTE_LIBRTE_IXGBE_PMD */
-
 #ifdef RTE_LIBRTE_VIRTIO_PMD
 	if ((ret = rte_virtio_pmd_init()) != 0) {
 		RTE_LOG(ERR, PMD, "Cannot init virtio PMD\n");
diff --git a/lib/librte_pmd_ixgbe/ixgbe_ethdev.c b/lib/librte_pmd_ixgbe/ixgbe_ethdev.c
index 92ba064..58e3ddc 100644
--- a/lib/librte_pmd_ixgbe/ixgbe_ethdev.c
+++ b/lib/librte_pmd_ixgbe/ixgbe_ethdev.c
@@ -971,8 +971,8 @@ rte_ixgbe_pmd_init(const char *name __rte_unused, const char *params __rte_unuse
  * Invoked one at EAL init time.
  * Register itself as the [Virtual Poll Mode] Driver of PCI niantic devices.
  */
-int
-rte_ixgbevf_pmd_init(void)
+static int
+rte_ixgbevf_pmd_init(const char *name __rte_unused, const char *param __rte_unused)
 {
 	DEBUGFUNC("rte_ixgbevf_pmd_init");
 
@@ -3063,9 +3063,15 @@ ixgbe_mirror_rule_reset(struct rte_eth_dev *dev, uint8_t rule_id)
 	return 0;
 }
 
-struct rte_driver rte_ixgbe_driver = {
+static struct rte_driver rte_ixgbe_driver = {
 	.type = PMD_PDEV,
 	.init = rte_ixgbe_pmd_init,
 };
 
+static struct rte_driver rte_ixgbevf_driver = {
+	.type = PMD_PDEV,
+	.init = rte_ixgbevf_pmd_init,
+};
+
 PMD_REGISTER_DRIVER(rte_ixgbe_driver);
+PMD_REGISTER_DRIVER(rte_ixgbevf_driver);
diff --git a/mk/rte.app.mk b/mk/rte.app.mk
index f5f137c..8cd1aa2 100644
--- a/mk/rte.app.mk
+++ b/mk/rte.app.mk
@@ -73,10 +73,6 @@ LDLIBS += -lrte_ivshmem
 endif
 endif
 
-ifeq ($(CONFIG_RTE_LIBRTE_IXGBE_PMD),y)
-LDLIBS += -lrte_pmd_ixgbe
-endif
-
 ifeq ($(CONFIG_RTE_LIBRTE_VIRTIO_PMD),y)
 LDLIBS += -lrte_pmd_virtio_uio
 endif
@@ -165,6 +161,10 @@ endif
 
 ifeq ($(RTE_BUILD_SHARED_LIB),n)
 
+ifeq ($(CONFIG_RTE_LIBRTE_IXGBE_PMD),y)
+LDLIBS += -lrte_pmd_ixgbe
+endif
+
 ifeq ($(CONFIG_RTE_LIBRTE_E1000_PMD),y)
 LDLIBS += -lrte_pmd_e1000
 endif
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 77+ messages in thread

* [PATCH 13/15] virtio: Convert to use of PMD_REGISTER_DRIVER and fix linking
       [not found] ` <1397585169-14537-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
                     ` (11 preceding siblings ...)
  2014-04-15 18:06   ` [PATCH 12/15] ixgbevf: " Neil Horman
@ 2014-04-15 18:06   ` Neil Horman
  2014-04-15 18:06   ` [PATCH 14/15] vmxnet3: " Neil Horman
                     ` (2 subsequent siblings)
  15 siblings, 0 replies; 77+ messages in thread
From: Neil Horman @ 2014-04-15 18:06 UTC (permalink / raw)
  To: dev-VfR2kkLFssw

convert the virtio pmd driver to use the PMD_REGISTER_DRIVER macro.
This means that the test applications now have no reference to the virtio library
when building DSO's and must specify its use on the command line with the -d
option.  Static linking will still initalize the driver automatically.

Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
---
 lib/librte_ether/rte_ethdev.h         | 16 ----------------
 lib/librte_pmd_virtio/virtio_ethdev.c | 13 +++++++++++--
 mk/rte.app.mk                         |  8 ++++----
 3 files changed, 15 insertions(+), 22 deletions(-)

diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index ba535dc..7126f95 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -1316,15 +1316,6 @@ struct eth_driver {
 extern void rte_eth_driver_register(struct eth_driver *eth_drv);
 
 /**
- * The initialization function of the driver for Qumranet virtio-net
- * Ethernet devices.
- * Invoked once at EAL start time.
- * @return
- *   0 on success
- */
-extern int rte_virtio_pmd_init(void);
-
-/**
  * The initialization function of the driver for VMware VMXNET3
  * Ethernet devices.
  * Invoked once at EAL start time.
@@ -1356,13 +1347,6 @@ int rte_pmd_init_all(void)
 {
 	int ret = -ENODEV;
 
-#ifdef RTE_LIBRTE_VIRTIO_PMD
-	if ((ret = rte_virtio_pmd_init()) != 0) {
-		RTE_LOG(ERR, PMD, "Cannot init virtio PMD\n");
-		return (ret);
-	}
-#endif /* RTE_LIBRTE_VIRTIO_PMD */
-
 #ifdef RTE_LIBRTE_VMXNET3_PMD
 	if ((ret = rte_vmxnet3_pmd_init()) != 0) {
 		RTE_LOG(ERR, PMD, "Cannot init vmxnet3 PMD\n");
diff --git a/lib/librte_pmd_virtio/virtio_ethdev.c b/lib/librte_pmd_virtio/virtio_ethdev.c
index f107161..ff3a6cf 100644
--- a/lib/librte_pmd_virtio/virtio_ethdev.c
+++ b/lib/librte_pmd_virtio/virtio_ethdev.c
@@ -50,6 +50,8 @@
 
 #include <rte_memory.h>
 #include <rte_eal.h>
+#include <rte_dev.h>
+#include <rte_pmd.h>
 
 #include "virtio_ethdev.h"
 #include "virtio_pci.h"
@@ -486,8 +488,8 @@ static struct eth_driver rte_virtio_pmd = {
  * Register itself as the [Poll Mode] Driver of PCI virtio devices.
  * Returns 0 on success.
  */
-int
-rte_virtio_pmd_init(void)
+static int
+rte_virtio_pmd_init(const char *name __rte_unused, const char *param __rte_unused)
 {
 	rte_eth_driver_register(&rte_virtio_pmd);
 	return (0);
@@ -643,3 +645,10 @@ virtio_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 	dev_info->max_rx_pktlen = VIRTIO_MAX_RX_PKTLEN;
 	dev_info->max_mac_addrs = VIRTIO_MAX_MAC_ADDRS;
 }
+
+static struct rte_driver rte_virtio_driver = {
+	.type = PMD_PDEV,
+	.init = rte_virtio_pmd_init,
+};
+
+PMD_REGISTER_DRIVER(rte_virtio_driver);
diff --git a/mk/rte.app.mk b/mk/rte.app.mk
index 8cd1aa2..827b8e3 100644
--- a/mk/rte.app.mk
+++ b/mk/rte.app.mk
@@ -73,10 +73,6 @@ LDLIBS += -lrte_ivshmem
 endif
 endif
 
-ifeq ($(CONFIG_RTE_LIBRTE_VIRTIO_PMD),y)
-LDLIBS += -lrte_pmd_virtio_uio
-endif
-
 ifeq ($(CONFIG_RTE_LIBRTE_VMXNET3_PMD),y)
 LDLIBS += -lrte_pmd_vmxnet3_uio
 endif
@@ -161,6 +157,10 @@ endif
 
 ifeq ($(RTE_BUILD_SHARED_LIB),n)
 
+ifeq ($(CONFIG_RTE_LIBRTE_VIRTIO_PMD),y)
+LDLIBS += -lrte_pmd_virtio_uio
+endif
+
 ifeq ($(CONFIG_RTE_LIBRTE_IXGBE_PMD),y)
 LDLIBS += -lrte_pmd_ixgbe
 endif
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 77+ messages in thread

* [PATCH 14/15] vmxnet3: Convert to use of PMD_REGISTER_DRIVER and fix linking
       [not found] ` <1397585169-14537-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
                     ` (12 preceding siblings ...)
  2014-04-15 18:06   ` [PATCH 13/15] virtio: " Neil Horman
@ 2014-04-15 18:06   ` Neil Horman
  2014-04-15 18:06   ` [PATCH 15/15] pmd: Remove rte_pmd_init_all Neil Horman
  2014-04-21 14:59   ` [PATCH v5 00/14] dpdk: Separate compile time linkage between eal lib and pmd's Neil Horman
  15 siblings, 0 replies; 77+ messages in thread
From: Neil Horman @ 2014-04-15 18:06 UTC (permalink / raw)
  To: dev-VfR2kkLFssw

convert the vmxnet3 pmd driver to use the PMD_REGISTER_DRIVER macro.
This means that the test applications now have no reference to the vmxnet3 library
when building DSO's and must specify its use on the command line with the -d
option.  Static linking will still initalize the driver automatically.

Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
---
 lib/librte_ether/rte_ethdev.h           | 19 +------------------
 lib/librte_pmd_vmxnet3/vmxnet3_ethdev.c | 13 +++++++++++--
 mk/rte.app.mk                           |  8 ++++----
 3 files changed, 16 insertions(+), 24 deletions(-)

diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index 7126f95..24288f8 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -1316,16 +1316,6 @@ struct eth_driver {
 extern void rte_eth_driver_register(struct eth_driver *eth_drv);
 
 /**
- * The initialization function of the driver for VMware VMXNET3
- * Ethernet devices.
- * Invoked once at EAL start time.
- * @return
- *   0 on success
- */
-extern int rte_vmxnet3_pmd_init(void);
-
-
-/**
  * The initialization function of *all* supported and enabled drivers.
  * Right now, the following PMDs are supported:
  *  - igb
@@ -1345,14 +1335,7 @@ extern int rte_vmxnet3_pmd_init(void);
 static inline
 int rte_pmd_init_all(void)
 {
-	int ret = -ENODEV;
-
-#ifdef RTE_LIBRTE_VMXNET3_PMD
-	if ((ret = rte_vmxnet3_pmd_init()) != 0) {
-		RTE_LOG(ERR, PMD, "Cannot init vmxnet3 PMD\n");
-		return (ret);
-	}
-#endif /* RTE_LIBRTE_VMXNET3_PMD */
+	int ret = 0;
 
 	if (ret == -ENODEV)
 		RTE_LOG(ERR, PMD, "No PMD(s) are configured\n");
diff --git a/lib/librte_pmd_vmxnet3/vmxnet3_ethdev.c b/lib/librte_pmd_vmxnet3/vmxnet3_ethdev.c
index 8259cfe..19ac3eb 100644
--- a/lib/librte_pmd_vmxnet3/vmxnet3_ethdev.c
+++ b/lib/librte_pmd_vmxnet3/vmxnet3_ethdev.c
@@ -60,6 +60,8 @@
 #include <rte_atomic.h>
 #include <rte_string_fns.h>
 #include <rte_malloc.h>
+#include <rte_dev.h>
+#include <rte_pmd.h>
 
 #include "vmxnet3/vmxnet3_defs.h"
 
@@ -278,8 +280,8 @@ static struct eth_driver rte_vmxnet3_pmd = {
  * Invoked once at EAL init time.
  * Register itself as the [Poll Mode] Driver of Virtual PCI VMXNET3 devices.
  */
-int
-rte_vmxnet3_pmd_init(void)
+static int
+rte_vmxnet3_pmd_init(const char *name __rte_unused, const char *param __rte_unused)
 {
 	PMD_INIT_FUNC_TRACE();
 
@@ -763,3 +765,10 @@ vmxnet3_process_events(struct vmxnet3_hw *hw)
 
 }
 #endif
+
+static struct rte_driver rte_vmxnet3_driver = {
+	.type = PMD_PDEV,
+	.init = rte_vmxnet3_pmd_init,
+};
+
+PMD_REGISTER_DRIVER(rte_vmxnet3_driver);
diff --git a/mk/rte.app.mk b/mk/rte.app.mk
index 827b8e3..afc45b2 100644
--- a/mk/rte.app.mk
+++ b/mk/rte.app.mk
@@ -73,10 +73,6 @@ LDLIBS += -lrte_ivshmem
 endif
 endif
 
-ifeq ($(CONFIG_RTE_LIBRTE_VMXNET3_PMD),y)
-LDLIBS += -lrte_pmd_vmxnet3_uio
-endif
-
 ifeq ($(CONFIG_RTE_LIBRTE_TIMER),y)
 LDLIBS += -lrte_timer
 endif
@@ -157,6 +153,10 @@ endif
 
 ifeq ($(RTE_BUILD_SHARED_LIB),n)
 
+ifeq ($(CONFIG_RTE_LIBRTE_VMXNET3_PMD),y)
+LDLIBS += -lrte_pmd_vmxnet3_uio
+endif
+
 ifeq ($(CONFIG_RTE_LIBRTE_VIRTIO_PMD),y)
 LDLIBS += -lrte_pmd_virtio_uio
 endif
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 77+ messages in thread

* [PATCH 15/15] pmd: Remove rte_pmd_init_all
       [not found] ` <1397585169-14537-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
                     ` (13 preceding siblings ...)
  2014-04-15 18:06   ` [PATCH 14/15] vmxnet3: " Neil Horman
@ 2014-04-15 18:06   ` Neil Horman
  2014-04-21 14:59   ` [PATCH v5 00/14] dpdk: Separate compile time linkage between eal lib and pmd's Neil Horman
  15 siblings, 0 replies; 77+ messages in thread
From: Neil Horman @ 2014-04-15 18:06 UTC (permalink / raw)
  To: dev-VfR2kkLFssw

Now that we've converted all the pmds in dpdk to use the driver registration
macro, rte_pmd_init_all has become empty.  As theres no reason to keep it around
anymore, just remove it and fix up all the eample callers.

Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
---
 app/test-pmd/testpmd.c                             |  3 ---
 app/test/test_kni.c                                |  5 ----
 examples/exception_path/main.c                     |  5 ----
 examples/ip_reassembly/main.c                      |  4 ----
 examples/ipv4_frag/main.c                          |  4 ----
 examples/ipv4_multicast/main.c                     |  4 ----
 examples/kni/main.c                                |  5 ----
 examples/l2fwd-ivshmem/host/host.c                 |  4 ----
 examples/l2fwd/main.c                              |  4 ----
 examples/l3fwd-power/main.c                        |  4 ----
 examples/l3fwd-vf/main.c                           |  4 ----
 examples/l3fwd/main.c                              |  4 ----
 examples/link_status_interrupt/main.c              |  4 ----
 examples/load_balancer/init.c                      |  6 -----
 .../client_server_mp/shared/init_drivers.h         |  2 +-
 examples/multi_process/l2fwd_fork/main.c           |  4 ----
 examples/multi_process/symmetric_mp/main.c         |  2 --
 examples/netmap_compat/bridge/bridge.c             |  4 ----
 examples/qos_meter/main.c                          |  4 ----
 examples/qos_sched/init.c                          |  4 ----
 examples/quota_watermark/qw/init.c                 |  5 ----
 examples/vhost/main.c                              |  2 +-
 examples/vhost_xen/main.c                          |  2 +-
 examples/vmdq/main.c                               |  2 +-
 lib/librte_ether/rte_ethdev.h                      | 27 ----------------------
 25 files changed, 4 insertions(+), 114 deletions(-)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 04dca57..7f2dcde 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1755,9 +1755,6 @@ main(int argc, char** argv)
 	if (diag < 0)
 		rte_panic("Cannot init EAL\n");
 
-	if (rte_pmd_init_all())
-		rte_panic("Cannot init PMD\n");
-
 	if (rte_eal_pci_probe())
 		rte_panic("Cannot probe PCI\n");
 
diff --git a/app/test/test_kni.c b/app/test/test_kni.c
index e0fe44e..d37758b 100644
--- a/app/test/test_kni.c
+++ b/app/test/test_kni.c
@@ -509,11 +509,6 @@ test_kni(void)
 		printf("fail to create mempool for kni\n");
 		return -1;
 	}
-	ret = rte_pmd_init_all();
-	if (ret < 0) {
-		printf("fail to initialize PMD\n");
-		return -1;
-	}
 	ret = rte_eal_pci_probe();
 	if (ret < 0) {
 		printf("fail to probe PCI devices\n");
diff --git a/examples/exception_path/main.c b/examples/exception_path/main.c
index 0bc149d..d73b413 100644
--- a/examples/exception_path/main.c
+++ b/examples/exception_path/main.c
@@ -566,11 +566,6 @@ main(int argc, char** argv)
 		return -1;
 	}
 
-	/* Initialise PMD driver(s) */
-	ret = rte_pmd_init_all();
-	if (ret < 0)
-		FATAL_ERROR("Could not probe PMD (%d)", ret);
-
 	/* Scan PCI bus for recognised devices */
 	ret = rte_eal_pci_probe();
 	if (ret < 0)
diff --git a/examples/ip_reassembly/main.c b/examples/ip_reassembly/main.c
index 4880a5f..bafa8d9 100644
--- a/examples/ip_reassembly/main.c
+++ b/examples/ip_reassembly/main.c
@@ -1553,10 +1553,6 @@ MAIN(int argc, char **argv)
 		rte_exit(EXIT_FAILURE, "init_lcore_rx_queues failed\n");
 
 
-	/* init driver(s) */
-	if (rte_pmd_init_all() < 0)
-		rte_exit(EXIT_FAILURE, "Cannot init pmd\n");
-
 	if (rte_eal_pci_probe() < 0)
 		rte_exit(EXIT_FAILURE, "Cannot probe PCI\n");
 
diff --git a/examples/ipv4_frag/main.c b/examples/ipv4_frag/main.c
index 93664c8..329f2ce 100644
--- a/examples/ipv4_frag/main.c
+++ b/examples/ipv4_frag/main.c
@@ -608,10 +608,6 @@ MAIN(int argc, char **argv)
 	if (pool_indirect == NULL)
 		rte_panic("Cannot init indirect mbuf pool\n");
 
-	/* init driver */
-	if (rte_pmd_init_all() < 0)
-		rte_panic("Cannot init PMD\n");
-
 	if (rte_eal_pci_probe() < 0)
 		rte_panic("Cannot probe PCI\n");
 
diff --git a/examples/ipv4_multicast/main.c b/examples/ipv4_multicast/main.c
index 3bd37e4..da4e09d 100644
--- a/examples/ipv4_multicast/main.c
+++ b/examples/ipv4_multicast/main.c
@@ -753,10 +753,6 @@ MAIN(int argc, char **argv)
 	if (clone_pool == NULL)
 		rte_exit(EXIT_FAILURE, "Cannot init clone mbuf pool\n");
 
-	/* init driver */
-	if (rte_pmd_init_all() < 0)
-		rte_exit(EXIT_FAILURE, "Cannot init pmd\n");
-
 	if (rte_eal_pci_probe() < 0)
 		rte_exit(EXIT_FAILURE, "Cannot probe PCI\n");
 
diff --git a/examples/kni/main.c b/examples/kni/main.c
index 274990b..fe823b3 100644
--- a/examples/kni/main.c
+++ b/examples/kni/main.c
@@ -889,11 +889,6 @@ main(int argc, char** argv)
 		return -1;
 	}
 
-	/* Initialise PMD driver(s) */
-	ret = rte_pmd_init_all();
-	if (ret < 0)
-		rte_exit(EXIT_FAILURE, "Could not initialise PMD (%d)\n", ret);
-
 	/* Scan PCI bus for recognised devices */
 	ret = rte_eal_pci_probe();
 	if (ret < 0)
diff --git a/examples/l2fwd-ivshmem/host/host.c b/examples/l2fwd-ivshmem/host/host.c
index 6aaa082..e0627a4 100644
--- a/examples/l2fwd-ivshmem/host/host.c
+++ b/examples/l2fwd-ivshmem/host/host.c
@@ -716,10 +716,6 @@ int main(int argc, char **argv)
 	if (l2fwd_ivshmem_pktmbuf_pool == NULL)
 		rte_exit(EXIT_FAILURE, "Cannot init mbuf pool\n");
 
-	/* init driver(s) */
-	if (rte_pmd_init_all() < 0)
-		rte_exit(EXIT_FAILURE, "Cannot init pmd\n");
-
 	if (rte_eal_pci_probe() < 0)
 		rte_exit(EXIT_FAILURE, "Cannot probe PCI\n");
 
diff --git a/examples/l2fwd/main.c b/examples/l2fwd/main.c
index 2d94366..d04e27a 100644
--- a/examples/l2fwd/main.c
+++ b/examples/l2fwd/main.c
@@ -615,10 +615,6 @@ MAIN(int argc, char **argv)
 	if (l2fwd_pktmbuf_pool == NULL)
 		rte_exit(EXIT_FAILURE, "Cannot init mbuf pool\n");
 
-	/* init driver(s) */
-	if (rte_pmd_init_all() < 0)
-		rte_exit(EXIT_FAILURE, "Cannot init pmd\n");
-
 	if (rte_eal_pci_probe() < 0)
 		rte_exit(EXIT_FAILURE, "Cannot probe PCI\n");
 
diff --git a/examples/l3fwd-power/main.c b/examples/l3fwd-power/main.c
index 219f802..598b7a2 100644
--- a/examples/l3fwd-power/main.c
+++ b/examples/l3fwd-power/main.c
@@ -1547,10 +1547,6 @@ MAIN(int argc, char **argv)
 		rte_exit(EXIT_FAILURE, "init_lcore_rx_queues failed\n");
 
 
-	/* init driver(s) */
-	if (rte_pmd_init_all() < 0)
-		rte_exit(EXIT_FAILURE, "Cannot init pmd\n");
-
 	if (rte_eal_pci_probe() < 0)
 		rte_exit(EXIT_FAILURE, "Cannot probe PCI\n");
 
diff --git a/examples/l3fwd-vf/main.c b/examples/l3fwd-vf/main.c
index fb811fa..793cacc 100644
--- a/examples/l3fwd-vf/main.c
+++ b/examples/l3fwd-vf/main.c
@@ -1007,10 +1007,6 @@ MAIN(int argc, char **argv)
 	if (ret < 0)
 		rte_exit(EXIT_FAILURE, "init_lcore_rx_queues failed\n");
 
-	/* init driver */
-	if (rte_pmd_init_all() < 0)
-		rte_exit(EXIT_FAILURE, "Cannot init pmd\n");
-
 	if (rte_eal_pci_probe() < 0)
 		rte_exit(EXIT_FAILURE, "Cannot probe PCI\n");
 
diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c
index 1ba4ca2..8ee1af9 100755
--- a/examples/l3fwd/main.c
+++ b/examples/l3fwd/main.c
@@ -1841,10 +1841,6 @@ MAIN(int argc, char **argv)
 		rte_exit(EXIT_FAILURE, "init_lcore_rx_queues failed\n");
 
 
-	/* init driver(s) */
-	if (rte_pmd_init_all() < 0)
-		rte_exit(EXIT_FAILURE, "Cannot init pmd\n");
-
 	if (rte_eal_pci_probe() < 0)
 		rte_exit(EXIT_FAILURE, "Cannot probe PCI\n");
 
diff --git a/examples/link_status_interrupt/main.c b/examples/link_status_interrupt/main.c
index de6c87f..8d17b01 100644
--- a/examples/link_status_interrupt/main.c
+++ b/examples/link_status_interrupt/main.c
@@ -663,10 +663,6 @@ MAIN(int argc, char **argv)
 	if (lsi_pktmbuf_pool == NULL)
 		rte_panic("Cannot init mbuf pool\n");
 
-	/* init driver(s) */
-	if (rte_pmd_init_all() < 0)
-		rte_panic("Cannot init pmd\n");
-
 	if (rte_eal_pci_probe() < 0)
 		rte_panic("Cannot probe PCI\n");
 
diff --git a/examples/load_balancer/init.c b/examples/load_balancer/init.c
index 6a2f218..e997238 100644
--- a/examples/load_balancer/init.c
+++ b/examples/load_balancer/init.c
@@ -450,12 +450,6 @@ app_init_nics(void)
 	int ret;
 	uint32_t n_rx_queues, n_tx_queues;
 
-	/* Init driver */
-	printf("Initializing the PMD driver ...\n");
-	if (rte_pmd_init_all() < 0) {
-		rte_panic("Cannot init PMD\n");
-	}
-
 	if (rte_eal_pci_probe() < 0) {
 		rte_panic("Cannot probe PCI\n");
 	}
diff --git a/examples/multi_process/client_server_mp/shared/init_drivers.h b/examples/multi_process/client_server_mp/shared/init_drivers.h
index afa03bd..5d9a90f 100644
--- a/examples/multi_process/client_server_mp/shared/init_drivers.h
+++ b/examples/multi_process/client_server_mp/shared/init_drivers.h
@@ -40,7 +40,7 @@
 static inline int
 init_drivers(void)
 {
-	if (rte_pmd_init_all() < 0 || rte_eal_pci_probe() < 0)
+	if (rte_eal_pci_probe() < 0)
 		return -1;
 
 	return 0;
diff --git a/examples/multi_process/l2fwd_fork/main.c b/examples/multi_process/l2fwd_fork/main.c
index 3dd2b2a..a34f420 100644
--- a/examples/multi_process/l2fwd_fork/main.c
+++ b/examples/multi_process/l2fwd_fork/main.c
@@ -1050,10 +1050,6 @@ MAIN(int argc, char **argv)
 	for (i = 0; i < RTE_MAX_LCORE; i++)
 		lcore_resource[i].lcore_id = i;
 	
-	/* init driver(s) */
-	if (rte_pmd_init_all() < 0)
-		rte_exit(EXIT_FAILURE, "Cannot init pmd\n");
-
 	if (rte_eal_pci_probe() < 0)
 		rte_exit(EXIT_FAILURE, "Cannot probe PCI\n");
 
diff --git a/examples/multi_process/symmetric_mp/main.c b/examples/multi_process/symmetric_mp/main.c
index 12fa28d..028f98d 100644
--- a/examples/multi_process/symmetric_mp/main.c
+++ b/examples/multi_process/symmetric_mp/main.c
@@ -463,8 +463,6 @@ main(int argc, char **argv)
 
 	/* probe to determine the NIC devices available */
 	proc_type = rte_eal_process_type();
-	if (rte_pmd_init_all() < 0)
-		rte_exit(EXIT_FAILURE, "Cannot init pmd\n");
 	if (rte_eal_pci_probe() < 0)
 		rte_exit(EXIT_FAILURE, "Cannot probe PCI\n");
 	if (rte_eth_dev_count() == 0)
diff --git a/examples/netmap_compat/bridge/bridge.c b/examples/netmap_compat/bridge/bridge.c
index ecf5757..e0cef57 100644
--- a/examples/netmap_compat/bridge/bridge.c
+++ b/examples/netmap_compat/bridge/bridge.c
@@ -294,10 +294,6 @@ int main(int argc, char *argv[])
 	if (ports.num == 0)
 		rte_exit(EXIT_FAILURE, "no ports specified\n");
 
-	err = rte_pmd_init_all();
-	if (err < 0)
-		rte_exit(EXIT_FAILURE, "rte_pmd_init_all(): error %d\n", err);
-
 	err = rte_eal_pci_probe();
 	if (err < 0)
 		rte_exit(EXIT_FAILURE, "rte_eal_pci_probe(): error %d\n", err);
diff --git a/examples/qos_meter/main.c b/examples/qos_meter/main.c
index bc76703..e1698cc 100755
--- a/examples/qos_meter/main.c
+++ b/examples/qos_meter/main.c
@@ -386,10 +386,6 @@ MAIN(int argc, char **argv)
 	if (pool == NULL)
 		rte_exit(EXIT_FAILURE, "Buffer pool creation error\n");
 
-	/* PMD init */
-	if (rte_pmd_init_all() < 0)
-		rte_exit(EXIT_FAILURE, "PMD init error\n");
-
 	if (rte_eal_pci_probe() < 0)
 		rte_exit(EXIT_FAILURE, "PCI probe error\n");
 
diff --git a/examples/qos_sched/init.c b/examples/qos_sched/init.c
index 7c5c62e..e021815 100755
--- a/examples/qos_sched/init.c
+++ b/examples/qos_sched/init.c
@@ -305,10 +305,6 @@ int app_init(void)
 	char ring_name[MAX_NAME_LEN];
 	char pool_name[MAX_NAME_LEN];
 
-	/* init driver(s) */
-	if (rte_pmd_init_all() < 0)
-		rte_exit(EXIT_FAILURE, "Cannot init PMD\n");
-
 	if (rte_eal_pci_probe() < 0)
 		rte_exit(EXIT_FAILURE, "Cannot probe PCI\n");
 
diff --git a/examples/quota_watermark/qw/init.c b/examples/quota_watermark/qw/init.c
index f42eb8b..44455b2 100644
--- a/examples/quota_watermark/qw/init.c
+++ b/examples/quota_watermark/qw/init.c
@@ -138,11 +138,6 @@ init_dpdk(void)
 {
     int ret;
 
-    /* Initialize the PMD */
-    ret = rte_pmd_init_all();
-    if (ret < 0)
-        rte_exit(EXIT_FAILURE, "Failed to initialize poll mode drivers (error %d)\n", ret);
-
     /* Bind the drivers to usable devices */
     ret = rte_eal_pci_probe();
     if (ret < 0)
diff --git a/examples/vhost/main.c b/examples/vhost/main.c
index 816a71a..b86d57d 100644
--- a/examples/vhost/main.c
+++ b/examples/vhost/main.c
@@ -1657,7 +1657,7 @@ MAIN(int argc, char *argv[])
 	if (ret < 0)
 		rte_exit(EXIT_FAILURE, "Invalid argument\n");
 
-	if (rte_pmd_init_all() != 0 || rte_eal_pci_probe() != 0)
+	if (rte_eal_pci_probe() != 0)
 		rte_exit(EXIT_FAILURE, "Error with NIC driver initialization\n");
 
 	for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id ++)
diff --git a/examples/vhost_xen/main.c b/examples/vhost_xen/main.c
index eafc0aa..2ec44ee 100644
--- a/examples/vhost_xen/main.c
+++ b/examples/vhost_xen/main.c
@@ -1464,7 +1464,7 @@ MAIN(int argc, char *argv[])
 	if (ret < 0)
 		rte_exit(EXIT_FAILURE, "Invalid argument\n");
 
-	if (rte_pmd_init_all() != 0 || rte_eal_pci_probe() != 0)
+	if (rte_eal_pci_probe() != 0)
 		rte_exit(EXIT_FAILURE, "Error with NIC driver initialization\n");
 
 	for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id ++)
diff --git a/examples/vmdq/main.c b/examples/vmdq/main.c
index fac24aa..0f52bdd 100644
--- a/examples/vmdq/main.c
+++ b/examples/vmdq/main.c
@@ -597,7 +597,7 @@ MAIN(int argc, char *argv[])
 	if (ret < 0)
 		rte_exit(EXIT_FAILURE, "Invalid VMDQ argument\n");
 
-	if (rte_pmd_init_all() != 0 || rte_eal_pci_probe() != 0)
+	if (rte_eal_pci_probe() != 0)
 		rte_exit(EXIT_FAILURE, "Error with NIC driver initialization\n");
 	
 	for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id ++) 
diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index 24288f8..d5ea46b 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -1316,33 +1316,6 @@ struct eth_driver {
 extern void rte_eth_driver_register(struct eth_driver *eth_drv);
 
 /**
- * The initialization function of *all* supported and enabled drivers.
- * Right now, the following PMDs are supported:
- *  - igb
- *  - igbvf
- *  - em
- *  - ixgbe
- *  - ixgbevf
- *  - virtio
- *  - vmxnet3
- * This function is invoked once at EAL start time.
- * @return
- *   0 on success.
- *   Error code of the device initialization failure,
- *   -ENODEV if there are no drivers available
- *   (e.g. if all driver config options are = n).
- */
-static inline
-int rte_pmd_init_all(void)
-{
-	int ret = 0;
-
-	if (ret == -ENODEV)
-		RTE_LOG(ERR, PMD, "No PMD(s) are configured\n");
-	return (ret);
-}
-
-/**
  * Configure an Ethernet device.
  * This function must be invoked first before any other function in the
  * Ethernet API. This function can also be re-invoked when a device is in the
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 77+ messages in thread

* Re: [PATCH 01/15] makefiles: Fixed -share command line option error
       [not found]     ` <1397585169-14537-2-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
@ 2014-04-16  9:22       ` Thomas Monjalon
  2014-04-16 11:00         ` Neil Horman
  2014-04-16 13:51       ` [PATCH 01/15 v2] " Neil Horman
  1 sibling, 1 reply; 77+ messages in thread
From: Thomas Monjalon @ 2014-04-16  9:22 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev-VfR2kkLFssw

Hi,

2014-04-15 14:05, Neil Horman:
> The shared libraries built with the current makefile set produce static
> libraries rather than actual shared objects.  This is due to several missing
> options that are required to correctly build shared objects using ld, as
> well as a mis-specified -share option (which should be -shared). Switching
> to the use of CC rather than LD and fixing the -shared option corrects
> these problems and builds the DSOs correctly.
> 
> Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>

Thanks for fixing -shared option.

Regarding switch to CC linking, please have a look at LINK_USING_CC option.
Maybe you should use it for rte.lib.mk and rte.sharelib.mk.

-- 
Thomas

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 02/15] make: include whole archive on static link
       [not found]     ` <1397585169-14537-3-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
@ 2014-04-16  9:26       ` Thomas Monjalon
  2014-04-16 11:02         ` Neil Horman
  0 siblings, 1 reply; 77+ messages in thread
From: Thomas Monjalon @ 2014-04-16  9:26 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev-VfR2kkLFssw

2014-04-15 14:05, Neil Horman:
> This happens automatically on dyanmic linking, but when linking an archive
> we need to to include the whole archive to make sure we call all the
> constructors. Not doing this causes them to be discarded due to the fact
> theres no symbolic reference connecting the pmds to the application.
> 
> Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>

This patch conflicts with Olivier's one:
	http://dpdk.org/browse/dpdk/commit/?id=20afd76a504155e947

-- 
Thomas

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 01/15] makefiles: Fixed -share command line option error
  2014-04-16  9:22       ` Thomas Monjalon
@ 2014-04-16 11:00         ` Neil Horman
       [not found]           ` <20140416110018.GB26829-B26myB8xz7F8NnZeBjwnZQMhkBWG/bsMQH7oEaQurus@public.gmane.org>
  0 siblings, 1 reply; 77+ messages in thread
From: Neil Horman @ 2014-04-16 11:00 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev-VfR2kkLFssw

On Wed, Apr 16, 2014 at 11:22:35AM +0200, Thomas Monjalon wrote:
> Hi,
> 
> 2014-04-15 14:05, Neil Horman:
> > The shared libraries built with the current makefile set produce static
> > libraries rather than actual shared objects.  This is due to several missing
> > options that are required to correctly build shared objects using ld, as
> > well as a mis-specified -share option (which should be -shared). Switching
> > to the use of CC rather than LD and fixing the -shared option corrects
> > these problems and builds the DSOs correctly.
> > 
> > Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
> 
> Thanks for fixing -shared option.
> 
> Regarding switch to CC linking, please have a look at LINK_USING_CC option.
> Maybe you should use it for rte.lib.mk and rte.sharelib.mk.
> 
Yeah, I can do that.  Would you like the whole series reposted, or just the
specific patch?

Neil

> -- 
> Thomas
> 

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 02/15] make: include whole archive on static link
  2014-04-16  9:26       ` Thomas Monjalon
@ 2014-04-16 11:02         ` Neil Horman
       [not found]           ` <20140416110204.GC26829-B26myB8xz7F8NnZeBjwnZQMhkBWG/bsMQH7oEaQurus@public.gmane.org>
  0 siblings, 1 reply; 77+ messages in thread
From: Neil Horman @ 2014-04-16 11:02 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev-VfR2kkLFssw

On Wed, Apr 16, 2014 at 11:26:48AM +0200, Thomas Monjalon wrote:
> 2014-04-15 14:05, Neil Horman:
> > This happens automatically on dyanmic linking, but when linking an archive
> > we need to to include the whole archive to make sure we call all the
> > constructors. Not doing this causes them to be discarded due to the fact
> > theres no symbolic reference connecting the pmds to the application.
> > 
> > Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
> 
> This patch conflicts with Olivier's one:
> 	http://dpdk.org/browse/dpdk/commit/?id=20afd76a504155e947
> 
How does it conflict?  I've got it in my dpdk tree here, based off commit
396b69e56a3462ff80537deccebcdecb2771d8ca, which includes Oliviers patch, and
mine is applied on top of it cleanly.

Neil
> -- 
> Thomas
> 

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 01/15] makefiles: Fixed -share command line option error
       [not found]           ` <20140416110018.GB26829-B26myB8xz7F8NnZeBjwnZQMhkBWG/bsMQH7oEaQurus@public.gmane.org>
@ 2014-04-16 11:37             ` Thomas Monjalon
  0 siblings, 0 replies; 77+ messages in thread
From: Thomas Monjalon @ 2014-04-16 11:37 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev-VfR2kkLFssw

2014-04-16 07:00, Neil Horman:
> On Wed, Apr 16, 2014 at 11:22:35AM +0200, Thomas Monjalon wrote:
> > Hi,
> > 
> > 2014-04-15 14:05, Neil Horman:
> > > The shared libraries built with the current makefile set produce static
> > > libraries rather than actual shared objects.  This is due to several
> > > missing options that are required to correctly build shared objects
> > > using ld, as well as a mis-specified -share option (which should be
> > > -shared). Switching to the use of CC rather than LD and fixing the
> > > -shared option corrects these problems and builds the DSOs correctly.
> > > 
> > > Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
> > 
> > Thanks for fixing -shared option.
> > 
> > Regarding switch to CC linking, please have a look at LINK_USING_CC
> > option.
> > Maybe you should use it for rte.lib.mk and rte.sharelib.mk.
> 
> Yeah, I can do that.  Would you like the whole series reposted, or just the
> specific patch?

Just sending this patch should be enough.

Thanks
-- 
Thomas

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 02/15] make: include whole archive on static link
       [not found]           ` <20140416110204.GC26829-B26myB8xz7F8NnZeBjwnZQMhkBWG/bsMQH7oEaQurus@public.gmane.org>
@ 2014-04-16 11:40             ` Thomas Monjalon
  2014-04-16 13:02               ` Neil Horman
  0 siblings, 1 reply; 77+ messages in thread
From: Thomas Monjalon @ 2014-04-16 11:40 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev-VfR2kkLFssw

2014-04-16 07:02, Neil Horman:
> On Wed, Apr 16, 2014 at 11:26:48AM +0200, Thomas Monjalon wrote:
> > 2014-04-15 14:05, Neil Horman:
> > > This happens automatically on dyanmic linking, but when linking an
> > > archive
> > > we need to to include the whole archive to make sure we call all the
> > > constructors. Not doing this causes them to be discarded due to the fact
> > > theres no symbolic reference connecting the pmds to the application.
> > > 
> > > Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
> > 
> > This patch conflicts with Olivier's one:
> > 	http://dpdk.org/browse/dpdk/commit/?id=20afd76a504155e947
> 
> How does it conflict?  I've got it in my dpdk tree here, based off commit
> 396b69e56a3462ff80537deccebcdecb2771d8ca, which includes Oliviers patch, and
> mine is applied on top of it cleanly.

It's not a git conflict.
I mean --whole-archive is set twice.
Maybe that your patch is not needed.

-- 
Thomas

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 03/15] pmd: Add PMD_REGISTER_DRIVER macro
       [not found]     ` <1397585169-14537-4-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
@ 2014-04-16 11:52       ` Thomas Monjalon
  2014-04-16 12:59         ` John W. Linville
  2014-04-16 13:08         ` Neil Horman
  2014-04-18 11:42       ` Thomas Monjalon
  1 sibling, 2 replies; 77+ messages in thread
From: Thomas Monjalon @ 2014-04-16 11:52 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev-VfR2kkLFssw

2014-04-15 14:05, Neil Horman:
> Rather than have each driver have to remember to add a constructor to it to
> make sure its gets registered properly, wrap that process up in a macro to
> make registration a one line affair.  This also sets the stage for us to
> make registration of vdev pmds and physical pmds a uniform process
> 
> Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>

Could you explain why having a macro is better than an explicit constructor 
function?

> +enum rte_pmd_driver_type {
> +	PMD_VDEV = 1
> +};
> +
> +extern void rte_eal_nonpci_dev_init_register(const char *name, int
> (*dev_initfn)(const char *, const char *)); +#define PMD_REGISTER_DRIVER(d,
> t)\
> +void devinitfn_ ##d(void);\
> +void __attribute__((constructor, used)) devinitfn_ ##d(void)\
> +{\
> +	enum rte_pmd_driver_type _t = (t);\
> +	switch(_t)\
> +	{\
> +		case PMD_VDEV:\
> +			rte_eal_vdev_driver_register(&d);\
> +			break;\
> +	};\

Are you sure this switch is needed?
You are removing it in patch 7.

If someone else think this macro is a good idea, or not, speak now :)

-- 
Thomas

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 03/15] pmd: Add PMD_REGISTER_DRIVER macro
  2014-04-16 11:52       ` Thomas Monjalon
@ 2014-04-16 12:59         ` John W. Linville
  2014-04-16 13:08         ` Neil Horman
  1 sibling, 0 replies; 77+ messages in thread
From: John W. Linville @ 2014-04-16 12:59 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev-VfR2kkLFssw

On Wed, Apr 16, 2014 at 01:52:49PM +0200, Thomas Monjalon wrote:
> 2014-04-15 14:05, Neil Horman:
> > Rather than have each driver have to remember to add a constructor to it to
> > make sure its gets registered properly, wrap that process up in a macro to
> > make registration a one line affair.  This also sets the stage for us to
> > make registration of vdev pmds and physical pmds a uniform process
> > 
> > Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
> 
> Could you explain why having a macro is better than an explicit constructor 
> function?
> 
> > +enum rte_pmd_driver_type {
> > +	PMD_VDEV = 1
> > +};
> > +
> > +extern void rte_eal_nonpci_dev_init_register(const char *name, int
> > (*dev_initfn)(const char *, const char *)); +#define PMD_REGISTER_DRIVER(d,
> > t)\
> > +void devinitfn_ ##d(void);\
> > +void __attribute__((constructor, used)) devinitfn_ ##d(void)\
> > +{\
> > +	enum rte_pmd_driver_type _t = (t);\
> > +	switch(_t)\
> > +	{\
> > +		case PMD_VDEV:\
> > +			rte_eal_vdev_driver_register(&d);\
> > +			break;\
> > +	};\
> 
> Are you sure this switch is needed?
> You are removing it in patch 7.
> 
> If someone else think this macro is a good idea, or not, speak now :)

I don't understand your objection to it?  It makes for a nice clean
declaration, rather than error-prone cut-n-pasted boilerplate code
in every driver.  Even more benefits accrue if/when the constructors
need to be changed...

John
-- 
John W. Linville		Someday the world will need a hero, and you
linville-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org			might be all we have.  Be ready.

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 02/15] make: include whole archive on static link
  2014-04-16 11:40             ` Thomas Monjalon
@ 2014-04-16 13:02               ` Neil Horman
       [not found]                 ` <20140416130204.GB11887-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
  0 siblings, 1 reply; 77+ messages in thread
From: Neil Horman @ 2014-04-16 13:02 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev-VfR2kkLFssw

On Wed, Apr 16, 2014 at 01:40:19PM +0200, Thomas Monjalon wrote:
> 2014-04-16 07:02, Neil Horman:
> > On Wed, Apr 16, 2014 at 11:26:48AM +0200, Thomas Monjalon wrote:
> > > 2014-04-15 14:05, Neil Horman:
> > > > This happens automatically on dyanmic linking, but when linking an
> > > > archive
> > > > we need to to include the whole archive to make sure we call all the
> > > > constructors. Not doing this causes them to be discarded due to the fact
> > > > theres no symbolic reference connecting the pmds to the application.
> > > > 
> > > > Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
> > > 
> > > This patch conflicts with Olivier's one:
> > > 	http://dpdk.org/browse/dpdk/commit/?id=20afd76a504155e947
> > 
> > How does it conflict?  I've got it in my dpdk tree here, based off commit
> > 396b69e56a3462ff80537deccebcdecb2771d8ca, which includes Oliviers patch, and
> > mine is applied on top of it cleanly.
> 
> It's not a git conflict.
> I mean --whole-archive is set twice.
> Maybe that your patch is not needed.
> 
Yeah, I think you're right, its can probably just be dropped.  Let me test quick
and I'll confirm
Neil

> -- 
> Thomas
> 

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 03/15] pmd: Add PMD_REGISTER_DRIVER macro
  2014-04-16 11:52       ` Thomas Monjalon
  2014-04-16 12:59         ` John W. Linville
@ 2014-04-16 13:08         ` Neil Horman
       [not found]           ` <20140416130848.GC11887-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
  1 sibling, 1 reply; 77+ messages in thread
From: Neil Horman @ 2014-04-16 13:08 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev-VfR2kkLFssw

On Wed, Apr 16, 2014 at 01:52:49PM +0200, Thomas Monjalon wrote:
> 2014-04-15 14:05, Neil Horman:
> > Rather than have each driver have to remember to add a constructor to it to
> > make sure its gets registered properly, wrap that process up in a macro to
> > make registration a one line affair.  This also sets the stage for us to
> > make registration of vdev pmds and physical pmds a uniform process
> > 
> > Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
> 
> Could you explain why having a macro is better than an explicit constructor 
> function?
> 
Because its a one line declaration inside a driver function that points to the
structure used to initilze the pmd?  Having to append ((__constructor__)) to
each initalization function is both error prone during entry and exposes the
possibiilty of developers doing "too much" in their constructor.  It also allows
for easy updating to all drivers, if additional boilerplate work needs to be
done in the future for all pmds.

> > +enum rte_pmd_driver_type {
> > +	PMD_VDEV = 1
> > +};
> > +
> > +extern void rte_eal_nonpci_dev_init_register(const char *name, int
> > (*dev_initfn)(const char *, const char *)); +#define PMD_REGISTER_DRIVER(d,
> > t)\
> > +void devinitfn_ ##d(void);\
> > +void __attribute__((constructor, used)) devinitfn_ ##d(void)\
> > +{\
> > +	enum rte_pmd_driver_type _t = (t);\
> > +	switch(_t)\
> > +	{\
> > +		case PMD_VDEV:\
> > +			rte_eal_vdev_driver_register(&d);\
> > +			break;\
> > +	};\
> 
> Are you sure this switch is needed?
> You are removing it in patch 7.
> 
I think you answered your own question :).  It was needed when this patch was
written because the physical pmd regitration differed from the virtual pmd.  As
you note though, its removed in patch 7 because we merged the registration
methods.  Could I merge them earlier?  sure, but its not at all needed.  It
works in this invocation, and it works (better in the final version at the end
of the series).

> If someone else think this macro is a good idea, or not, speak now :)
> 
I'm speaking up, its a good idea :)

> -- 
> Thomas
> 

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 02/15] make: include whole archive on static link
       [not found]                 ` <20140416130204.GB11887-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
@ 2014-04-16 13:33                   ` Neil Horman
  0 siblings, 0 replies; 77+ messages in thread
From: Neil Horman @ 2014-04-16 13:33 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev-VfR2kkLFssw

On Wed, Apr 16, 2014 at 09:02:04AM -0400, Neil Horman wrote:
> On Wed, Apr 16, 2014 at 01:40:19PM +0200, Thomas Monjalon wrote:
> > 2014-04-16 07:02, Neil Horman:
> > > On Wed, Apr 16, 2014 at 11:26:48AM +0200, Thomas Monjalon wrote:
> > > > 2014-04-15 14:05, Neil Horman:
> > > > > This happens automatically on dyanmic linking, but when linking an
> > > > > archive
> > > > > we need to to include the whole archive to make sure we call all the
> > > > > constructors. Not doing this causes them to be discarded due to the fact
> > > > > theres no symbolic reference connecting the pmds to the application.
> > > > > 
> > > > > Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
> > > > 
> > > > This patch conflicts with Olivier's one:
> > > > 	http://dpdk.org/browse/dpdk/commit/?id=20afd76a504155e947
> > > 
> > > How does it conflict?  I've got it in my dpdk tree here, based off commit
> > > 396b69e56a3462ff80537deccebcdecb2771d8ca, which includes Oliviers patch, and
> > > mine is applied on top of it cleanly.
> > 
> > It's not a git conflict.
> > I mean --whole-archive is set twice.
> > Maybe that your patch is not needed.
> > 
> Yeah, I think you're right, its can probably just be dropped.  Let me test quick
> and I'll confirm
> Neil
> 
Confirmed, its redundant.  You can just drop this one patch.
Thanks
Neil

> > -- 
> > Thomas
> > 
> 

^ permalink raw reply	[flat|nested] 77+ messages in thread

* [PATCH 01/15 v2] makefiles: Fixed -share command line option error
       [not found]     ` <1397585169-14537-2-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
  2014-04-16  9:22       ` Thomas Monjalon
@ 2014-04-16 13:51       ` Neil Horman
       [not found]         ` <1397656304-468-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
  1 sibling, 1 reply; 77+ messages in thread
From: Neil Horman @ 2014-04-16 13:51 UTC (permalink / raw)
  To: dev-VfR2kkLFssw

The shared libraries built with the current makefile set produce static
libraries rather than actual shared objects.  This is due to several missing
options that are required to correctly build shared objects using ld, as well as
a mis-specified -share option (which should be -shared). Switching to the use of
CC rather than LD and fixing the -shared option corrects these problems and
builds the DSOs correctly.

Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>

---
Change notes:

v2) Added test for LINK_USING_CC to convert to link with gcc
---
 mk/rte.lib.mk      | 9 +++++++--
 mk/rte.sharelib.mk | 2 +-
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index f75ca92..f5d2789 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -59,6 +59,11 @@ build: _postbuild
 
 exe2cmd = $(strip $(call dotfile,$(patsubst %,%.cmd,$(1))))
 
+ifeq ($(LINK_USING_CC),1)
+# Override the definition of LD here, since we're linking with CC
+LD := $(CC)
+endif
+
 O_TO_A = $(AR) crus $(LIB) $(OBJS-y)
 O_TO_A_STR = $(subst ','\'',$(O_TO_A)) #'# fix syntax highlight
 O_TO_A_DISP = $(if $(V),"$(O_TO_A_STR)","  AR $(@)")
@@ -68,7 +73,7 @@ O_TO_A_DO = @set -e; \
 	$(O_TO_A) && \
 	echo $(O_TO_A_CMD) > $(call exe2cmd,$(@))
 
-O_TO_S = $(LD) $(CPU_LDFLAGS) -z muldefs -share $(OBJS-y) -o $(LIB)
+O_TO_S = $(LD) $(CPU_LDFLAGS) -z muldefs -shared $(OBJS-y) -o $(LIB)
 O_TO_S_STR = $(subst ','\'',$(O_TO_S)) #'# fix syntax highlight
 O_TO_S_DISP = $(if $(V),"$(O_TO_S_STR)","  LD $(@)")
 O_TO_S_DO = @set -e; \
@@ -84,7 +89,7 @@ O_TO_C_DO = @set -e; \
 	$(lib_dir) \
 	$(copy_obj)
 else
-O_TO_C = $(LD) -z muldefs -share $(OBJS-y) -o $(LIB_ONE)
+O_TO_C = $(LD) -z muldefs -shared $(OBJS-y) -o $(LIB_ONE)
 O_TO_C_STR = $(subst ','\'',$(O_TO_C)) #'# fix syntax highlight
 O_TO_C_DISP = $(if $(V),"$(O_TO_C_STR)","  LD_C $(@)")
 O_TO_C_DO = @set -e; \
diff --git a/mk/rte.sharelib.mk b/mk/rte.sharelib.mk
index 3967b51..429309f 100644
--- a/mk/rte.sharelib.mk
+++ b/mk/rte.sharelib.mk
@@ -45,7 +45,7 @@ sharelib: $(LIB_ONE) FORCE
 
 OBJS = $(wildcard $(RTE_OUTPUT)/build/lib/*.o)
 
-O_TO_S = $(LD) $(CPU_LDFLAGS) -share $(OBJS) -o $(RTE_OUTPUT)/lib/$(LIB_ONE)
+O_TO_S = $(LD) $(CPU_LDFLAGS) -shared $(OBJS) -o $(RTE_OUTPUT)/lib/$(LIB_ONE)
 O_TO_S_STR = $(subst ','\'',$(O_TO_S)) #'# fix syntax highlight
 O_TO_S_DISP = $(if $(V),"$(O_TO_S_STR)","  LD $(@)")
 O_TO_S_CMD = "cmd_$@ = $(O_TO_S_STR)"
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 77+ messages in thread

* [PATCH 05/15 v2] ring: Convert to use of PMD_REGISTER_DRIVER and fix linking
       [not found]     ` <1397585169-14537-6-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
@ 2014-04-16 13:53       ` Neil Horman
  2014-04-17  9:50       ` [PATCH 05/15] " Ananyev, Konstantin
  1 sibling, 0 replies; 77+ messages in thread
From: Neil Horman @ 2014-04-16 13:53 UTC (permalink / raw)
  To: dev-VfR2kkLFssw

convert the ring driver to use the PMD_REGISTER_DRIVER macro and fix up the
Makefile so that its linkage is only done if we are building static libraries.
This means that the test applications now have no reference to the ring library
when building DSO's and must specify its use on the command line with the -d
option.  Static linking will still initalize the driver automatically.

Note that the ring driver was also written in such a way that it violated some
general layering principles, several functions were contained in the pmd which
were being called by example from the test application in the app/test
directory.  Specifically it was calling eth_ring_pair_attach,
eth_ring_pair_create and rte_eth_ring_devinit, which should only be called
internally to the dpdk core library.  To correct this I've removed those
functions, and instead allowed them to be called indirectly at initalization
time using the vdev command line argument key nodeaction=<name>:<node>:<action>
where action is one of ATTACH or CREATE.  I've tested out the functionality of
the command line with the testpmd utility, with success, and have removed the
called functions from the test utility.  This will affect how the test utility
is invoked (the -d and --vdev option will need to be specified on the command
line now), but honestly, given the way it was coded, I think the testing of the
ring pmd was not the best example of how to code with dpdk to begin with.  I
have also left the two layer violating functions in place, so as not to break
existing applications, but added deprecation warnings to them so that apps can
migrate off them.

Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>

---
Change notes

v2) fixed DEPDIR specifcation, should depend on RING not PCAP
---
 app/test/test_pmd_ring.c           |  95 ----------------------------
 lib/librte_pmd_ring/Makefile       |   1 +
 lib/librte_pmd_ring/rte_eth_ring.c | 123 ++++++++++++++++++++++++++++++++++---
 mk/rte.app.mk                      |  14 +++--
 4 files changed, 124 insertions(+), 109 deletions(-)

diff --git a/app/test/test_pmd_ring.c b/app/test/test_pmd_ring.c
index 4d9c2ba..1fe38fa 100644
--- a/app/test/test_pmd_ring.c
+++ b/app/test/test_pmd_ring.c
@@ -42,7 +42,6 @@
 /* two test rings, r1 is used by two ports, r2 just by one */
 static struct rte_ring *r1[2], *r2;
 
-static struct rte_ring *nullring = NULL;
 static struct rte_mempool *mp;
 static uint8_t start_idx; /* will store the port id of the first of our new ports */
 
@@ -59,58 +58,6 @@ static uint8_t start_idx; /* will store the port id of the first of our new port
 #define MBUF_SIZE (2048 + sizeof(struct rte_mbuf) + RTE_PKTMBUF_HEADROOM)
 #define NB_MBUF   512
 
-
-static int
-test_ring_ethdev_create(void)
-{
-	int retval;
-	printf("Testing ring pmd create\n");
-
-	retval = rte_eth_from_rings(NULL, 0, NULL, 0, SOCKET0);
-	if (retval < 0) {
-		printf("Failure, failed to create zero-sized RXTX ring pmd\n");
-		return -1;
-	}
-
-	retval = rte_eth_from_rings(NULL, 0, NULL, 0, RTE_MAX_NUMA_NODES);
-	if (retval >= 0) {
-		printf("Failure, can create ring pmd on socket %d\n", RTE_MAX_NUMA_NODES);
-		return -1;
-	}
-
-	retval = rte_eth_from_rings(NULL, 1, &r2, 1, SOCKET0);
-	if (retval >= 0) {
-		printf("Failure, can create pmd with null rx rings\n");
-		return -1;
-	}
-
-	retval = rte_eth_from_rings(r1, 1, NULL, 1, SOCKET0);
-	if (retval >= 0) {
-		printf("Failure, can create pmd with null tx rings\n");
-		return -1;
-	}
-
-	retval = rte_eth_from_rings(&nullring, 1, r1, 2, SOCKET0);
-	if (retval < 0) {
-		printf("Failure, failed to create TX-only ring pmd\n");
-		return -1;
-	}
-
-	retval = rte_eth_from_rings(r1, 1, &nullring, 1, SOCKET0);
-	if (retval < 0) {
-		printf("Failure, failed to create RX-only ring pmd\n");
-		return -1;
-	}
-
-	retval = rte_eth_from_rings(&r2, 1, &r2, 1, SOCKET0);
-	if (retval < 0) {
-		printf("Failure, failed to create RXTX ring pmd\n");
-		return -1;
-	}
-
-	return 0;
-}
-
 static int
 test_ethdev_configure(void)
 {
@@ -305,26 +252,12 @@ test_stats_reset(void)
 static int 
 test_pmd_ring_init(void)
 {
-	const char * name1 = "R3";
-	const char * name2 = "R4";
-	const char * params_null = NULL;
-	const char * params = "PARAMS";
 	struct rte_eth_stats stats;
 	struct rte_mbuf buf, *pbuf = &buf;
 	struct rte_eth_conf null_conf;
 
 	printf("Testing ring pmd init\n");
 
-	if (rte_pmd_ring_devinit(name1, params_null) < 0) {
-		printf("Testing ring pmd init fail\n");
-		return -1;
-	}
-
-	if (rte_pmd_ring_devinit(name2, params) < 0) {
-		printf("Testing ring pmd init fail\n");
-		return -1;
-	}
-
 	if (RXTX_PORT2 >= RTE_MAX_ETHPORTS) {
 		printf(" TX/RX port exceed max eth ports\n");
 		return -1;
@@ -371,24 +304,16 @@ test_pmd_ring_init(void)
 
 	rte_eth_dev_stop(RXTX_PORT2);
 
-	/* Test init same name pmd ring */
-	rte_pmd_ring_devinit(name1, params_null);
 	return 0;
 }
 
 static int
 test_pmd_ring_pair_create(void)
 {
-	const char * name1 = "_RNG_P0";
 	struct rte_eth_stats stats, stats2;
 	struct rte_mbuf buf, *pbuf = &buf;
 	struct rte_eth_conf null_conf;
 
-	if (rte_eth_ring_pair_create(name1, SOCKET0) < 0) {
-		printf("Create ring pair failed\n");
-		return -1;
-	}
-
 	if ((RXTX_PORT4 >= RTE_MAX_ETHPORTS) || (RXTX_PORT5 >= RTE_MAX_ETHPORTS)) {
 		printf(" TX/RX port exceed max eth ports\n");
 		return -1;
@@ -447,28 +372,16 @@ test_pmd_ring_pair_create(void)
 	rte_eth_dev_stop(RXTX_PORT4);
 	rte_eth_dev_stop(RXTX_PORT5);
 
-	/* Test create same name ring pair */
-	if (rte_eth_ring_pair_create(name1, SOCKET0) == 0) {
-		printf("Create same name ring pair error\n");
-		return -1;
-	}
 	return 0;
 }
 
 static int
 test_pmd_ring_pair_attach(void)
 {
-	const char * name1 = "_RNG_P0";
-	const char * name2 = "_RNG_P1";
 	struct rte_eth_stats stats, stats2;
 	struct rte_mbuf buf, *pbuf = &buf;
 	struct rte_eth_conf null_conf;
 
-	if (rte_eth_ring_pair_attach(name1, SOCKET0) < 0) {
-		printf("Attach ring pair failed\n");
-		return -1;
-	}
-
 	if ((RXTX_PORT4 >= RTE_MAX_ETHPORTS) || (RXTX_PORT5 >= RTE_MAX_ETHPORTS)) {
 		printf(" TX/RX port exceed max eth ports\n");
 		return -1;
@@ -529,11 +442,6 @@ test_pmd_ring_pair_attach(void)
 	rte_eth_dev_stop(RXTX_PORT4);
 	rte_eth_dev_stop(RXTX_PORT5);
 	
-	/* Test attach non-existing ring pair */
-	if (rte_eth_ring_pair_attach(name2, SOCKET0) == 0) {
-		printf("Attach non-existing ring pair error\n");
-		return -1;
-	}
 	return 0;
 }
 
@@ -568,9 +476,6 @@ test_pmd_ring(void)
 		return -1;
 	}
 
-	if (test_ring_ethdev_create() < 0)
-		return -1;
-
 	if (test_ethdev_configure() < 0)
 		return -1;
 
diff --git a/lib/librte_pmd_ring/Makefile b/lib/librte_pmd_ring/Makefile
index 73b2d38..35d40cb 100644
--- a/lib/librte_pmd_ring/Makefile
+++ b/lib/librte_pmd_ring/Makefile
@@ -52,5 +52,6 @@ SYMLINK-y-include += rte_eth_ring.h
 # this lib depends upon:
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_RING) += lib/librte_eal lib/librte_ring
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_RING) += lib/librte_mbuf lib/librte_ether
+DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_RING) += lib/librte_kvargs
 
 include $(RTE_SDK)/mk/rte.lib.mk
diff --git a/lib/librte_pmd_ring/rte_eth_ring.c b/lib/librte_pmd_ring/rte_eth_ring.c
index cee3fff..266cfc0 100644
--- a/lib/librte_pmd_ring/rte_eth_ring.c
+++ b/lib/librte_pmd_ring/rte_eth_ring.c
@@ -38,6 +38,15 @@
 #include <rte_memcpy.h>
 #include <rte_string_fns.h>
 #include <rte_vdev.h>
+#include <rte_pmd.h>
+#include <rte_kvargs.h>
+
+#define ETH_RING_NUMA_NODE_ACTION_ARG    "nodeaction"
+
+static const char *valid_arguments[] = {
+	ETH_RING_NUMA_NODE_ACTION_ARG,
+	NULL
+};
 
 struct ring_queue {
 	struct rte_ring *rng;
@@ -373,28 +382,127 @@ eth_dev_ring_pair_create(const char *name, const unsigned numa_node,
 int
 rte_eth_ring_pair_create(const char *name, const unsigned numa_node)
 {
+	RTE_LOG(WARNING, PMD, "rte_eth_ring_pair_create is deprecated\n");
 	return eth_dev_ring_pair_create(name, numa_node, DEV_CREATE);
 }
 
 int
 rte_eth_ring_pair_attach(const char *name, const unsigned numa_node)
 {
+	RTE_LOG(WARNING, PMD, "rte_eth_ring_pair_attach is deprecated\n");
 	return eth_dev_ring_pair_create(name, numa_node, DEV_ATTACH);
 }
 
+struct node_action_pair {
+	char name[PATH_MAX];
+	unsigned node;
+	enum dev_action action;
+};
+
+struct node_action_list {
+	unsigned total;
+	unsigned count;
+	struct node_action_pair *list;
+};
+
+static int parse_kvlist (const char *key __rte_unused, const char *value, void *data)
+{
+	struct node_action_list *info = data;
+	int ret;
+	char *name;
+	char *action;
+	char *node;
+
+	name = strdup(value);
+
+	ret = -1;
+
+	if (!name)
+		goto out;
+
+	node = strchr(name, ':');
+	*node = '\0';
+	node++;
+
+	action = strchr(node, ':');
+	*action = '\0';
+	action++;
+
+	/*
+	 * Need to do some sanity checking here
+	 */
+
+	if (strcmp(action, "ATTACH"))
+		if (strcmp(action, "CREATE"))
+			goto out;
+
+	info->list[info->count].node = strtol(node, NULL, 10);
+
+	info->list[info->count].action = strcmp(action, "ATTACH") ? DEV_CREATE : DEV_ATTACH;
+
+	strncpy(info->list[info->count].name, name, PATH_MAX);
+
+	info->count++;
+
+	ret = 0;
+out:
+	free(name);
+	return ret;
+}
+
 int
 rte_pmd_ring_devinit(const char *name, const char *params)
 {
+	struct rte_kvargs *kvlist;
+	int ret = 0;
+	struct node_action_list *info = NULL;
+
 	RTE_LOG(INFO, PMD, "Initializing pmd_ring for %s\n", name);
 
+
 	if (params == NULL || params[0] == '\0')
 		eth_dev_ring_create(name, rte_socket_id(), DEV_CREATE);
 	else {
-		RTE_LOG(INFO, PMD, "Ignoring unsupported parameters when creating"
-				" rings-backed ethernet device\n");
-		eth_dev_ring_create(name, rte_socket_id(), DEV_CREATE);
+		printf("Parsing kvargs\n");
+		kvlist = rte_kvargs_parse(params, valid_arguments);
+
+		if (!kvlist) {
+			RTE_LOG(INFO, PMD, "Ignoring unsupported parameters when creating"
+					" rings-backed ethernet device\n");
+			eth_dev_ring_create(name, rte_socket_id(), DEV_CREATE);
+			return 0;
+		} else {
+			eth_dev_ring_create(name, rte_socket_id(), DEV_CREATE);
+			printf("counting kvargs\n");
+			ret = rte_kvargs_count(kvlist, ETH_RING_NUMA_NODE_ACTION_ARG);
+			info = rte_zmalloc("struct node_action_list", sizeof(struct node_action_list) +
+					   (sizeof(struct node_action_pair) * ret), 0);
+			if (!info)
+				goto out;
+
+			info->total = ret;
+			info->list = (struct node_action_pair*)(info + 1);
+
+			printf("We have %d nodeaction pairs\n", info->total);
+			ret = rte_kvargs_process(kvlist, ETH_RING_NUMA_NODE_ACTION_ARG,
+						 parse_kvlist, info); 
+
+			if (ret < 0)
+				goto out_free;
+
+			for (info->count = 0; info->count < info->total; info->count++) {
+				printf("Doing something with a ring\n");
+				eth_dev_ring_pair_create(name, info->list[info->count].node,
+						    info->list[info->count].action);
+			}
+				
+		}
 	}
-	return 0;
+
+out_free:
+	rte_free(info);
+out:
+	return ret;
 }
 
 static struct rte_vdev_driver pmd_ring_drv = {
@@ -402,9 +510,4 @@ static struct rte_vdev_driver pmd_ring_drv = {
 	.init = rte_pmd_ring_devinit,
 };
 
-__attribute__((constructor))
-static void
-rte_pmd_ring_init(void)
-{
-	rte_eal_vdev_driver_register(&pmd_ring_drv);
-}
+PMD_REGISTER_DRIVER(pmd_ring_drv, PMD_VDEV);
diff --git a/mk/rte.app.mk b/mk/rte.app.mk
index e6d09b8..4f167aa 100644
--- a/mk/rte.app.mk
+++ b/mk/rte.app.mk
@@ -133,10 +133,6 @@ ifeq ($(CONFIG_RTE_LIBRTE_ETHER),y)
 LDLIBS += -lethdev
 endif
 
-ifeq ($(CONFIG_RTE_LIBRTE_PMD_RING),y)
-LDLIBS += -lrte_pmd_ring
-endif
-
 ifeq ($(CONFIG_RTE_LIBRTE_MALLOC),y)
 LDLIBS += -lrte_malloc
 endif
@@ -173,9 +169,19 @@ LDLIBS += -lrte_cmdline
 endif
 
 ifeq ($(RTE_BUILD_SHARED_LIB),n)
+
+ifeq ($(CONFIG_RTE_LIBRTE_PMD_RING),y)
+LDLIBS += -lrte_pmd_ring
+endif
+
+ifeq ($(CONFIG_RTE_LIBRTE_PMD_RING),y)
+LDLIBS += -lrte_pmd_ring
+endif
+
 ifeq ($(CONFIG_RTE_LIBRTE_PMD_PCAP),y)
 LDLIBS += -lrte_pmd_pcap -lpcap
 endif
+
 endif
 
 LDLIBS += $(EXECENV_LDLIBS)
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 77+ messages in thread

* Re: [PATCH 03/15] pmd: Add PMD_REGISTER_DRIVER macro
       [not found]           ` <20140416130848.GC11887-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
@ 2014-04-16 16:11             ` Olivier MATZ
       [not found]               ` <534EABB4.9020301-pdR9zngts4EAvxtiuMwx3w@public.gmane.org>
  0 siblings, 1 reply; 77+ messages in thread
From: Olivier MATZ @ 2014-04-16 16:11 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev-VfR2kkLFssw

Hi Neil,

On 04/16/2014 03:08 PM, Neil Horman wrote:
> On Wed, Apr 16, 2014 at 01:52:49PM +0200, Thomas Monjalon wrote:
>> 2014-04-15 14:05, Neil Horman:
>>> Rather than have each driver have to remember to add a constructor to it to
>>> make sure its gets registered properly, wrap that process up in a macro to
>>> make registration a one line affair.  This also sets the stage for us to
>>> make registration of vdev pmds and physical pmds a uniform process
>>>
>>> Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
>>
>> Could you explain why having a macro is better than an explicit constructor
>> function?
>>
> Because its a one line declaration inside a driver function that points to the
> structure used to initilze the pmd?  Having to append ((__constructor__)) to
> each initalization function is both error prone during entry and exposes the
> possibiilty of developers doing "too much" in their constructor.  It also allows
> for easy updating to all drivers, if additional boilerplate work needs to be
> done in the future for all pmds.

Even if it's not critical, in my opinion, the following code is easier
to understand:

	__attribute__((constructor))
	static void
	rte_pmd_ring_init(void)
	{
		rte_eal_dev_driver_register(&pmd_ring_drv);
	}

Than:

	PMD_REGISTER_DRIVER(pmd_ring_drv);


The first version explicitly shows what you are doing: defining a
static function called at initialization that registers a driver
structure.

With the second, we're tempted to check what this macro does...


My 2 cents,
Olivier

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 03/15] pmd: Add PMD_REGISTER_DRIVER macro
       [not found]               ` <534EABB4.9020301-pdR9zngts4EAvxtiuMwx3w@public.gmane.org>
@ 2014-04-16 17:15                 ` John W. Linville
  2014-04-16 17:29                 ` Neil Horman
  1 sibling, 0 replies; 77+ messages in thread
From: John W. Linville @ 2014-04-16 17:15 UTC (permalink / raw)
  To: Olivier MATZ; +Cc: dev-VfR2kkLFssw

On Wed, Apr 16, 2014 at 06:11:32PM +0200, Olivier MATZ wrote:
> Hi Neil,
> 
> On 04/16/2014 03:08 PM, Neil Horman wrote:
> >On Wed, Apr 16, 2014 at 01:52:49PM +0200, Thomas Monjalon wrote:
> >>2014-04-15 14:05, Neil Horman:
> >>>Rather than have each driver have to remember to add a constructor to it to
> >>>make sure its gets registered properly, wrap that process up in a macro to
> >>>make registration a one line affair.  This also sets the stage for us to
> >>>make registration of vdev pmds and physical pmds a uniform process
> >>>
> >>>Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
> >>
> >>Could you explain why having a macro is better than an explicit constructor
> >>function?
> >>
> >Because its a one line declaration inside a driver function that points to the
> >structure used to initilze the pmd?  Having to append ((__constructor__)) to
> >each initalization function is both error prone during entry and exposes the
> >possibiilty of developers doing "too much" in their constructor.  It also allows
> >for easy updating to all drivers, if additional boilerplate work needs to be
> >done in the future for all pmds.
> 
> Even if it's not critical, in my opinion, the following code is easier
> to understand:
> 
> 	__attribute__((constructor))
> 	static void
> 	rte_pmd_ring_init(void)
> 	{
> 		rte_eal_dev_driver_register(&pmd_ring_drv);
> 	}
> 
> Than:
> 
> 	PMD_REGISTER_DRIVER(pmd_ring_drv);
> 
> 
> The first version explicitly shows what you are doing: defining a
> static function called at initialization that registers a driver
> structure.
> 
> With the second, we're tempted to check what this macro does...

Which you will do once, and then forever be thankful that ever after
you will only have to read the simple macro rather than all that
nasty boilerplate and __attribute__ gorp...

John
-- 
John W. Linville		Someday the world will need a hero, and you
linville-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org			might be all we have.  Be ready.

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 03/15] pmd: Add PMD_REGISTER_DRIVER macro
       [not found]               ` <534EABB4.9020301-pdR9zngts4EAvxtiuMwx3w@public.gmane.org>
  2014-04-16 17:15                 ` John W. Linville
@ 2014-04-16 17:29                 ` Neil Horman
       [not found]                   ` <20140416172924.GE11887-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
  1 sibling, 1 reply; 77+ messages in thread
From: Neil Horman @ 2014-04-16 17:29 UTC (permalink / raw)
  To: Olivier MATZ; +Cc: dev-VfR2kkLFssw

On Wed, Apr 16, 2014 at 06:11:32PM +0200, Olivier MATZ wrote:
> Hi Neil,
> 
> On 04/16/2014 03:08 PM, Neil Horman wrote:
> >On Wed, Apr 16, 2014 at 01:52:49PM +0200, Thomas Monjalon wrote:
> >>2014-04-15 14:05, Neil Horman:
> >>>Rather than have each driver have to remember to add a constructor to it to
> >>>make sure its gets registered properly, wrap that process up in a macro to
> >>>make registration a one line affair.  This also sets the stage for us to
> >>>make registration of vdev pmds and physical pmds a uniform process
> >>>
> >>>Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
> >>
> >>Could you explain why having a macro is better than an explicit constructor
> >>function?
> >>
> >Because its a one line declaration inside a driver function that points to the
> >structure used to initilze the pmd?  Having to append ((__constructor__)) to
> >each initalization function is both error prone during entry and exposes the
> >possibiilty of developers doing "too much" in their constructor.  It also allows
> >for easy updating to all drivers, if additional boilerplate work needs to be
> >done in the future for all pmds.
> 
> Even if it's not critical, in my opinion, the following code is easier
> to understand:
> 
> 	__attribute__((constructor))
> 	static void
> 	rte_pmd_ring_init(void)
> 	{
> 		rte_eal_dev_driver_register(&pmd_ring_drv);
> 	}
> 
> Than:
> 
> 	PMD_REGISTER_DRIVER(pmd_ring_drv);
> 
> 
> The first version explicitly shows what you are doing: defining a
> static function called at initialization that registers a driver
> structure.
> 
> With the second, we're tempted to check what this macro does...
> 
Ok, so look it up.  DPDK is open source and cscope is easy to use.  A
module initilization macro is a common method for doing init time binding in
modular programming (the best examples are the module_init() and module_exit()
macros in the linux kernel).  It wraps up what you need to do to tie a modular
piece of your software into the larger main component, without having to know
all the boilerplate behind it.

Also, if you expose the use of the constructor, then you've
broken out the initalization phase to every pmd you implement, and as a result,
if you ever need to add code to the initilization step, you have to add it in
every pmd, instead of just updating the macro.


The bottom line is, your method is 5 lines of boilerplate code thats going to
have to get repeated as nauseum for every pmd that gets written giving every PMD
author the opportunity to miscode the constructor, vs my one line that, if it
compiles, will be correct every time.

Neil

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 03/15] pmd: Add PMD_REGISTER_DRIVER macro
       [not found]                   ` <20140416172924.GE11887-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
@ 2014-04-17  8:08                     ` Olivier MATZ
       [not found]                       ` <534F8BFD.6070701-pdR9zngts4EAvxtiuMwx3w@public.gmane.org>
  0 siblings, 1 reply; 77+ messages in thread
From: Olivier MATZ @ 2014-04-17  8:08 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev-VfR2kkLFssw

Hi Neil,

On 04/16/2014 07:29 PM, Neil Horman wrote:
> Ok, so look it up.  DPDK is open source and cscope is easy to use.  A
> module initilization macro is a common method for doing init time binding in
> modular programming (the best examples are the module_init() and module_exit()
> macros in the linux kernel).  It wraps up what you need to do to tie a modular
> piece of your software into the larger main component, without having to know
> all the boilerplate behind it.
>
> Also, if you expose the use of the constructor, then you've
> broken out the initalization phase to every pmd you implement, and as a result,
> if you ever need to add code to the initilization step, you have to add it in
> every pmd, instead of just updating the macro.
>
> The bottom line is, your method is 5 lines of boilerplate code thats going to
> have to get repeated as nauseum for every pmd that gets written giving every PMD
> author the opportunity to miscode the constructor, vs my one line that, if it
> compiles, will be correct every time.
OK, some of your arguments are legitimate and it's a detail point of
your patches that are globally a nice improvement of the DPDK code.

But I'd be happy to continue this discussion over a beer ;)

Regards,
Olivier

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 05/15] ring: Convert to use of PMD_REGISTER_DRIVER and fix linking
       [not found]     ` <1397585169-14537-6-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
  2014-04-16 13:53       ` [PATCH 05/15 v2] " Neil Horman
@ 2014-04-17  9:50       ` Ananyev, Konstantin
       [not found]         ` <2601191342CEEE43887BDE71AB9772580EF973E4-kPTMFJFq+rEu0RiL9chJVbfspsVTdybXVpNB7YpNyf8@public.gmane.org>
  1 sibling, 1 reply; 77+ messages in thread
From: Ananyev, Konstantin @ 2014-04-17  9:50 UTC (permalink / raw)
  To: Neil Horman, dev-VfR2kkLFssw

Hi Neil,
Few comments from me there.
Thanks
Konstantin

- parse_kvlist():

1)
node = strchr(name, ':');
...
action = strchr(node, ':');

We can't expect that input parameter will always be  valid.
So need to check that strchr() doesn't return NULL.

2)
if (strcmp(action, "ATTACH"))
	if (strcmp(action, "CREATE"))
                   goto out;
...
info->list[info->count].action = strcmp(action, "ATTACH") ? DEV_CREATE : DEV_ATTACH;

Can you create a macros for these 2 string constants and use them instead.
Another thing, probably better to reorder it that way:

if (strcmp(action, "ATTACH") == 0)
      info->list[info->count].action = DEV_ATTACH;
else if (strcmp(action, "CREATE") == 0)
      info->list[info->count].action = DEV_CREATE;
else 
    goto out;

Would save you one strcmp() and looks a bit cleaner.

3)
info->list[info->count].node = strtol(node, NULL, 10);
Again we can't assume that input string will always be valid.
Something like that should do, I think:

char *end;
...
errno = 0;
info->list[info->count].node = strtoul(node, &end, 10);
if (errno != 0 || *end != 0) {
   ret = -EINVAL;
   goto out;
}

4)
strncpy(info->list[info->count].name, name, PATH_MAX);
When RTE_INSECURE_FUNCTION_WARNING is defined,  strncpy() (and some other functions) are marked as poisoned.
Another thing - as I remember, if strlen(name) >= PATH_MAX, then destination string will not be null terminated.
So probably something like that instead:
rte_snprintf(info->list[info->count].name, sizeof(info->list[info->count].name), "%s", name);

- rte_pmd_ring_devinit():

5)
printf("Parsing kvargs\n"); 
Here and everywhere - please use RTE_LOG() instead.


-----Original Message-----
From: dev [mailto:dev-bounces-VfR2kkLFssw@public.gmane.org] On Behalf Of Neil Horman
Sent: Tuesday, April 15, 2014 7:06 PM
To: dev-VfR2kkLFssw@public.gmane.org
Subject: [dpdk-dev] [PATCH 05/15] ring: Convert to use of PMD_REGISTER_DRIVER and fix linking

convert the ring driver to use the PMD_REGISTER_DRIVER macro and fix up the Makefile so that its linkage is only done if we are building static libraries.
This means that the test applications now have no reference to the ring library when building DSO's and must specify its use on the command line with the -d option.  Static linking will still initalize the driver automatically.

Note that the ring driver was also written in such a way that it violated some general layering principles, several functions were contained in the pmd which were being called by example from the test application in the app/test directory.  Specifically it was calling eth_ring_pair_attach, eth_ring_pair_create and rte_eth_ring_devinit, which should only be called internally to the dpdk core library.  To correct this I've removed those functions, and instead allowed them to be called indirectly at initalization time using the vdev command line argument key nodeaction=<name>:<node>:<action> where action is one of ATTACH or CREATE.  I've tested out the functionality of the command line with the testpmd utility, with success, and have removed the called functions from the test utility.  This will affect how the test utility is invoked (the -d and --vdev option will need to be specified on the command line now), but honestly, given the way it was coded, I think the testing of the ring pmd was not the best example of how to code with dpdk to begin with.  I have also left the two layer violating functions in place, so as not to break existing applications, but added deprecation warnings to them so that apps can migrate off them.

Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
---
 app/test/test_pmd_ring.c           |  95 ----------------------------
 lib/librte_pmd_ring/Makefile       |   1 +
 lib/librte_pmd_ring/rte_eth_ring.c | 123 ++++++++++++++++++++++++++++++++++---
 mk/rte.app.mk                      |  14 +++--
 4 files changed, 124 insertions(+), 109 deletions(-)

diff --git a/app/test/test_pmd_ring.c b/app/test/test_pmd_ring.c index 4d9c2ba..1fe38fa 100644
--- a/app/test/test_pmd_ring.c
+++ b/app/test/test_pmd_ring.c
@@ -42,7 +42,6 @@
 /* two test rings, r1 is used by two ports, r2 just by one */  static struct rte_ring *r1[2], *r2;
 
-static struct rte_ring *nullring = NULL;  static struct rte_mempool *mp;  static uint8_t start_idx; /* will store the port id of the first of our new ports */
 
@@ -59,58 +58,6 @@ static uint8_t start_idx; /* will store the port id of the first of our new port  #define MBUF_SIZE (2048 + sizeof(struct rte_mbuf) + RTE_PKTMBUF_HEADROOM)
 #define NB_MBUF   512
 
-
-static int
-test_ring_ethdev_create(void)
-{
-	int retval;
-	printf("Testing ring pmd create\n");
-
-	retval = rte_eth_from_rings(NULL, 0, NULL, 0, SOCKET0);
-	if (retval < 0) {
-		printf("Failure, failed to create zero-sized RXTX ring pmd\n");
-		return -1;
-	}
-
-	retval = rte_eth_from_rings(NULL, 0, NULL, 0, RTE_MAX_NUMA_NODES);
-	if (retval >= 0) {
-		printf("Failure, can create ring pmd on socket %d\n", RTE_MAX_NUMA_NODES);
-		return -1;
-	}
-
-	retval = rte_eth_from_rings(NULL, 1, &r2, 1, SOCKET0);
-	if (retval >= 0) {
-		printf("Failure, can create pmd with null rx rings\n");
-		return -1;
-	}
-
-	retval = rte_eth_from_rings(r1, 1, NULL, 1, SOCKET0);
-	if (retval >= 0) {
-		printf("Failure, can create pmd with null tx rings\n");
-		return -1;
-	}
-
-	retval = rte_eth_from_rings(&nullring, 1, r1, 2, SOCKET0);
-	if (retval < 0) {
-		printf("Failure, failed to create TX-only ring pmd\n");
-		return -1;
-	}
-
-	retval = rte_eth_from_rings(r1, 1, &nullring, 1, SOCKET0);
-	if (retval < 0) {
-		printf("Failure, failed to create RX-only ring pmd\n");
-		return -1;
-	}
-
-	retval = rte_eth_from_rings(&r2, 1, &r2, 1, SOCKET0);
-	if (retval < 0) {
-		printf("Failure, failed to create RXTX ring pmd\n");
-		return -1;
-	}
-
-	return 0;
-}
-
 static int
 test_ethdev_configure(void)
 {
@@ -305,26 +252,12 @@ test_stats_reset(void)  static int
 test_pmd_ring_init(void)
 {
-	const char * name1 = "R3";
-	const char * name2 = "R4";
-	const char * params_null = NULL;
-	const char * params = "PARAMS";
 	struct rte_eth_stats stats;
 	struct rte_mbuf buf, *pbuf = &buf;
 	struct rte_eth_conf null_conf;
 
 	printf("Testing ring pmd init\n");
 
-	if (rte_pmd_ring_devinit(name1, params_null) < 0) {
-		printf("Testing ring pmd init fail\n");
-		return -1;
-	}
-
-	if (rte_pmd_ring_devinit(name2, params) < 0) {
-		printf("Testing ring pmd init fail\n");
-		return -1;
-	}
-
 	if (RXTX_PORT2 >= RTE_MAX_ETHPORTS) {
 		printf(" TX/RX port exceed max eth ports\n");
 		return -1;
@@ -371,24 +304,16 @@ test_pmd_ring_init(void)
 
 	rte_eth_dev_stop(RXTX_PORT2);
 
-	/* Test init same name pmd ring */
-	rte_pmd_ring_devinit(name1, params_null);
 	return 0;
 }
 
 static int
 test_pmd_ring_pair_create(void)
 {
-	const char * name1 = "_RNG_P0";
 	struct rte_eth_stats stats, stats2;
 	struct rte_mbuf buf, *pbuf = &buf;
 	struct rte_eth_conf null_conf;
 
-	if (rte_eth_ring_pair_create(name1, SOCKET0) < 0) {
-		printf("Create ring pair failed\n");
-		return -1;
-	}
-
 	if ((RXTX_PORT4 >= RTE_MAX_ETHPORTS) || (RXTX_PORT5 >= RTE_MAX_ETHPORTS)) {
 		printf(" TX/RX port exceed max eth ports\n");
 		return -1;
@@ -447,28 +372,16 @@ test_pmd_ring_pair_create(void)
 	rte_eth_dev_stop(RXTX_PORT4);
 	rte_eth_dev_stop(RXTX_PORT5);
 
-	/* Test create same name ring pair */
-	if (rte_eth_ring_pair_create(name1, SOCKET0) == 0) {
-		printf("Create same name ring pair error\n");
-		return -1;
-	}
 	return 0;
 }
 
 static int
 test_pmd_ring_pair_attach(void)
 {
-	const char * name1 = "_RNG_P0";
-	const char * name2 = "_RNG_P1";
 	struct rte_eth_stats stats, stats2;
 	struct rte_mbuf buf, *pbuf = &buf;
 	struct rte_eth_conf null_conf;
 
-	if (rte_eth_ring_pair_attach(name1, SOCKET0) < 0) {
-		printf("Attach ring pair failed\n");
-		return -1;
-	}
-
 	if ((RXTX_PORT4 >= RTE_MAX_ETHPORTS) || (RXTX_PORT5 >= RTE_MAX_ETHPORTS)) {
 		printf(" TX/RX port exceed max eth ports\n");
 		return -1;
@@ -529,11 +442,6 @@ test_pmd_ring_pair_attach(void)
 	rte_eth_dev_stop(RXTX_PORT4);
 	rte_eth_dev_stop(RXTX_PORT5);
 	
-	/* Test attach non-existing ring pair */
-	if (rte_eth_ring_pair_attach(name2, SOCKET0) == 0) {
-		printf("Attach non-existing ring pair error\n");
-		return -1;
-	}
 	return 0;
 }
 
@@ -568,9 +476,6 @@ test_pmd_ring(void)
 		return -1;
 	}
 
-	if (test_ring_ethdev_create() < 0)
-		return -1;
-
 	if (test_ethdev_configure() < 0)
 		return -1;
 
diff --git a/lib/librte_pmd_ring/Makefile b/lib/librte_pmd_ring/Makefile index 73b2d38..a62f805 100644
--- a/lib/librte_pmd_ring/Makefile
+++ b/lib/librte_pmd_ring/Makefile
@@ -52,5 +52,6 @@ SYMLINK-y-include += rte_eth_ring.h  # this lib depends upon:
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_RING) += lib/librte_eal lib/librte_ring
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_RING) += lib/librte_mbuf lib/librte_ether
+DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_PCAP) += lib/librte_kvargs
 
 include $(RTE_SDK)/mk/rte.lib.mk
diff --git a/lib/librte_pmd_ring/rte_eth_ring.c b/lib/librte_pmd_ring/rte_eth_ring.c
index cee3fff..266cfc0 100644
--- a/lib/librte_pmd_ring/rte_eth_ring.c
+++ b/lib/librte_pmd_ring/rte_eth_ring.c
@@ -38,6 +38,15 @@
 #include <rte_memcpy.h>
 #include <rte_string_fns.h>
 #include <rte_vdev.h>
+#include <rte_pmd.h>
+#include <rte_kvargs.h>
+
+#define ETH_RING_NUMA_NODE_ACTION_ARG    "nodeaction"
+
+static const char *valid_arguments[] = {
+	ETH_RING_NUMA_NODE_ACTION_ARG,
+	NULL
+};
 
 struct ring_queue {
 	struct rte_ring *rng;
@@ -373,28 +382,127 @@ eth_dev_ring_pair_create(const char *name, const unsigned numa_node,  int  rte_eth_ring_pair_create(const char *name, const unsigned numa_node)  {
+	RTE_LOG(WARNING, PMD, "rte_eth_ring_pair_create is deprecated\n");
 	return eth_dev_ring_pair_create(name, numa_node, DEV_CREATE);  }
 
 int
 rte_eth_ring_pair_attach(const char *name, const unsigned numa_node)  {
+	RTE_LOG(WARNING, PMD, "rte_eth_ring_pair_attach is deprecated\n");
 	return eth_dev_ring_pair_create(name, numa_node, DEV_ATTACH);  }
 
+struct node_action_pair {
+	char name[PATH_MAX];
+	unsigned node;
+	enum dev_action action;
+};
+
+struct node_action_list {
+	unsigned total;
+	unsigned count;
+	struct node_action_pair *list;
+};
+
+static int parse_kvlist (const char *key __rte_unused, const char 
+*value, void *data) {
+	struct node_action_list *info = data;
+	int ret;
+	char *name;
+	char *action;
+	char *node;
+
+	name = strdup(value);
+
+	ret = -1;
+
+	if (!name)
+		goto out;
+
+	node = strchr(name, ':');
+	*node = '\0';
+	node++;
+
+	action = strchr(node, ':');
+	*action = '\0';
+	action++;
+
+	/*
+	 * Need to do some sanity checking here
+	 */
+
+	if (strcmp(action, "ATTACH"))
+		if (strcmp(action, "CREATE"))
+			goto out;
+
+	info->list[info->count].node = strtol(node, NULL, 10);
+
+	info->list[info->count].action = strcmp(action, "ATTACH") ? DEV_CREATE 
+: DEV_ATTACH;
+
+	strncpy(info->list[info->count].name, name, PATH_MAX);
+
+	info->count++;
+
+	ret = 0;
+out:
+	free(name);
+	return ret;
+}
+
 int
 rte_pmd_ring_devinit(const char *name, const char *params)  {
+	struct rte_kvargs *kvlist;
+	int ret = 0;
+	struct node_action_list *info = NULL;
+
 	RTE_LOG(INFO, PMD, "Initializing pmd_ring for %s\n", name);
 
+
 	if (params == NULL || params[0] == '\0')
 		eth_dev_ring_create(name, rte_socket_id(), DEV_CREATE);
 	else {
-		RTE_LOG(INFO, PMD, "Ignoring unsupported parameters when creating"
-				" rings-backed ethernet device\n");
-		eth_dev_ring_create(name, rte_socket_id(), DEV_CREATE);
+		printf("Parsing kvargs\n");
+		kvlist = rte_kvargs_parse(params, valid_arguments);
+
+		if (!kvlist) {
+			RTE_LOG(INFO, PMD, "Ignoring unsupported parameters when creating"
+					" rings-backed ethernet device\n");
+			eth_dev_ring_create(name, rte_socket_id(), DEV_CREATE);
+			return 0;
+		} else {
+			eth_dev_ring_create(name, rte_socket_id(), DEV_CREATE);
+			printf("counting kvargs\n");
+			ret = rte_kvargs_count(kvlist, ETH_RING_NUMA_NODE_ACTION_ARG);
+			info = rte_zmalloc("struct node_action_list", sizeof(struct node_action_list) +
+					   (sizeof(struct node_action_pair) * ret), 0);
+			if (!info)
+				goto out;
+
+			info->total = ret;
+			info->list = (struct node_action_pair*)(info + 1);
+
+			printf("We have %d nodeaction pairs\n", info->total);
+			ret = rte_kvargs_process(kvlist, ETH_RING_NUMA_NODE_ACTION_ARG,
+						 parse_kvlist, info);
+
+			if (ret < 0)
+				goto out_free;
+
+			for (info->count = 0; info->count < info->total; info->count++) {
+				printf("Doing something with a ring\n");
+				eth_dev_ring_pair_create(name, info->list[info->count].node,
+						    info->list[info->count].action);
+			}
+				
+		}
 	}
-	return 0;
+
+out_free:
+	rte_free(info);
+out:
+	return ret;
 }
 
 static struct rte_vdev_driver pmd_ring_drv = { @@ -402,9 +510,4 @@ static struct rte_vdev_driver pmd_ring_drv = {
 	.init = rte_pmd_ring_devinit,
 };
 
-__attribute__((constructor))
-static void
-rte_pmd_ring_init(void)
-{
-	rte_eal_vdev_driver_register(&pmd_ring_drv);
-}
+PMD_REGISTER_DRIVER(pmd_ring_drv, PMD_VDEV);
diff --git a/mk/rte.app.mk b/mk/rte.app.mk index e6d09b8..4f167aa 100644
--- a/mk/rte.app.mk
+++ b/mk/rte.app.mk
@@ -133,10 +133,6 @@ ifeq ($(CONFIG_RTE_LIBRTE_ETHER),y)  LDLIBS += -lethdev  endif
 
-ifeq ($(CONFIG_RTE_LIBRTE_PMD_RING),y)
-LDLIBS += -lrte_pmd_ring
-endif
-
 ifeq ($(CONFIG_RTE_LIBRTE_MALLOC),y)
 LDLIBS += -lrte_malloc
 endif
@@ -173,9 +169,19 @@ LDLIBS += -lrte_cmdline  endif
 
 ifeq ($(RTE_BUILD_SHARED_LIB),n)
+
+ifeq ($(CONFIG_RTE_LIBRTE_PMD_RING),y)
+LDLIBS += -lrte_pmd_ring
+endif
+
+ifeq ($(CONFIG_RTE_LIBRTE_PMD_RING),y)
+LDLIBS += -lrte_pmd_ring
+endif
+
 ifeq ($(CONFIG_RTE_LIBRTE_PMD_PCAP),y)
 LDLIBS += -lrte_pmd_pcap -lpcap
 endif
+
 endif
 
 LDLIBS += $(EXECENV_LDLIBS)
--
1.8.3.1

^ permalink raw reply related	[flat|nested] 77+ messages in thread

* Re: [PATCH 03/15] pmd: Add PMD_REGISTER_DRIVER macro
       [not found]                       ` <534F8BFD.6070701-pdR9zngts4EAvxtiuMwx3w@public.gmane.org>
@ 2014-04-17 10:59                         ` Neil Horman
  0 siblings, 0 replies; 77+ messages in thread
From: Neil Horman @ 2014-04-17 10:59 UTC (permalink / raw)
  To: Olivier MATZ; +Cc: dev-VfR2kkLFssw

On Thu, Apr 17, 2014 at 10:08:29AM +0200, Olivier MATZ wrote:
> Hi Neil,
> 
> On 04/16/2014 07:29 PM, Neil Horman wrote:
> >Ok, so look it up.  DPDK is open source and cscope is easy to use.  A
> >module initilization macro is a common method for doing init time binding in
> >modular programming (the best examples are the module_init() and module_exit()
> >macros in the linux kernel).  It wraps up what you need to do to tie a modular
> >piece of your software into the larger main component, without having to know
> >all the boilerplate behind it.
> >
> >Also, if you expose the use of the constructor, then you've
> >broken out the initalization phase to every pmd you implement, and as a result,
> >if you ever need to add code to the initilization step, you have to add it in
> >every pmd, instead of just updating the macro.
> >
> >The bottom line is, your method is 5 lines of boilerplate code thats going to
> >have to get repeated as nauseum for every pmd that gets written giving every PMD
> >author the opportunity to miscode the constructor, vs my one line that, if it
> >compiles, will be correct every time.
> OK, some of your arguments are legitimate and it's a detail point of
> your patches that are globally a nice improvement of the DPDK code.
> 
> But I'd be happy to continue this discussion over a beer ;)
> 
Sure, I'll be in dusseldorf for plumbers this october I think. Perfect place for
a beer :)
Neil

> Regards,
> Olivier
> 
> 

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 05/15] ring: Convert to use of PMD_REGISTER_DRIVER and fix linking
       [not found]         ` <2601191342CEEE43887BDE71AB9772580EF973E4-kPTMFJFq+rEu0RiL9chJVbfspsVTdybXVpNB7YpNyf8@public.gmane.org>
@ 2014-04-17 11:06           ` Neil Horman
  2014-04-17 15:16           ` [PATCH 05/15 v3] " Neil Horman
  1 sibling, 0 replies; 77+ messages in thread
From: Neil Horman @ 2014-04-17 11:06 UTC (permalink / raw)
  To: Ananyev, Konstantin; +Cc: dev-VfR2kkLFssw

On Thu, Apr 17, 2014 at 09:50:02AM +0000, Ananyev, Konstantin wrote:
> Hi Neil,
> Few comments from me there.
> Thanks
> Konstantin
> 
> - parse_kvlist():
> 
> 1)
> node = strchr(name, ':');
> ...
> action = strchr(node, ':');
> 
> We can't expect that input parameter will always be  valid.
> So need to check that strchr() doesn't return NULL.
> 
> 2)
> if (strcmp(action, "ATTACH"))
> 	if (strcmp(action, "CREATE"))
>                    goto out;
> ...
> info->list[info->count].action = strcmp(action, "ATTACH") ? DEV_CREATE : DEV_ATTACH;
> 
> Can you create a macros for these 2 string constants and use them instead.
> Another thing, probably better to reorder it that way:
> 
> if (strcmp(action, "ATTACH") == 0)
>       info->list[info->count].action = DEV_ATTACH;
> else if (strcmp(action, "CREATE") == 0)
>       info->list[info->count].action = DEV_CREATE;
> else 
>     goto out;
> 
> Would save you one strcmp() and looks a bit cleaner.
> 
> 3)
> info->list[info->count].node = strtol(node, NULL, 10);
> Again we can't assume that input string will always be valid.
> Something like that should do, I think:
> 
> char *end;
> ...
> errno = 0;
> info->list[info->count].node = strtoul(node, &end, 10);
> if (errno != 0 || *end != 0) {
>    ret = -EINVAL;
>    goto out;
> }
> 
> 4)
> strncpy(info->list[info->count].name, name, PATH_MAX);
> When RTE_INSECURE_FUNCTION_WARNING is defined,  strncpy() (and some other functions) are marked as poisoned.
> Another thing - as I remember, if strlen(name) >= PATH_MAX, then destination string will not be null terminated.
> So probably something like that instead:
> rte_snprintf(info->list[info->count].name, sizeof(info->list[info->count].name), "%s", name);
> 
> - rte_pmd_ring_devinit():
> 
> 5)
> printf("Parsing kvargs\n"); 
> Here and everywhere - please use RTE_LOG() instead.
> 
> 
Thank you Anayev, I'll square these all up and submit a v2 of this patch.
Neil

^ permalink raw reply	[flat|nested] 77+ messages in thread

* [PATCH 05/15 v3] ring: Convert to use of PMD_REGISTER_DRIVER and fix linking
       [not found]         ` <2601191342CEEE43887BDE71AB9772580EF973E4-kPTMFJFq+rEu0RiL9chJVbfspsVTdybXVpNB7YpNyf8@public.gmane.org>
  2014-04-17 11:06           ` Neil Horman
@ 2014-04-17 15:16           ` Neil Horman
       [not found]             ` <1397747816-23245-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
  1 sibling, 1 reply; 77+ messages in thread
From: Neil Horman @ 2014-04-17 15:16 UTC (permalink / raw)
  To: dev-VfR2kkLFssw

convert the ring driver to use the PMD_REGISTER_DRIVER macro and fix up the
Makefile so that its linkage is only done if we are building static libraries.
This means that the test applications now have no reference to the ring library
when building DSO's and must specify its use on the command line with the -d
option.  Static linking will still initalize the driver automatically.

Note that the ring driver was also written in such a way that it violated some
general layering principles, several functions were contained in the pmd which
were being called by example from the test application in the app/test
directory.  Specifically it was calling eth_ring_pair_attach,
eth_ring_pair_create and rte_eth_ring_devinit, which should only be called
internally to the dpdk core library.  To correct this I've removed those
functions, and instead allowed them to be called indirectly at initalization
time using the vdev command line argument key nodeaction=<name>:<node>:<action>
where action is one of ATTACH or CREATE.  I've tested out the functionality of
the command line with the testpmd utility, with success, and have removed the
called functions from the test utility.  This will affect how the test utility
is invoked (the -d and --vdev option will need to be specified on the command
line now), but honestly, given the way it was coded, I think the testing of the
ring pmd was not the best example of how to code with dpdk to begin with.  I
have also left the two layer violating functions in place, so as not to break
existing applications, but added deprecation warnings to them so that apps can
migrate off them.

Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>

---
Change notes

v2) fixed DEPDIR specifcation, should depend on RING not PCAP

v3) Cleaned up strcmp error checking, printfs, and other parsing issues as
pointed out by Konstantin Ananyev <konstantin.ananyev-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
---
 app/test/test_pmd_ring.c           |  95 -------------------------
 lib/librte_pmd_ring/Makefile       |   1 +
 lib/librte_pmd_ring/rte_eth_ring.c | 141 ++++++++++++++++++++++++++++++++++---
 mk/rte.app.mk                      |  14 ++--
 4 files changed, 142 insertions(+), 109 deletions(-)

diff --git a/app/test/test_pmd_ring.c b/app/test/test_pmd_ring.c
index 4d9c2ba..1fe38fa 100644
--- a/app/test/test_pmd_ring.c
+++ b/app/test/test_pmd_ring.c
@@ -42,7 +42,6 @@
 /* two test rings, r1 is used by two ports, r2 just by one */
 static struct rte_ring *r1[2], *r2;
 
-static struct rte_ring *nullring = NULL;
 static struct rte_mempool *mp;
 static uint8_t start_idx; /* will store the port id of the first of our new ports */
 
@@ -59,58 +58,6 @@ static uint8_t start_idx; /* will store the port id of the first of our new port
 #define MBUF_SIZE (2048 + sizeof(struct rte_mbuf) + RTE_PKTMBUF_HEADROOM)
 #define NB_MBUF   512
 
-
-static int
-test_ring_ethdev_create(void)
-{
-	int retval;
-	printf("Testing ring pmd create\n");
-
-	retval = rte_eth_from_rings(NULL, 0, NULL, 0, SOCKET0);
-	if (retval < 0) {
-		printf("Failure, failed to create zero-sized RXTX ring pmd\n");
-		return -1;
-	}
-
-	retval = rte_eth_from_rings(NULL, 0, NULL, 0, RTE_MAX_NUMA_NODES);
-	if (retval >= 0) {
-		printf("Failure, can create ring pmd on socket %d\n", RTE_MAX_NUMA_NODES);
-		return -1;
-	}
-
-	retval = rte_eth_from_rings(NULL, 1, &r2, 1, SOCKET0);
-	if (retval >= 0) {
-		printf("Failure, can create pmd with null rx rings\n");
-		return -1;
-	}
-
-	retval = rte_eth_from_rings(r1, 1, NULL, 1, SOCKET0);
-	if (retval >= 0) {
-		printf("Failure, can create pmd with null tx rings\n");
-		return -1;
-	}
-
-	retval = rte_eth_from_rings(&nullring, 1, r1, 2, SOCKET0);
-	if (retval < 0) {
-		printf("Failure, failed to create TX-only ring pmd\n");
-		return -1;
-	}
-
-	retval = rte_eth_from_rings(r1, 1, &nullring, 1, SOCKET0);
-	if (retval < 0) {
-		printf("Failure, failed to create RX-only ring pmd\n");
-		return -1;
-	}
-
-	retval = rte_eth_from_rings(&r2, 1, &r2, 1, SOCKET0);
-	if (retval < 0) {
-		printf("Failure, failed to create RXTX ring pmd\n");
-		return -1;
-	}
-
-	return 0;
-}
-
 static int
 test_ethdev_configure(void)
 {
@@ -305,26 +252,12 @@ test_stats_reset(void)
 static int 
 test_pmd_ring_init(void)
 {
-	const char * name1 = "R3";
-	const char * name2 = "R4";
-	const char * params_null = NULL;
-	const char * params = "PARAMS";
 	struct rte_eth_stats stats;
 	struct rte_mbuf buf, *pbuf = &buf;
 	struct rte_eth_conf null_conf;
 
 	printf("Testing ring pmd init\n");
 
-	if (rte_pmd_ring_devinit(name1, params_null) < 0) {
-		printf("Testing ring pmd init fail\n");
-		return -1;
-	}
-
-	if (rte_pmd_ring_devinit(name2, params) < 0) {
-		printf("Testing ring pmd init fail\n");
-		return -1;
-	}
-
 	if (RXTX_PORT2 >= RTE_MAX_ETHPORTS) {
 		printf(" TX/RX port exceed max eth ports\n");
 		return -1;
@@ -371,24 +304,16 @@ test_pmd_ring_init(void)
 
 	rte_eth_dev_stop(RXTX_PORT2);
 
-	/* Test init same name pmd ring */
-	rte_pmd_ring_devinit(name1, params_null);
 	return 0;
 }
 
 static int
 test_pmd_ring_pair_create(void)
 {
-	const char * name1 = "_RNG_P0";
 	struct rte_eth_stats stats, stats2;
 	struct rte_mbuf buf, *pbuf = &buf;
 	struct rte_eth_conf null_conf;
 
-	if (rte_eth_ring_pair_create(name1, SOCKET0) < 0) {
-		printf("Create ring pair failed\n");
-		return -1;
-	}
-
 	if ((RXTX_PORT4 >= RTE_MAX_ETHPORTS) || (RXTX_PORT5 >= RTE_MAX_ETHPORTS)) {
 		printf(" TX/RX port exceed max eth ports\n");
 		return -1;
@@ -447,28 +372,16 @@ test_pmd_ring_pair_create(void)
 	rte_eth_dev_stop(RXTX_PORT4);
 	rte_eth_dev_stop(RXTX_PORT5);
 
-	/* Test create same name ring pair */
-	if (rte_eth_ring_pair_create(name1, SOCKET0) == 0) {
-		printf("Create same name ring pair error\n");
-		return -1;
-	}
 	return 0;
 }
 
 static int
 test_pmd_ring_pair_attach(void)
 {
-	const char * name1 = "_RNG_P0";
-	const char * name2 = "_RNG_P1";
 	struct rte_eth_stats stats, stats2;
 	struct rte_mbuf buf, *pbuf = &buf;
 	struct rte_eth_conf null_conf;
 
-	if (rte_eth_ring_pair_attach(name1, SOCKET0) < 0) {
-		printf("Attach ring pair failed\n");
-		return -1;
-	}
-
 	if ((RXTX_PORT4 >= RTE_MAX_ETHPORTS) || (RXTX_PORT5 >= RTE_MAX_ETHPORTS)) {
 		printf(" TX/RX port exceed max eth ports\n");
 		return -1;
@@ -529,11 +442,6 @@ test_pmd_ring_pair_attach(void)
 	rte_eth_dev_stop(RXTX_PORT4);
 	rte_eth_dev_stop(RXTX_PORT5);
 	
-	/* Test attach non-existing ring pair */
-	if (rte_eth_ring_pair_attach(name2, SOCKET0) == 0) {
-		printf("Attach non-existing ring pair error\n");
-		return -1;
-	}
 	return 0;
 }
 
@@ -568,9 +476,6 @@ test_pmd_ring(void)
 		return -1;
 	}
 
-	if (test_ring_ethdev_create() < 0)
-		return -1;
-
 	if (test_ethdev_configure() < 0)
 		return -1;
 
diff --git a/lib/librte_pmd_ring/Makefile b/lib/librte_pmd_ring/Makefile
index 73b2d38..35d40cb 100644
--- a/lib/librte_pmd_ring/Makefile
+++ b/lib/librte_pmd_ring/Makefile
@@ -52,5 +52,6 @@ SYMLINK-y-include += rte_eth_ring.h
 # this lib depends upon:
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_RING) += lib/librte_eal lib/librte_ring
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_RING) += lib/librte_mbuf lib/librte_ether
+DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_RING) += lib/librte_kvargs
 
 include $(RTE_SDK)/mk/rte.lib.mk
diff --git a/lib/librte_pmd_ring/rte_eth_ring.c b/lib/librte_pmd_ring/rte_eth_ring.c
index cee3fff..3a129b6 100644
--- a/lib/librte_pmd_ring/rte_eth_ring.c
+++ b/lib/librte_pmd_ring/rte_eth_ring.c
@@ -38,6 +38,17 @@
 #include <rte_memcpy.h>
 #include <rte_string_fns.h>
 #include <rte_vdev.h>
+#include <rte_pmd.h>
+#include <rte_kvargs.h>
+
+#define ETH_RING_NUMA_NODE_ACTION_ARG	"nodeaction"
+#define ETH_RING_ACTION_CREATE		"CREATE"
+#define ETH_RING_ACTION_ATTACH		"ATTACH"
+	
+static const char *valid_arguments[] = {
+	ETH_RING_NUMA_NODE_ACTION_ARG,
+	NULL
+};
 
 struct ring_queue {
 	struct rte_ring *rng;
@@ -373,28 +384,143 @@ eth_dev_ring_pair_create(const char *name, const unsigned numa_node,
 int
 rte_eth_ring_pair_create(const char *name, const unsigned numa_node)
 {
+	RTE_LOG(WARNING, PMD, "rte_eth_ring_pair_create is deprecated\n");
 	return eth_dev_ring_pair_create(name, numa_node, DEV_CREATE);
 }
 
 int
 rte_eth_ring_pair_attach(const char *name, const unsigned numa_node)
 {
+	RTE_LOG(WARNING, PMD, "rte_eth_ring_pair_attach is deprecated\n");
 	return eth_dev_ring_pair_create(name, numa_node, DEV_ATTACH);
 }
 
+struct node_action_pair {
+	char name[PATH_MAX];
+	unsigned node;
+	enum dev_action action;
+};
+
+struct node_action_list {
+	unsigned total;
+	unsigned count;
+	struct node_action_pair *list;
+};
+
+static int parse_kvlist (const char *key __rte_unused, const char *value, void *data)
+{
+	struct node_action_list *info = data;
+	int ret;
+	char *name;
+	char *action;
+	char *node;
+	char *end;
+
+	name = strdup(value);
+
+	ret = -EINVAL;
+
+	if (!name) {
+		RTE_LOG(WARNING, PMD, "command line paramter is empty for ring pmd!\n");
+		goto out;
+	}
+
+	node = strchr(name, ':');
+	if (!node) {
+		RTE_LOG(WARNING, PMD, "could not parse node value from %s", name);
+		goto out;
+	}
+
+	*node = '\0';
+	node++;
+
+	action = strchr(node, ':');
+	if (!action) {
+		RTE_LOG(WARNING, PMD, "could not action value from %s", node);
+		goto out;
+	}
+
+	*action = '\0';
+	action++;
+
+	/*
+	 * Need to do some sanity checking here
+	 */
+
+	if (strcmp(action, ETH_RING_ACTION_ATTACH) == 0)
+		info->list[info->count].action = DEV_ATTACH;
+	else if (strcmp(action, ETH_RING_ACTION_CREATE) == 0)
+		info->list[info->count].action = DEV_CREATE;
+	else
+		goto out;
+
+	errno = 0;
+	info->list[info->count].node = strtol(node, &end, 10);
+
+	if ((errno != 0) || (*end != '\0')) {
+		RTE_LOG(WARNING, PMD, "node value %s is unparseable as a number\n", node);
+		goto out;
+	}
+
+	rte_snprintf(info->list[info->count].name, sizeof(info->list[info->count].name), "%s", name);
+
+	info->count++;
+
+	ret = 0;
+out:
+	free(name);
+	return ret;
+}
+
 int
 rte_pmd_ring_devinit(const char *name, const char *params)
 {
+	struct rte_kvargs *kvlist;
+	int ret = 0;
+	struct node_action_list *info = NULL;
+
 	RTE_LOG(INFO, PMD, "Initializing pmd_ring for %s\n", name);
 
+
 	if (params == NULL || params[0] == '\0')
 		eth_dev_ring_create(name, rte_socket_id(), DEV_CREATE);
 	else {
-		RTE_LOG(INFO, PMD, "Ignoring unsupported parameters when creating"
-				" rings-backed ethernet device\n");
-		eth_dev_ring_create(name, rte_socket_id(), DEV_CREATE);
+		kvlist = rte_kvargs_parse(params, valid_arguments);
+
+		if (!kvlist) {
+			RTE_LOG(INFO, PMD, "Ignoring unsupported parameters when creating"
+					" rings-backed ethernet device\n");
+			eth_dev_ring_create(name, rte_socket_id(), DEV_CREATE);
+			return 0;
+		} else {
+			eth_dev_ring_create(name, rte_socket_id(), DEV_CREATE);
+			ret = rte_kvargs_count(kvlist, ETH_RING_NUMA_NODE_ACTION_ARG);
+			info = rte_zmalloc("struct node_action_list", sizeof(struct node_action_list) +
+					   (sizeof(struct node_action_pair) * ret), 0);
+			if (!info)
+				goto out;
+
+			info->total = ret;
+			info->list = (struct node_action_pair*)(info + 1);
+
+			ret = rte_kvargs_process(kvlist, ETH_RING_NUMA_NODE_ACTION_ARG,
+						 parse_kvlist, info); 
+
+			if (ret < 0)
+				goto out_free;
+
+			for (info->count = 0; info->count < info->total; info->count++) {
+				eth_dev_ring_pair_create(name, info->list[info->count].node,
+						    info->list[info->count].action);
+			}
+				
+		}
 	}
-	return 0;
+
+out_free:
+	rte_free(info);
+out:
+	return ret;
 }
 
 static struct rte_vdev_driver pmd_ring_drv = {
@@ -402,9 +528,4 @@ static struct rte_vdev_driver pmd_ring_drv = {
 	.init = rte_pmd_ring_devinit,
 };
 
-__attribute__((constructor))
-static void
-rte_pmd_ring_init(void)
-{
-	rte_eal_vdev_driver_register(&pmd_ring_drv);
-}
+PMD_REGISTER_DRIVER(pmd_ring_drv, PMD_VDEV);
diff --git a/mk/rte.app.mk b/mk/rte.app.mk
index e6d09b8..4f167aa 100644
--- a/mk/rte.app.mk
+++ b/mk/rte.app.mk
@@ -133,10 +133,6 @@ ifeq ($(CONFIG_RTE_LIBRTE_ETHER),y)
 LDLIBS += -lethdev
 endif
 
-ifeq ($(CONFIG_RTE_LIBRTE_PMD_RING),y)
-LDLIBS += -lrte_pmd_ring
-endif
-
 ifeq ($(CONFIG_RTE_LIBRTE_MALLOC),y)
 LDLIBS += -lrte_malloc
 endif
@@ -173,9 +169,19 @@ LDLIBS += -lrte_cmdline
 endif
 
 ifeq ($(RTE_BUILD_SHARED_LIB),n)
+
+ifeq ($(CONFIG_RTE_LIBRTE_PMD_RING),y)
+LDLIBS += -lrte_pmd_ring
+endif
+
+ifeq ($(CONFIG_RTE_LIBRTE_PMD_RING),y)
+LDLIBS += -lrte_pmd_ring
+endif
+
 ifeq ($(CONFIG_RTE_LIBRTE_PMD_PCAP),y)
 LDLIBS += -lrte_pmd_pcap -lpcap
 endif
+
 endif
 
 LDLIBS += $(EXECENV_LDLIBS)
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 77+ messages in thread

* Re: [PATCH 01/15 v2] makefiles: Fixed -share command line option error
       [not found]         ` <1397656304-468-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
@ 2014-04-18 11:23           ` Thomas Monjalon
  2014-04-18 13:18             ` Neil Horman
  2014-04-29 23:42           ` Thomas Monjalon
  1 sibling, 1 reply; 77+ messages in thread
From: Thomas Monjalon @ 2014-04-18 11:23 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev-VfR2kkLFssw

Hi Neil,

2014-04-16 09:51, Neil Horman:
> The shared libraries built with the current makefile set produce static
> libraries rather than actual shared objects.  This is due to several missing
> options that are required to correctly build shared objects using ld, as
> well as a mis-specified -share option (which should be -shared). Switching
> to the use of CC rather than LD and fixing the -shared option corrects
> these problems and builds the DSOs correctly.
> 
> Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
[...]
> --- a/mk/rte.lib.mk
> +++ b/mk/rte.lib.mk
[...]
> +ifeq ($(LINK_USING_CC),1)
> +# Override the definition of LD here, since we're linking with CC
> +LD := $(CC)
> +endif
[...]
> -O_TO_S = $(LD) $(CPU_LDFLAGS) -z muldefs -share $(OBJS-y) -o $(LIB)
> +O_TO_S = $(LD) $(CPU_LDFLAGS) -z muldefs -shared $(OBJS-y) -o $(LIB)

I think that CPU_LDFLAGS should be prefixed with -Wl, in case of CC linking.
So blindly assigning CC to LD variable seems a bad idea.
Other makefiles have different O_TO_S commands depending of LINK_USING_CC.

> --- a/mk/rte.sharelib.mk
> +++ b/mk/rte.sharelib.mk
[...]
> -O_TO_S = $(LD) $(CPU_LDFLAGS) -share $(OBJS) -o $(RTE_OUTPUT)/lib/$(LIB_ONE)
> +O_TO_S = $(LD) $(CPU_LDFLAGS) -shared $(OBJS) -o $(RTE_OUTPUT)/lib/$(LIB_ONE)

Why not using CC here whether LINK_USING_CC is enabled?

Feel free to send a v3 ;)
-- 
Thomas

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 03/15] pmd: Add PMD_REGISTER_DRIVER macro
       [not found]     ` <1397585169-14537-4-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
  2014-04-16 11:52       ` Thomas Monjalon
@ 2014-04-18 11:42       ` Thomas Monjalon
  2014-04-18 12:04         ` Neil Horman
  1 sibling, 1 reply; 77+ messages in thread
From: Thomas Monjalon @ 2014-04-18 11:42 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev-VfR2kkLFssw

2014-04-15 14:05, Neil Horman:
> Rather than have each driver have to remember to add a constructor to it to
> make sure its gets registered properly, wrap that process up in a macro to
> make registration a one line affair.  This also sets the stage for us to
> make registration of vdev pmds and physical pmds a uniform process
> 
> Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>

> --- /dev/null
> +++ b/lib/librte_eal/common/include/rte_pmd.h

So you are creating a new header file for PMD API, right?

According to rte_ethdev.h,
"The Ethernet Device API is composed of two parts:"
"- The application-oriented Ethernet API"
"- The driver-oriented Ethernet API"

So we should implement this macro in rte_ethdev.h.
But maybe you prefer to split this file in two files. If so, please send a 
separated patch for that.

Thanks
-- 
Thomas

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 07/15] eal: Make vdev init path generic for both virtual and physcial devices
       [not found]     ` <1397585169-14537-8-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
@ 2014-04-18 12:02       ` Thomas Monjalon
  0 siblings, 0 replies; 77+ messages in thread
From: Thomas Monjalon @ 2014-04-18 12:02 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev-VfR2kkLFssw

I have some comments inline.

2014-04-15 14:06, Neil Horman:
> Currently, physical device pmds use a separate initalization path
> (rte_pmd_init_all) while virtual devices use a constructor registration and
> rte_eal_dev_init.  Theres no reason to have them be separate.  This patch
> removes the vdev specific nomenclature from the vdev init path and makes it
> more generic for use with all pmds.  This is the first step in converting
> the physical device pmds to using the same constructor based registration
> path that the virtual devices use
> 
> Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>

> -	if (rte_eal_vdev_init() < 0)
> +	if (rte_eal_dev_init() < 0)
>  		rte_panic("Cannot init virtual devices\n");

You should update the panic log here.

> +/** Global list of virtual device drivers. */
> +static struct rte_driver_list dev_driver_list =
> +	TAILQ_HEAD_INITIALIZER(dev_driver_list);

Same comment about "virtual device".

> +	/* No need to register drivers that are embeded in DPDK
> +	 * (pmd_pcap, pmd_ring, ...). The initialization function have
> +	 * the ((constructor)) attribute so they will register at
> +	 * startup. */

Should we keep this comment?

> +#ifndef _RTE_VDEV_H_
> +#define _RTE_VDEV_H_

Should be _RTE_DEV_H_

> +/**
> + * @file
> + *
> + * RTE Virtual Devices Interface
> + *
> + * This file manages the list of the virtual device drivers.
> + */

Not only virtual.

> +/** Double linked list of virtual device drivers. */
[...]
> + * Initialization function called for each virtual device probing.
[...]
> +/**
> + * A structure describing a virtual device driver.
> + */
[...]
> + * Register a virtual device driver.
[...]
> + * Unregister a virtual device driver.

You probably understood the idea ;)

> --- a/lib/librte_eal/linuxapp/eal/eal.c
> +++ b/lib/librte_eal/linuxapp/eal/eal.c
> -	if (rte_eal_vdev_init() < 0)
> +	if (rte_eal_dev_init() < 0)
>  		rte_panic("Cannot init virtual devices\n");

Still "virtual" typo

Except typos, it seems a good step.
I think we could abstract more things in order to have even simpler API and 
simpler command line. But we'll see it in another step.

Thanks
-- 
Thomas

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 03/15] pmd: Add PMD_REGISTER_DRIVER macro
  2014-04-18 11:42       ` Thomas Monjalon
@ 2014-04-18 12:04         ` Neil Horman
       [not found]           ` <20140418120409.GB2812-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
  0 siblings, 1 reply; 77+ messages in thread
From: Neil Horman @ 2014-04-18 12:04 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev-VfR2kkLFssw

On Fri, Apr 18, 2014 at 04:42:01AM -0700, Thomas Monjalon wrote:
> 2014-04-15 14:05, Neil Horman:
> > Rather than have each driver have to remember to add a constructor to it to
> > make sure its gets registered properly, wrap that process up in a macro to
> > make registration a one line affair.  This also sets the stage for us to
> > make registration of vdev pmds and physical pmds a uniform process
> > 
> > Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
> 
> > --- /dev/null
> > +++ b/lib/librte_eal/common/include/rte_pmd.h
> 
> So you are creating a new header file for PMD API, right?
> 
> According to rte_ethdev.h,
> "The Ethernet Device API is composed of two parts:"
> "- The application-oriented Ethernet API"
> "- The driver-oriented Ethernet API"
> 
> So we should implement this macro in rte_ethdev.h.
> But maybe you prefer to split this file in two files. If so, please send a 
> separated patch for that.
> 
Actually I'm fine with moving the macro to another file, though if I do, I think
merging it into rte_dev.h is more appropriate, as thats where the driver
registration function lives.

Neil

> Thanks
> -- 
> Thomas
> 

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 03/15] pmd: Add PMD_REGISTER_DRIVER macro
       [not found]           ` <20140418120409.GB2812-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
@ 2014-04-18 12:08             ` Thomas Monjalon
  2014-04-18 13:20               ` Neil Horman
  0 siblings, 1 reply; 77+ messages in thread
From: Thomas Monjalon @ 2014-04-18 12:08 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev-VfR2kkLFssw

2014-04-18 08:04, Neil Horman:
> On Fri, Apr 18, 2014 at 04:42:01AM -0700, Thomas Monjalon wrote:
> > 2014-04-15 14:05, Neil Horman:
> > > Rather than have each driver have to remember to add a constructor to it
> > > to
> > > make sure its gets registered properly, wrap that process up in a macro
> > > to
> > > make registration a one line affair.  This also sets the stage for us to
> > > make registration of vdev pmds and physical pmds a uniform process
> > > 
> > > Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
> > > 
> > > --- /dev/null
> > > +++ b/lib/librte_eal/common/include/rte_pmd.h
> > 
> > So you are creating a new header file for PMD API, right?
> > 
> > According to rte_ethdev.h,
> > "The Ethernet Device API is composed of two parts:"
> > "- The application-oriented Ethernet API"
> > "- The driver-oriented Ethernet API"
> > 
> > So we should implement this macro in rte_ethdev.h.
> > But maybe you prefer to split this file in two files. If so, please send a
> > separated patch for that.
> 
> Actually I'm fine with moving the macro to another file, though if I do, I
> think merging it into rte_dev.h is more appropriate, as thats where the
> driver registration function lives.

I'm not sure to understand what you're saying.
My suggestion is to have 2 files in lib/librte_ether: 1 for application API 
and 1 for PMD API.

-- 
Thomas

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 01/15 v2] makefiles: Fixed -share command line option error
  2014-04-18 11:23           ` Thomas Monjalon
@ 2014-04-18 13:18             ` Neil Horman
       [not found]               ` <20140418131849.GC4053-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
  0 siblings, 1 reply; 77+ messages in thread
From: Neil Horman @ 2014-04-18 13:18 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev-VfR2kkLFssw

On Fri, Apr 18, 2014 at 01:23:19PM +0200, Thomas Monjalon wrote:
> Hi Neil,
> 
> 2014-04-16 09:51, Neil Horman:
> > The shared libraries built with the current makefile set produce static
> > libraries rather than actual shared objects.  This is due to several missing
> > options that are required to correctly build shared objects using ld, as
> > well as a mis-specified -share option (which should be -shared). Switching
> > to the use of CC rather than LD and fixing the -shared option corrects
> > these problems and builds the DSOs correctly.
> > 
> > Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
> [...]
> > --- a/mk/rte.lib.mk
> > +++ b/mk/rte.lib.mk
> [...]
> > +ifeq ($(LINK_USING_CC),1)
> > +# Override the definition of LD here, since we're linking with CC
> > +LD := $(CC)
> > +endif
> [...]
> > -O_TO_S = $(LD) $(CPU_LDFLAGS) -z muldefs -share $(OBJS-y) -o $(LIB)
> > +O_TO_S = $(LD) $(CPU_LDFLAGS) -z muldefs -shared $(OBJS-y) -o $(LIB)
> 
> I think that CPU_LDFLAGS should be prefixed with -Wl, in case of CC linking.
> So blindly assigning CC to LD variable seems a bad idea.
> Other makefiles have different O_TO_S commands depending of LINK_USING_CC.
> 
I'm not so sure about that.  Or more specifically, I wonder if some more rework
isn't needed here.  I say that because, while what you say makes sense in terms
of formatting the CPU_FLAGS variable for use with CC, the only current use of
CPU_LDFLAGS set -melf_i386, which IIRC is a gcc flag, not meant to be passed to
LD.  I can change the makefile to completely rewrite the comand based on
LINK_USING_CC, but it seems to me that CPU_LDFLAGS should not be passed in the
use of the LD case.  

thoughts?
Neil

> > --- a/mk/rte.sharelib.mk
> > +++ b/mk/rte.sharelib.mk
> [...]
> > -O_TO_S = $(LD) $(CPU_LDFLAGS) -share $(OBJS) -o $(RTE_OUTPUT)/lib/$(LIB_ONE)
> > +O_TO_S = $(LD) $(CPU_LDFLAGS) -shared $(OBJS) -o $(RTE_OUTPUT)/lib/$(LIB_ONE)
> 
> Why not using CC here whether LINK_USING_CC is enabled?
> 
> Feel free to send a v3 ;)
> -- 
> Thomas
> 

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 03/15] pmd: Add PMD_REGISTER_DRIVER macro
  2014-04-18 12:08             ` Thomas Monjalon
@ 2014-04-18 13:20               ` Neil Horman
       [not found]                 ` <20140418132054.GD4053-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
  0 siblings, 1 reply; 77+ messages in thread
From: Neil Horman @ 2014-04-18 13:20 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev-VfR2kkLFssw

On Fri, Apr 18, 2014 at 02:08:56PM +0200, Thomas Monjalon wrote:
> 2014-04-18 08:04, Neil Horman:
> > On Fri, Apr 18, 2014 at 04:42:01AM -0700, Thomas Monjalon wrote:
> > > 2014-04-15 14:05, Neil Horman:
> > > > Rather than have each driver have to remember to add a constructor to it
> > > > to
> > > > make sure its gets registered properly, wrap that process up in a macro
> > > > to
> > > > make registration a one line affair.  This also sets the stage for us to
> > > > make registration of vdev pmds and physical pmds a uniform process
> > > > 
> > > > Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
> > > > 
> > > > --- /dev/null
> > > > +++ b/lib/librte_eal/common/include/rte_pmd.h
> > > 
> > > So you are creating a new header file for PMD API, right?
> > > 
> > > According to rte_ethdev.h,
> > > "The Ethernet Device API is composed of two parts:"
> > > "- The application-oriented Ethernet API"
> > > "- The driver-oriented Ethernet API"
> > > 
> > > So we should implement this macro in rte_ethdev.h.
> > > But maybe you prefer to split this file in two files. If so, please send a
> > > separated patch for that.
> > 
> > Actually I'm fine with moving the macro to another file, though if I do, I
> > think merging it into rte_dev.h is more appropriate, as thats where the
> > driver registration function lives.
> 
> I'm not sure to understand what you're saying.
> My suggestion is to have 2 files in lib/librte_ether: 1 for application API 
> and 1 for PMD API.
> 
I'm suggesting not having 2 files at all, and merging rte_pmd.h into into
rte_dev.h, which is where all the rest of the device registration code lives
already.  Does that make sense?
Neil

> -- 
> Thomas
> 

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 01/15 v2] makefiles: Fixed -share command line option error
       [not found]               ` <20140418131849.GC4053-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
@ 2014-04-18 13:29                 ` Thomas Monjalon
  2014-04-18 17:36                   ` Neil Horman
  2014-04-21 14:41                   ` Neil Horman
  0 siblings, 2 replies; 77+ messages in thread
From: Thomas Monjalon @ 2014-04-18 13:29 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev-VfR2kkLFssw

2014-04-18 09:18, Neil Horman:
> On Fri, Apr 18, 2014 at 01:23:19PM +0200, Thomas Monjalon wrote:
> > I think that CPU_LDFLAGS should be prefixed with -Wl, in case of CC
> > linking. So blindly assigning CC to LD variable seems a bad idea.
> > Other makefiles have different O_TO_S commands depending of LINK_USING_CC.
> 
> I'm not so sure about that.  Or more specifically, I wonder if some more
> rework isn't needed here.  I say that because, while what you say makes
> sense in terms of formatting the CPU_FLAGS variable for use with CC, the
> only current use of CPU_LDFLAGS set -melf_i386, which IIRC is a gcc flag,
> not meant to be passed to LD.  I can change the makefile to completely
> rewrite the comand based on LINK_USING_CC, but it seems to me that
> CPU_LDFLAGS should not be passed in the use of the LD case.

Right, -melf_i386 shouldn't be a LDFLAG.
Feel free to fix it.
By the way, It's cleaner to prepare -Wl prefixing and keep an empty LDFLAGS.

-- 
Thomas

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 03/15] pmd: Add PMD_REGISTER_DRIVER macro
       [not found]                 ` <20140418132054.GD4053-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
@ 2014-04-18 13:32                   ` Thomas Monjalon
  2014-04-18 17:42                     ` Neil Horman
  0 siblings, 1 reply; 77+ messages in thread
From: Thomas Monjalon @ 2014-04-18 13:32 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev-VfR2kkLFssw

2014-04-18 09:20, Neil Horman:
> On Fri, Apr 18, 2014 at 02:08:56PM +0200, Thomas Monjalon wrote:
> > 2014-04-18 08:04, Neil Horman:
> > > On Fri, Apr 18, 2014 at 04:42:01AM -0700, Thomas Monjalon wrote:
> > > > 2014-04-15 14:05, Neil Horman:
> > > > > Rather than have each driver have to remember to add a constructor
> > > > > to it
> > > > > to
> > > > > make sure its gets registered properly, wrap that process up in a
> > > > > macro
> > > > > to
> > > > > make registration a one line affair.  This also sets the stage for
> > > > > us to
> > > > > make registration of vdev pmds and physical pmds a uniform process
> > > > > 
> > > > > Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
> > > > > 
> > > > > --- /dev/null
> > > > > +++ b/lib/librte_eal/common/include/rte_pmd.h
> > > > 
> > > > So you are creating a new header file for PMD API, right?
> > > > 
> > > > According to rte_ethdev.h,
> > > > "The Ethernet Device API is composed of two parts:"
> > > > "- The application-oriented Ethernet API"
> > > > "- The driver-oriented Ethernet API"
> > > > 
> > > > So we should implement this macro in rte_ethdev.h.
> > > > But maybe you prefer to split this file in two files. If so, please
> > > > send a
> > > > separated patch for that.
> > > 
> > > Actually I'm fine with moving the macro to another file, though if I do,
> > > I
> > > think merging it into rte_dev.h is more appropriate, as thats where the
> > > driver registration function lives.
> > 
> > I'm not sure to understand what you're saying.
> > My suggestion is to have 2 files in lib/librte_ether: 1 for application
> > API
> > and 1 for PMD API.
> 
> I'm suggesting not having 2 files at all, and merging rte_pmd.h into into
> rte_dev.h, which is where all the rest of the device registration code lives
> already.  Does that make sense?

Oh yes, I didn't understand because you speak about rte_dev.h which is 
actually rte_ethdev.h.

I'm fine with keeping it. I just was wondering if it would be a cleaner API by 
splitting it as it has 2 very different roles.

-- 
Thomas

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 01/15 v2] makefiles: Fixed -share command line option error
  2014-04-18 13:29                 ` Thomas Monjalon
@ 2014-04-18 17:36                   ` Neil Horman
  2014-04-21 14:41                   ` Neil Horman
  1 sibling, 0 replies; 77+ messages in thread
From: Neil Horman @ 2014-04-18 17:36 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev-VfR2kkLFssw

On Fri, Apr 18, 2014 at 03:29:01PM +0200, Thomas Monjalon wrote:
> 2014-04-18 09:18, Neil Horman:
> > On Fri, Apr 18, 2014 at 01:23:19PM +0200, Thomas Monjalon wrote:
> > > I think that CPU_LDFLAGS should be prefixed with -Wl, in case of CC
> > > linking. So blindly assigning CC to LD variable seems a bad idea.
> > > Other makefiles have different O_TO_S commands depending of LINK_USING_CC.
> > 
> > I'm not so sure about that.  Or more specifically, I wonder if some more
> > rework isn't needed here.  I say that because, while what you say makes
> > sense in terms of formatting the CPU_FLAGS variable for use with CC, the
> > only current use of CPU_LDFLAGS set -melf_i386, which IIRC is a gcc flag,
> > not meant to be passed to LD.  I can change the makefile to completely
> > rewrite the comand based on LINK_USING_CC, but it seems to me that
> > CPU_LDFLAGS should not be passed in the use of the LD case.
> 
> Right, -melf_i386 shouldn't be a LDFLAG.
> Feel free to fix it.
> By the way, It's cleaner to prepare -Wl prefixing and keep an empty LDFLAGS.
> 
Right, We're heading into a long weekend here.  On monday I'll clean this up by
separating the LD and CC commands based on LINK_USING_CC, and pass the proper
options to each.

Neil

> -- 
> Thomas
> 

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 03/15] pmd: Add PMD_REGISTER_DRIVER macro
  2014-04-18 13:32                   ` Thomas Monjalon
@ 2014-04-18 17:42                     ` Neil Horman
  0 siblings, 0 replies; 77+ messages in thread
From: Neil Horman @ 2014-04-18 17:42 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev-VfR2kkLFssw

On Fri, Apr 18, 2014 at 03:32:15PM +0200, Thomas Monjalon wrote:
> 2014-04-18 09:20, Neil Horman:
> > On Fri, Apr 18, 2014 at 02:08:56PM +0200, Thomas Monjalon wrote:
> > > 2014-04-18 08:04, Neil Horman:
> > > > On Fri, Apr 18, 2014 at 04:42:01AM -0700, Thomas Monjalon wrote:
> > > > > 2014-04-15 14:05, Neil Horman:
> > > > > > Rather than have each driver have to remember to add a constructor
> > > > > > to it
> > > > > > to
> > > > > > make sure its gets registered properly, wrap that process up in a
> > > > > > macro
> > > > > > to
> > > > > > make registration a one line affair.  This also sets the stage for
> > > > > > us to
> > > > > > make registration of vdev pmds and physical pmds a uniform process
> > > > > > 
> > > > > > Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
> > > > > > 
> > > > > > --- /dev/null
> > > > > > +++ b/lib/librte_eal/common/include/rte_pmd.h
> > > > > 
> > > > > So you are creating a new header file for PMD API, right?
> > > > > 
> > > > > According to rte_ethdev.h,
> > > > > "The Ethernet Device API is composed of two parts:"
> > > > > "- The application-oriented Ethernet API"
> > > > > "- The driver-oriented Ethernet API"
> > > > > 
> > > > > So we should implement this macro in rte_ethdev.h.
> > > > > But maybe you prefer to split this file in two files. If so, please
> > > > > send a
> > > > > separated patch for that.
> > > > 
> > > > Actually I'm fine with moving the macro to another file, though if I do,
> > > > I
> > > > think merging it into rte_dev.h is more appropriate, as thats where the
> > > > driver registration function lives.
> > > 
> > > I'm not sure to understand what you're saying.
> > > My suggestion is to have 2 files in lib/librte_ether: 1 for application
> > > API
> > > and 1 for PMD API.
> > 
> > I'm suggesting not having 2 files at all, and merging rte_pmd.h into into
> > rte_dev.h, which is where all the rest of the device registration code lives
> > already.  Does that make sense?
> 
> Oh yes, I didn't understand because you speak about rte_dev.h which is 
> actually rte_ethdev.h.
> 
No, its not.  Oliviers patch set introduced rte_dev.h to add the driver
registration functions.  I had rte_pmd.h separately since we were apparently
developing in parallel.  Since you accepted his, I'm fine with merging the one
macro in rte_pmd.h into his rte_dev.h header, since the functionality all goes
together there.

> I'm fine with keeping it. I just was wondering if it would be a cleaner API by 
> splitting it as it has 2 very different roles.
> 
You've already got it split (rte_ethdev.h for ethernet interface registration,
and rte_dev.h for pmd driver registration).  The only reason rte_pmd.h still
exists is because thats what I had when I did my initial development.  The only
thing left to do is either merge the stuff in rte_dev.h into rte_pmd.h or merge
the stuff in rte_pmd.h into rte_dev.h.  Since rte_pmd.h only has one macro, it
seems merging it into rte_dev.h is more pragmatic.

Neil

> -- 
> Thomas
> 

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 01/15 v2] makefiles: Fixed -share command line option error
  2014-04-18 13:29                 ` Thomas Monjalon
  2014-04-18 17:36                   ` Neil Horman
@ 2014-04-21 14:41                   ` Neil Horman
  1 sibling, 0 replies; 77+ messages in thread
From: Neil Horman @ 2014-04-21 14:41 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev-VfR2kkLFssw

On Fri, Apr 18, 2014 at 03:29:01PM +0200, Thomas Monjalon wrote:
> 2014-04-18 09:18, Neil Horman:
> > On Fri, Apr 18, 2014 at 01:23:19PM +0200, Thomas Monjalon wrote:
> > > I think that CPU_LDFLAGS should be prefixed with -Wl, in case of CC
> > > linking. So blindly assigning CC to LD variable seems a bad idea.
> > > Other makefiles have different O_TO_S commands depending of LINK_USING_CC.
> > 
> > I'm not so sure about that.  Or more specifically, I wonder if some more
> > rework isn't needed here.  I say that because, while what you say makes
> > sense in terms of formatting the CPU_FLAGS variable for use with CC, the
> > only current use of CPU_LDFLAGS set -melf_i386, which IIRC is a gcc flag,
> > not meant to be passed to LD.  I can change the makefile to completely
> > rewrite the comand based on LINK_USING_CC, but it seems to me that
> > CPU_LDFLAGS should not be passed in the use of the LD case.
> 
> Right, -melf_i386 shouldn't be a LDFLAG.
> Feel free to fix it.
> By the way, It's cleaner to prepare -Wl prefixing and keep an empty LDFLAGS.
> 
Actually, I looked into this a bit more, turns out -melf_i386 is an LDFLAG.  Its
a bit silly to have it there because its passed automatically from the compiler
to the linker depending on the machine that gcc is building for, or ld does it
natively depending on the input file format.  But perhaps some compiler or
linker version has a bug where that doesn't happen properly.  Either way, it can
be prefixed with a -Wl, so I'm just going to leave it alone
Neil

> -- 
> Thomas
> 

^ permalink raw reply	[flat|nested] 77+ messages in thread

* [PATCH v5 00/14] dpdk: Separate compile time linkage between eal lib and pmd's
       [not found] ` <1397585169-14537-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
                     ` (14 preceding siblings ...)
  2014-04-15 18:06   ` [PATCH 15/15] pmd: Remove rte_pmd_init_all Neil Horman
@ 2014-04-21 14:59   ` Neil Horman
       [not found]     ` <1398092379-7679-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
  15 siblings, 1 reply; 77+ messages in thread
From: Neil Horman @ 2014-04-21 14:59 UTC (permalink / raw)
  To: dev-VfR2kkLFssw

Disconnect compile time linkage between eal library / applications and pmd's

I noticed that, while tinkering with dpdk, building for shared libraries still
resulted in all the test applications linking to all the built pmd's, despite
not actually needing them all.  We are able to tell an application at run time
(via the -d/--blacklist/--whitelist/--vdev options) which pmd's we want to use,
and so have no need to link them at all. The only reason they get pulled in is
because rte_eal_non_pci_init_etherdev and rte_pmd_init_all contain static lists
to the individual pmd init functions. The result is that, even when building as
DSO's, we have to load all the pmd libraries, which is space inefficient and
defeating of some of the purpose of shared objects.

To correct this, I developed this patch series, which introduces a new macro,
PMD_REGISTER_DRIVER, which wraps up Oliviers work using constructors on the
virtual device pmds, then expands on it to include the physical device pmds,
allowing us to break linkages between dpdk applications and pmd's almost
entirely (save for the ring and xenvirt drivers, which have additional api's
outside of the standard dpdk code that we need to further fix).  This also
allows us to completely remove the rte_pmd_init_all routine, hiding its function
internally to the rte_eal_init path.

I've tested this feature using the igb and pcap pmd's, both statically and
dynamically linked with the test and testpmd sample applications, and it seems
to work well.

Note, I encountered  a few bugs along the way, which I fixed and noted in the
series.

Regards
Neil

Change Notes:

1) Reposted the entire series.  Recent changes permeated accross several
patches, and since a few patches already had multiple versions, I've reposted
the entire series and bumped the version number to 5, whcih skips a few
versions, but ensures this series is seen as the most recent.

2) Merged the PMD_REGISTER_DRIVER macro into rte_dev.h, which is a better
location for it.  Required removing include of rte_pmd.h across most of the
patches in the series.

3) Cleaned up various leftover "virtual" comments in the driver registration api
that no longer belong there after making it generic

4) Fixed the LINK_USING_CC check in rte.lib.mk so it works like other uses

5) Fixed CPU_LDFLAGS conversion to use -Wl in case we link with gcc.

^ permalink raw reply	[flat|nested] 77+ messages in thread

* [PATCH 0/X v5 01/14] makefiles: Fixed -share command line option error
       [not found]     ` <1398092379-7679-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
@ 2014-04-21 14:59       ` Neil Horman
  2014-04-21 14:59       ` [PATCH 0/X v5 02/14] pmd: Add PMD_REGISTER_DRIVER macro Neil Horman
                         ` (16 subsequent siblings)
  17 siblings, 0 replies; 77+ messages in thread
From: Neil Horman @ 2014-04-21 14:59 UTC (permalink / raw)
  To: dev-VfR2kkLFssw

The shared libraries built with the current makefile set produce static
libraries rather than actual shared objects.  This is due to several missing
options that are required to correctly build shared objects using ld, as well as
a mis-specified -share option (which should be -shared). Switching to the use of
CC rather than LD and fixing the -shared option corrects these problems and
builds the DSOs correctly.

Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>

---
Change notes:

v2) Added test for LINK_USING_CC to convert to link with gcc
---
 mk/rte.lib.mk      | 14 ++++++++++++--
 mk/rte.sharelib.mk |  2 +-
 2 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index f75ca92..fc8fd01 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -59,6 +59,18 @@ build: _postbuild
 
 exe2cmd = $(strip $(call dotfile,$(patsubst %,%.cmd,$(1))))
 
+ifeq ($(LINK_USING_CC),1)
+comma := ,
+CPU_LDFLAGS := $(addprefix -Wl$(comma),$(CPU_LDFLAGS))
+O_TO_S = $(CC) $(CPU_LDFLAGS) -Wl$(comma)-z$(comma)muldefs -shared $(OBJS-y) -o $(LIB)
+
+ifeq ($(RTE_BUILD_SHARED_LIB),y)
+O_TO_C = $(CC) -z muldefs -shared $(OBJS-y) -o $(LIB_ONE)
+endif
+else
+O_TO_S = $(LD) $(CPU_LDFLAGS) -z muldefs -shared $(OBJS-y) -o $(LIB)
+endif
+
 O_TO_A = $(AR) crus $(LIB) $(OBJS-y)
 O_TO_A_STR = $(subst ','\'',$(O_TO_A)) #'# fix syntax highlight
 O_TO_A_DISP = $(if $(V),"$(O_TO_A_STR)","  AR $(@)")
@@ -68,7 +80,6 @@ O_TO_A_DO = @set -e; \
 	$(O_TO_A) && \
 	echo $(O_TO_A_CMD) > $(call exe2cmd,$(@))
 
-O_TO_S = $(LD) $(CPU_LDFLAGS) -z muldefs -share $(OBJS-y) -o $(LIB)
 O_TO_S_STR = $(subst ','\'',$(O_TO_S)) #'# fix syntax highlight
 O_TO_S_DISP = $(if $(V),"$(O_TO_S_STR)","  LD $(@)")
 O_TO_S_DO = @set -e; \
@@ -84,7 +95,6 @@ O_TO_C_DO = @set -e; \
 	$(lib_dir) \
 	$(copy_obj)
 else
-O_TO_C = $(LD) -z muldefs -share $(OBJS-y) -o $(LIB_ONE)
 O_TO_C_STR = $(subst ','\'',$(O_TO_C)) #'# fix syntax highlight
 O_TO_C_DISP = $(if $(V),"$(O_TO_C_STR)","  LD_C $(@)")
 O_TO_C_DO = @set -e; \
diff --git a/mk/rte.sharelib.mk b/mk/rte.sharelib.mk
index 3967b51..429309f 100644
--- a/mk/rte.sharelib.mk
+++ b/mk/rte.sharelib.mk
@@ -45,7 +45,7 @@ sharelib: $(LIB_ONE) FORCE
 
 OBJS = $(wildcard $(RTE_OUTPUT)/build/lib/*.o)
 
-O_TO_S = $(LD) $(CPU_LDFLAGS) -share $(OBJS) -o $(RTE_OUTPUT)/lib/$(LIB_ONE)
+O_TO_S = $(LD) $(CPU_LDFLAGS) -shared $(OBJS) -o $(RTE_OUTPUT)/lib/$(LIB_ONE)
 O_TO_S_STR = $(subst ','\'',$(O_TO_S)) #'# fix syntax highlight
 O_TO_S_DISP = $(if $(V),"$(O_TO_S_STR)","  LD $(@)")
 O_TO_S_CMD = "cmd_$@ = $(O_TO_S_STR)"
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 77+ messages in thread

* [PATCH 0/X v5 02/14] pmd: Add PMD_REGISTER_DRIVER macro
       [not found]     ` <1398092379-7679-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
  2014-04-21 14:59       ` [PATCH 0/X v5 01/14] makefiles: Fixed -share command line option error Neil Horman
@ 2014-04-21 14:59       ` Neil Horman
  2014-04-21 14:59       ` [PATCH 0/X v5 03/14] pcap: Convert to use of PMD_REGISTER_DRIVER and fix linking Neil Horman
                         ` (15 subsequent siblings)
  17 siblings, 0 replies; 77+ messages in thread
From: Neil Horman @ 2014-04-21 14:59 UTC (permalink / raw)
  To: dev-VfR2kkLFssw

Rather than have each driver have to remember to add a constructor to it to make
sure its gets registered properly, wrap that process up in a macro to make
registration a one line affair.  This also sets the stage for us to make
registration of vdev pmds and physical pmds a uniform process

Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
---
 lib/librte_eal/common/Makefile           |  2 +-
 lib/librte_eal/common/include/rte_vdev.h | 18 ++++++++++++++++++
 2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/lib/librte_eal/common/Makefile b/lib/librte_eal/common/Makefile
index 2f99bf4..d3e7e39 100644
--- a/lib/librte_eal/common/Makefile
+++ b/lib/librte_eal/common/Makefile
@@ -37,7 +37,7 @@ INC += rte_log.h rte_memcpy.h rte_memory.h rte_memzone.h rte_pci.h
 INC += rte_pci_dev_ids.h rte_per_lcore.h rte_prefetch.h rte_random.h
 INC += rte_rwlock.h rte_spinlock.h rte_tailq.h rte_interrupts.h rte_alarm.h
 INC += rte_string_fns.h rte_cpuflags.h rte_version.h rte_tailq_elem.h
-INC += rte_eal_memconfig.h rte_malloc_heap.h
+INC += rte_eal_memconfig.h rte_malloc_heap.h 
 INC += rte_hexdump.h rte_devargs.h rte_vdev.h
 
 ifeq ($(CONFIG_RTE_INSECURE_FUNCTION_WARNING),y)
diff --git a/lib/librte_eal/common/include/rte_vdev.h b/lib/librte_eal/common/include/rte_vdev.h
index 48f71b7..c7aa795 100644
--- a/lib/librte_eal/common/include/rte_vdev.h
+++ b/lib/librte_eal/common/include/rte_vdev.h
@@ -83,6 +83,24 @@ void rte_eal_vdev_driver_register(struct rte_vdev_driver *driver);
  */
 void rte_eal_vdev_driver_unregister(struct rte_vdev_driver *driver);
 
+enum rte_pmd_driver_type {
+	PMD_VDEV = 1
+};
+
+extern void rte_eal_nonpci_dev_init_register(const char *name, int (*dev_initfn)(const char *, const char *));
+#define PMD_REGISTER_DRIVER(d, t)\
+void devinitfn_ ##d(void);\
+void __attribute__((constructor, used)) devinitfn_ ##d(void)\
+{\
+	enum rte_pmd_driver_type _t = (t);\
+	switch(_t)\
+	{\
+		case PMD_VDEV:\
+			rte_eal_vdev_driver_register(&d);\
+			break;\
+	};\
+}
+
 #ifdef __cplusplus
 }
 #endif
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 77+ messages in thread

* [PATCH 0/X v5 03/14] pcap: Convert to use of PMD_REGISTER_DRIVER and fix linking
       [not found]     ` <1398092379-7679-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
  2014-04-21 14:59       ` [PATCH 0/X v5 01/14] makefiles: Fixed -share command line option error Neil Horman
  2014-04-21 14:59       ` [PATCH 0/X v5 02/14] pmd: Add PMD_REGISTER_DRIVER macro Neil Horman
@ 2014-04-21 14:59       ` Neil Horman
  2014-04-21 14:59       ` [PATCH 0/X v5 04/14] ring: " Neil Horman
                         ` (14 subsequent siblings)
  17 siblings, 0 replies; 77+ messages in thread
From: Neil Horman @ 2014-04-21 14:59 UTC (permalink / raw)
  To: dev-VfR2kkLFssw

convert the pcap driver to use the PMD_REGISTER_DRIVER macro and fix up the
Makefile so that its linkage is only done if we are building static libraries.
This means that the test applications now have no reference to the pcap library
when building DSO's and must specify its use on the command line with the -d
option.  Static linking will still initalize the driver automatically.

Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
---
 lib/librte_pmd_pcap/rte_eth_pcap.c | 7 +------
 mk/rte.app.mk                      | 2 ++
 2 files changed, 3 insertions(+), 6 deletions(-)

diff --git a/lib/librte_pmd_pcap/rte_eth_pcap.c b/lib/librte_pmd_pcap/rte_eth_pcap.c
index 680dfdc..c987940 100644
--- a/lib/librte_pmd_pcap/rte_eth_pcap.c
+++ b/lib/librte_pmd_pcap/rte_eth_pcap.c
@@ -772,9 +772,4 @@ static struct rte_vdev_driver pmd_pcap_drv = {
 	.init = rte_pmd_pcap_devinit,
 };
 
-__attribute__((constructor))
-static void
-rte_pmd_pcap_init(void)
-{
-	rte_eal_vdev_driver_register(&pmd_pcap_drv);
-}
+PMD_REGISTER_DRIVER(pmd_pcap_drv, PMD_VDEV);
diff --git a/mk/rte.app.mk b/mk/rte.app.mk
index 072718a..83f0867 100644
--- a/mk/rte.app.mk
+++ b/mk/rte.app.mk
@@ -172,9 +172,11 @@ ifeq ($(CONFIG_RTE_LIBRTE_CMDLINE),y)
 LDLIBS += -lrte_cmdline
 endif
 
+ifeq ($(RTE_BUILD_SHARED_LIB),n)
 ifeq ($(CONFIG_RTE_LIBRTE_PMD_PCAP),y)
 LDLIBS += -lrte_pmd_pcap -lpcap
 endif
+endif
 
 LDLIBS += $(EXECENV_LDLIBS)
 
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 77+ messages in thread

* [PATCH 0/X v5 04/14] ring: Convert to use of PMD_REGISTER_DRIVER and fix linking
       [not found]     ` <1398092379-7679-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
                         ` (2 preceding siblings ...)
  2014-04-21 14:59       ` [PATCH 0/X v5 03/14] pcap: Convert to use of PMD_REGISTER_DRIVER and fix linking Neil Horman
@ 2014-04-21 14:59       ` Neil Horman
  2014-04-21 14:59       ` [PATCH 0/X v5 05/14] xenvirt: " Neil Horman
                         ` (13 subsequent siblings)
  17 siblings, 0 replies; 77+ messages in thread
From: Neil Horman @ 2014-04-21 14:59 UTC (permalink / raw)
  To: dev-VfR2kkLFssw

convert the ring driver to use the PMD_REGISTER_DRIVER macro and fix up the
Makefile so that its linkage is only done if we are building static libraries.
This means that the test applications now have no reference to the ring library
when building DSO's and must specify its use on the command line with the -d
option.  Static linking will still initalize the driver automatically.

Note that the ring driver was also written in such a way that it violated some
general layering principles, several functions were contained in the pmd which
were being called by example from the test application in the app/test
directory.  Specifically it was calling eth_ring_pair_attach,
eth_ring_pair_create and rte_eth_ring_devinit, which should only be called
internally to the dpdk core library.  To correct this I've removed those
functions, and instead allowed them to be called indirectly at initalization
time using the vdev command line argument key nodeaction=<name>:<node>:<action>
where action is one of ATTACH or CREATE.  I've tested out the functionality of
the command line with the testpmd utility, with success, and have removed the
called functions from the test utility.  This will affect how the test utility
is invoked (the -d and --vdev option will need to be specified on the command
line now), but honestly, given the way it was coded, I think the testing of the
ring pmd was not the best example of how to code with dpdk to begin with.  I
have also left the two layer violating functions in place, so as not to break
existing applications, but added deprecation warnings to them so that apps can
migrate off them.

Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>

---
Change notes

v2) fixed DEPDIR specifcation, should depend on RING not PCAP

v3) Cleaned up strcmp error checking, printfs, and other parsing issues as
pointed out by Konstantin Ananyev <konstantin.ananyev-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
---
 app/test/test_pmd_ring.c           |  95 -------------------------
 lib/librte_pmd_ring/Makefile       |   1 +
 lib/librte_pmd_ring/rte_eth_ring.c | 140 ++++++++++++++++++++++++++++++++++---
 mk/rte.app.mk                      |  10 +--
 4 files changed, 137 insertions(+), 109 deletions(-)

diff --git a/app/test/test_pmd_ring.c b/app/test/test_pmd_ring.c
index 4d9c2ba..1fe38fa 100644
--- a/app/test/test_pmd_ring.c
+++ b/app/test/test_pmd_ring.c
@@ -42,7 +42,6 @@
 /* two test rings, r1 is used by two ports, r2 just by one */
 static struct rte_ring *r1[2], *r2;
 
-static struct rte_ring *nullring = NULL;
 static struct rte_mempool *mp;
 static uint8_t start_idx; /* will store the port id of the first of our new ports */
 
@@ -59,58 +58,6 @@ static uint8_t start_idx; /* will store the port id of the first of our new port
 #define MBUF_SIZE (2048 + sizeof(struct rte_mbuf) + RTE_PKTMBUF_HEADROOM)
 #define NB_MBUF   512
 
-
-static int
-test_ring_ethdev_create(void)
-{
-	int retval;
-	printf("Testing ring pmd create\n");
-
-	retval = rte_eth_from_rings(NULL, 0, NULL, 0, SOCKET0);
-	if (retval < 0) {
-		printf("Failure, failed to create zero-sized RXTX ring pmd\n");
-		return -1;
-	}
-
-	retval = rte_eth_from_rings(NULL, 0, NULL, 0, RTE_MAX_NUMA_NODES);
-	if (retval >= 0) {
-		printf("Failure, can create ring pmd on socket %d\n", RTE_MAX_NUMA_NODES);
-		return -1;
-	}
-
-	retval = rte_eth_from_rings(NULL, 1, &r2, 1, SOCKET0);
-	if (retval >= 0) {
-		printf("Failure, can create pmd with null rx rings\n");
-		return -1;
-	}
-
-	retval = rte_eth_from_rings(r1, 1, NULL, 1, SOCKET0);
-	if (retval >= 0) {
-		printf("Failure, can create pmd with null tx rings\n");
-		return -1;
-	}
-
-	retval = rte_eth_from_rings(&nullring, 1, r1, 2, SOCKET0);
-	if (retval < 0) {
-		printf("Failure, failed to create TX-only ring pmd\n");
-		return -1;
-	}
-
-	retval = rte_eth_from_rings(r1, 1, &nullring, 1, SOCKET0);
-	if (retval < 0) {
-		printf("Failure, failed to create RX-only ring pmd\n");
-		return -1;
-	}
-
-	retval = rte_eth_from_rings(&r2, 1, &r2, 1, SOCKET0);
-	if (retval < 0) {
-		printf("Failure, failed to create RXTX ring pmd\n");
-		return -1;
-	}
-
-	return 0;
-}
-
 static int
 test_ethdev_configure(void)
 {
@@ -305,26 +252,12 @@ test_stats_reset(void)
 static int 
 test_pmd_ring_init(void)
 {
-	const char * name1 = "R3";
-	const char * name2 = "R4";
-	const char * params_null = NULL;
-	const char * params = "PARAMS";
 	struct rte_eth_stats stats;
 	struct rte_mbuf buf, *pbuf = &buf;
 	struct rte_eth_conf null_conf;
 
 	printf("Testing ring pmd init\n");
 
-	if (rte_pmd_ring_devinit(name1, params_null) < 0) {
-		printf("Testing ring pmd init fail\n");
-		return -1;
-	}
-
-	if (rte_pmd_ring_devinit(name2, params) < 0) {
-		printf("Testing ring pmd init fail\n");
-		return -1;
-	}
-
 	if (RXTX_PORT2 >= RTE_MAX_ETHPORTS) {
 		printf(" TX/RX port exceed max eth ports\n");
 		return -1;
@@ -371,24 +304,16 @@ test_pmd_ring_init(void)
 
 	rte_eth_dev_stop(RXTX_PORT2);
 
-	/* Test init same name pmd ring */
-	rte_pmd_ring_devinit(name1, params_null);
 	return 0;
 }
 
 static int
 test_pmd_ring_pair_create(void)
 {
-	const char * name1 = "_RNG_P0";
 	struct rte_eth_stats stats, stats2;
 	struct rte_mbuf buf, *pbuf = &buf;
 	struct rte_eth_conf null_conf;
 
-	if (rte_eth_ring_pair_create(name1, SOCKET0) < 0) {
-		printf("Create ring pair failed\n");
-		return -1;
-	}
-
 	if ((RXTX_PORT4 >= RTE_MAX_ETHPORTS) || (RXTX_PORT5 >= RTE_MAX_ETHPORTS)) {
 		printf(" TX/RX port exceed max eth ports\n");
 		return -1;
@@ -447,28 +372,16 @@ test_pmd_ring_pair_create(void)
 	rte_eth_dev_stop(RXTX_PORT4);
 	rte_eth_dev_stop(RXTX_PORT5);
 
-	/* Test create same name ring pair */
-	if (rte_eth_ring_pair_create(name1, SOCKET0) == 0) {
-		printf("Create same name ring pair error\n");
-		return -1;
-	}
 	return 0;
 }
 
 static int
 test_pmd_ring_pair_attach(void)
 {
-	const char * name1 = "_RNG_P0";
-	const char * name2 = "_RNG_P1";
 	struct rte_eth_stats stats, stats2;
 	struct rte_mbuf buf, *pbuf = &buf;
 	struct rte_eth_conf null_conf;
 
-	if (rte_eth_ring_pair_attach(name1, SOCKET0) < 0) {
-		printf("Attach ring pair failed\n");
-		return -1;
-	}
-
 	if ((RXTX_PORT4 >= RTE_MAX_ETHPORTS) || (RXTX_PORT5 >= RTE_MAX_ETHPORTS)) {
 		printf(" TX/RX port exceed max eth ports\n");
 		return -1;
@@ -529,11 +442,6 @@ test_pmd_ring_pair_attach(void)
 	rte_eth_dev_stop(RXTX_PORT4);
 	rte_eth_dev_stop(RXTX_PORT5);
 	
-	/* Test attach non-existing ring pair */
-	if (rte_eth_ring_pair_attach(name2, SOCKET0) == 0) {
-		printf("Attach non-existing ring pair error\n");
-		return -1;
-	}
 	return 0;
 }
 
@@ -568,9 +476,6 @@ test_pmd_ring(void)
 		return -1;
 	}
 
-	if (test_ring_ethdev_create() < 0)
-		return -1;
-
 	if (test_ethdev_configure() < 0)
 		return -1;
 
diff --git a/lib/librte_pmd_ring/Makefile b/lib/librte_pmd_ring/Makefile
index 73b2d38..35d40cb 100644
--- a/lib/librte_pmd_ring/Makefile
+++ b/lib/librte_pmd_ring/Makefile
@@ -52,5 +52,6 @@ SYMLINK-y-include += rte_eth_ring.h
 # this lib depends upon:
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_RING) += lib/librte_eal lib/librte_ring
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_RING) += lib/librte_mbuf lib/librte_ether
+DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_RING) += lib/librte_kvargs
 
 include $(RTE_SDK)/mk/rte.lib.mk
diff --git a/lib/librte_pmd_ring/rte_eth_ring.c b/lib/librte_pmd_ring/rte_eth_ring.c
index cee3fff..6325a3a 100644
--- a/lib/librte_pmd_ring/rte_eth_ring.c
+++ b/lib/librte_pmd_ring/rte_eth_ring.c
@@ -38,6 +38,16 @@
 #include <rte_memcpy.h>
 #include <rte_string_fns.h>
 #include <rte_vdev.h>
+#include <rte_kvargs.h>
+
+#define ETH_RING_NUMA_NODE_ACTION_ARG	"nodeaction"
+#define ETH_RING_ACTION_CREATE		"CREATE"
+#define ETH_RING_ACTION_ATTACH		"ATTACH"
+	
+static const char *valid_arguments[] = {
+	ETH_RING_NUMA_NODE_ACTION_ARG,
+	NULL
+};
 
 struct ring_queue {
 	struct rte_ring *rng;
@@ -373,28 +383,143 @@ eth_dev_ring_pair_create(const char *name, const unsigned numa_node,
 int
 rte_eth_ring_pair_create(const char *name, const unsigned numa_node)
 {
+	RTE_LOG(WARNING, PMD, "rte_eth_ring_pair_create is deprecated\n");
 	return eth_dev_ring_pair_create(name, numa_node, DEV_CREATE);
 }
 
 int
 rte_eth_ring_pair_attach(const char *name, const unsigned numa_node)
 {
+	RTE_LOG(WARNING, PMD, "rte_eth_ring_pair_attach is deprecated\n");
 	return eth_dev_ring_pair_create(name, numa_node, DEV_ATTACH);
 }
 
+struct node_action_pair {
+	char name[PATH_MAX];
+	unsigned node;
+	enum dev_action action;
+};
+
+struct node_action_list {
+	unsigned total;
+	unsigned count;
+	struct node_action_pair *list;
+};
+
+static int parse_kvlist (const char *key __rte_unused, const char *value, void *data)
+{
+	struct node_action_list *info = data;
+	int ret;
+	char *name;
+	char *action;
+	char *node;
+	char *end;
+
+	name = strdup(value);
+
+	ret = -EINVAL;
+
+	if (!name) {
+		RTE_LOG(WARNING, PMD, "command line paramter is empty for ring pmd!\n");
+		goto out;
+	}
+
+	node = strchr(name, ':');
+	if (!node) {
+		RTE_LOG(WARNING, PMD, "could not parse node value from %s", name);
+		goto out;
+	}
+
+	*node = '\0';
+	node++;
+
+	action = strchr(node, ':');
+	if (!action) {
+		RTE_LOG(WARNING, PMD, "could not action value from %s", node);
+		goto out;
+	}
+
+	*action = '\0';
+	action++;
+
+	/*
+	 * Need to do some sanity checking here
+	 */
+
+	if (strcmp(action, ETH_RING_ACTION_ATTACH) == 0)
+		info->list[info->count].action = DEV_ATTACH;
+	else if (strcmp(action, ETH_RING_ACTION_CREATE) == 0)
+		info->list[info->count].action = DEV_CREATE;
+	else
+		goto out;
+
+	errno = 0;
+	info->list[info->count].node = strtol(node, &end, 10);
+
+	if ((errno != 0) || (*end != '\0')) {
+		RTE_LOG(WARNING, PMD, "node value %s is unparseable as a number\n", node);
+		goto out;
+	}
+
+	rte_snprintf(info->list[info->count].name, sizeof(info->list[info->count].name), "%s", name);
+
+	info->count++;
+
+	ret = 0;
+out:
+	free(name);
+	return ret;
+}
+
 int
 rte_pmd_ring_devinit(const char *name, const char *params)
 {
+	struct rte_kvargs *kvlist;
+	int ret = 0;
+	struct node_action_list *info = NULL;
+
 	RTE_LOG(INFO, PMD, "Initializing pmd_ring for %s\n", name);
 
+
 	if (params == NULL || params[0] == '\0')
 		eth_dev_ring_create(name, rte_socket_id(), DEV_CREATE);
 	else {
-		RTE_LOG(INFO, PMD, "Ignoring unsupported parameters when creating"
-				" rings-backed ethernet device\n");
-		eth_dev_ring_create(name, rte_socket_id(), DEV_CREATE);
+		kvlist = rte_kvargs_parse(params, valid_arguments);
+
+		if (!kvlist) {
+			RTE_LOG(INFO, PMD, "Ignoring unsupported parameters when creating"
+					" rings-backed ethernet device\n");
+			eth_dev_ring_create(name, rte_socket_id(), DEV_CREATE);
+			return 0;
+		} else {
+			eth_dev_ring_create(name, rte_socket_id(), DEV_CREATE);
+			ret = rte_kvargs_count(kvlist, ETH_RING_NUMA_NODE_ACTION_ARG);
+			info = rte_zmalloc("struct node_action_list", sizeof(struct node_action_list) +
+					   (sizeof(struct node_action_pair) * ret), 0);
+			if (!info)
+				goto out;
+
+			info->total = ret;
+			info->list = (struct node_action_pair*)(info + 1);
+
+			ret = rte_kvargs_process(kvlist, ETH_RING_NUMA_NODE_ACTION_ARG,
+						 parse_kvlist, info); 
+
+			if (ret < 0)
+				goto out_free;
+
+			for (info->count = 0; info->count < info->total; info->count++) {
+				eth_dev_ring_pair_create(name, info->list[info->count].node,
+						    info->list[info->count].action);
+			}
+				
+		}
 	}
-	return 0;
+
+out_free:
+	rte_free(info);
+out:
+	return ret;
 }
 
 static struct rte_vdev_driver pmd_ring_drv = {
@@ -402,9 +527,4 @@ static struct rte_vdev_driver pmd_ring_drv = {
 	.init = rte_pmd_ring_devinit,
 };
 
-__attribute__((constructor))
-static void
-rte_pmd_ring_init(void)
-{
-	rte_eal_vdev_driver_register(&pmd_ring_drv);
-}
+PMD_REGISTER_DRIVER(pmd_ring_drv, PMD_VDEV);
diff --git a/mk/rte.app.mk b/mk/rte.app.mk
index 83f0867..16edbce 100644
--- a/mk/rte.app.mk
+++ b/mk/rte.app.mk
@@ -133,10 +133,6 @@ ifeq ($(CONFIG_RTE_LIBRTE_ETHER),y)
 LDLIBS += -lethdev
 endif
 
-ifeq ($(CONFIG_RTE_LIBRTE_PMD_RING),y)
-LDLIBS += -lrte_pmd_ring
-endif
-
 ifeq ($(CONFIG_RTE_LIBRTE_MALLOC),y)
 LDLIBS += -lrte_malloc
 endif
@@ -173,9 +169,15 @@ LDLIBS += -lrte_cmdline
 endif
 
 ifeq ($(RTE_BUILD_SHARED_LIB),n)
+
+ifeq ($(CONFIG_RTE_LIBRTE_PMD_RING),y)
+LDLIBS += -lrte_pmd_ring
+endif
+
 ifeq ($(CONFIG_RTE_LIBRTE_PMD_PCAP),y)
 LDLIBS += -lrte_pmd_pcap -lpcap
 endif
+
 endif
 
 LDLIBS += $(EXECENV_LDLIBS)
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 77+ messages in thread

* [PATCH 0/X v5 05/14] xenvirt: Convert to use of PMD_REGISTER_DRIVER and fix linking
       [not found]     ` <1398092379-7679-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
                         ` (3 preceding siblings ...)
  2014-04-21 14:59       ` [PATCH 0/X v5 04/14] ring: " Neil Horman
@ 2014-04-21 14:59       ` Neil Horman
  2014-04-21 14:59       ` [PATCH 0/X v5 06/14] eal: Make vdev init path generic for both virtual and physcial devices Neil Horman
                         ` (12 subsequent siblings)
  17 siblings, 0 replies; 77+ messages in thread
From: Neil Horman @ 2014-04-21 14:59 UTC (permalink / raw)
  To: dev-VfR2kkLFssw

convert the xenvirt driver to use the PMD_REGISTER_DRIVER macro.
This means that the test applications now have no reference to the xenvirt library
when building DSO's and must specify its use on the command line with the -d
option.  Static linking will still initalize the driver automatically.

A few notes:

xenvirt was unbuildable as of commit 4c39baf297d10c217e7d3e7370f26a1fede58308..
That commit neglected to include the rte_vdev.h header, so several structs were
left undefined.  This patch includes a fix for that as well.

Also, The linkage for xenvirt is broken in much the same way pmd_ring was, in
that the xenvirt pmd has a function that is called directly from applications
(the example being the testpmd application).  The function is
rte_mempool_gntalloc_create, and should clearly be moved into the rte_mempool
library, with the supporting code in the function implementation moved to a new
xenvirt library separate from the pmd.  This is a large undertaking that
detracts from the purpose of this series however, and so for now, I'm leaving
the linkage to the application in place, and will address this issue in a later
series

Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
---
 lib/librte_pmd_xenvirt/rte_eth_xenvirt.c | 8 ++------
 mk/rte.app.mk                            | 7 +++----
 2 files changed, 5 insertions(+), 10 deletions(-)

diff --git a/lib/librte_pmd_xenvirt/rte_eth_xenvirt.c b/lib/librte_pmd_xenvirt/rte_eth_xenvirt.c
index 533aa76..ecafe7a 100644
--- a/lib/librte_pmd_xenvirt/rte_eth_xenvirt.c
+++ b/lib/librte_pmd_xenvirt/rte_eth_xenvirt.c
@@ -53,6 +53,7 @@
 #include <rte_malloc.h>
 #include <rte_memcpy.h>
 #include <rte_string_fns.h>
+#include <rte_vdev.h>
 #include <cmdline_parse.h>
 #include <cmdline_parse_etheraddr.h>
 
@@ -710,9 +711,4 @@ static struct rte_vdev_driver pmd_xenvirt_drv = {
 	.init = rte_pmd_xenvirt_devinit,
 };
 
-__attribute__((constructor))
-static void
-rte_pmd_xenvirt_init(void)
-{
-	rte_eal_vdev_driver_register(&pmd_xenvirt_drv);
-}
+PMD_REGISTER_DRIVER(pmd_xenvirt_drv, PMD_VDEV);
diff --git a/mk/rte.app.mk b/mk/rte.app.mk
index 16edbce..aabe75e 100644
--- a/mk/rte.app.mk
+++ b/mk/rte.app.mk
@@ -158,16 +158,15 @@ ifeq ($(CONFIG_RTE_LIBRTE_EAL),y)
 LDLIBS += -lrte_eal
 endif
 
+ifeq ($(CONFIG_RTE_LIBRTE_CMDLINE),y)
+LDLIBS += -lrte_cmdline
+endif
 
 ifeq ($(CONFIG_RTE_LIBRTE_PMD_XENVIRT),y)
 LDLIBS += -lrte_pmd_xenvirt
 LDLIBS += -lxenstore
 endif
 
-ifeq ($(CONFIG_RTE_LIBRTE_CMDLINE),y)
-LDLIBS += -lrte_cmdline
-endif
-
 ifeq ($(RTE_BUILD_SHARED_LIB),n)
 
 ifeq ($(CONFIG_RTE_LIBRTE_PMD_RING),y)
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 77+ messages in thread

* [PATCH 0/X v5 06/14] eal: Make vdev init path generic for both virtual and physcial devices
       [not found]     ` <1398092379-7679-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
                         ` (4 preceding siblings ...)
  2014-04-21 14:59       ` [PATCH 0/X v5 05/14] xenvirt: " Neil Horman
@ 2014-04-21 14:59       ` Neil Horman
  2014-04-21 14:59       ` [PATCH 0/X v5 07/14] igb: Convert to use of PMD_REGISTER_DRIVER and fix linking Neil Horman
                         ` (11 subsequent siblings)
  17 siblings, 0 replies; 77+ messages in thread
From: Neil Horman @ 2014-04-21 14:59 UTC (permalink / raw)
  To: dev-VfR2kkLFssw

Currently, physical device pmds use a separate initalization path
(rte_pmd_init_all) while virtual devices use a constructor registration and
rte_eal_dev_init.  Theres no reason to have them be separate.  This patch
removes the vdev specific nomenclature from the vdev init path and makes it more
generic for use with all pmds.  This is the first step in converting the
physical device pmds to using the same constructor based registration path that
the virtual devices use

Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
---
 lib/librte_eal/bsdapp/eal/Makefile          |   2 +-
 lib/librte_eal/bsdapp/eal/eal.c             |   4 +-
 lib/librte_eal/common/Makefile              |   4 +-
 lib/librte_eal/common/eal_common_dev.c      | 109 +++++++++++++++++++++++++++
 lib/librte_eal/common/eal_common_vdev.c     |  97 ------------------------
 lib/librte_eal/common/include/eal_private.h |   2 +-
 lib/librte_eal/common/include/rte_dev.h     | 111 ++++++++++++++++++++++++++++
 lib/librte_eal/common/include/rte_vdev.h    | 108 ---------------------------
 lib/librte_eal/linuxapp/eal/Makefile        |   2 +-
 lib/librte_eal/linuxapp/eal/eal.c           |   4 +-
 lib/librte_pmd_pcap/rte_eth_pcap.c          |   7 +-
 lib/librte_pmd_ring/rte_eth_ring.c          |   7 +-
 lib/librte_pmd_xenvirt/rte_eth_xenvirt.c    |   7 +-
 13 files changed, 241 insertions(+), 223 deletions(-)
 create mode 100644 lib/librte_eal/common/eal_common_dev.c
 delete mode 100644 lib/librte_eal/common/eal_common_vdev.c
 create mode 100644 lib/librte_eal/common/include/rte_dev.h
 delete mode 100644 lib/librte_eal/common/include/rte_vdev.h

diff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile
index 4c2a4f1..abf1ad2 100644
--- a/lib/librte_eal/bsdapp/eal/Makefile
+++ b/lib/librte_eal/bsdapp/eal/Makefile
@@ -69,7 +69,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_common_errno.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_common_cpuflags.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_common_hexdump.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_common_whitelist.c
-SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_common_vdev.c
+SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_common_dev.c
 
 CFLAGS_eal.o := -D_GNU_SOURCE
 #CFLAGS_eal_thread.o := -D_GNU_SOURCE
diff --git a/lib/librte_eal/bsdapp/eal/eal.c b/lib/librte_eal/bsdapp/eal/eal.c
index e944aba..8de3fad 100644
--- a/lib/librte_eal/bsdapp/eal/eal.c
+++ b/lib/librte_eal/bsdapp/eal/eal.c
@@ -854,8 +854,8 @@ rte_eal_init(int argc, char **argv)
 
 	rte_eal_mcfg_complete();
 
-	if (rte_eal_vdev_init() < 0)
-		rte_panic("Cannot init virtual devices\n");
+	if (rte_eal_dev_init() < 0)
+		rte_panic("Cannot init pmd devices\n");
 
 	RTE_LCORE_FOREACH_SLAVE(i) {
 
diff --git a/lib/librte_eal/common/Makefile b/lib/librte_eal/common/Makefile
index d3e7e39..0016fc5 100644
--- a/lib/librte_eal/common/Makefile
+++ b/lib/librte_eal/common/Makefile
@@ -37,8 +37,8 @@ INC += rte_log.h rte_memcpy.h rte_memory.h rte_memzone.h rte_pci.h
 INC += rte_pci_dev_ids.h rte_per_lcore.h rte_prefetch.h rte_random.h
 INC += rte_rwlock.h rte_spinlock.h rte_tailq.h rte_interrupts.h rte_alarm.h
 INC += rte_string_fns.h rte_cpuflags.h rte_version.h rte_tailq_elem.h
-INC += rte_eal_memconfig.h rte_malloc_heap.h 
-INC += rte_hexdump.h rte_devargs.h rte_vdev.h
+INC += rte_eal_memconfig.h rte_malloc_heap.h
+INC += rte_hexdump.h rte_devargs.h rte_dev.h
 
 ifeq ($(CONFIG_RTE_INSECURE_FUNCTION_WARNING),y)
 INC += rte_warnings.h
diff --git a/lib/librte_eal/common/eal_common_dev.c b/lib/librte_eal/common/eal_common_dev.c
new file mode 100644
index 0000000..8c42738
--- /dev/null
+++ b/lib/librte_eal/common/eal_common_dev.c
@@ -0,0 +1,109 @@
+/*-
+ *   BSD LICENSE
+ * 
+ *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
+ *   Copyright(c) 2014 6WIND S.A.
+ *   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 <string.h>
+#include <inttypes.h>
+#include <sys/queue.h>
+
+#include <rte_dev.h>
+#include <rte_devargs.h>
+#include <rte_debug.h>
+#include <rte_devargs.h>
+
+#include "eal_private.h"
+
+/** Global list of device drivers. */
+static struct rte_driver_list dev_driver_list =
+	TAILQ_HEAD_INITIALIZER(dev_driver_list);
+
+/* register a driver */
+void
+rte_eal_driver_register(struct rte_driver *driver)
+{
+	TAILQ_INSERT_TAIL(&dev_driver_list, driver, next);
+}
+
+/* unregister a driver */
+void
+rte_eal_driver_unregister(struct rte_driver *driver)
+{
+	TAILQ_REMOVE(&dev_driver_list, driver, next);
+}
+
+int
+rte_eal_dev_init(void)
+{
+	struct rte_devargs *devargs;
+	struct rte_driver *driver;
+
+	/*
+	 * Note that the dev_driver_list is populated here
+	 * from calls made to rte_eal_driver_register from constructor functions
+	 * embedded into PMD modules via the PMD_REGISTER_DRIVER macro
+	 */
+
+	/* call the init function for each virtual device */
+	TAILQ_FOREACH(devargs, &devargs_list, next) {
+
+		if (devargs->type != RTE_DEVTYPE_VIRTUAL)
+			continue;
+
+		TAILQ_FOREACH(driver, &dev_driver_list, next) {
+			if (driver->type != PMD_VDEV)
+				continue;
+
+			/* search a driver prefix in virtual device name */
+			if (!strncmp(driver->name, devargs->virtual.drv_name,
+					strlen(driver->name))) {
+				driver->init(devargs->virtual.drv_name,
+					devargs->args);
+				break;
+			}
+		}
+
+		if (driver == NULL) {
+			rte_panic("no driver found for %s\n",
+				  devargs->virtual.drv_name);
+		}
+	}
+
+	/* Once the vdevs are initalized, start calling all the pdev drivers */
+	TAILQ_FOREACH(driver, &dev_driver_list, next) {
+		if (driver->type != PMD_PDEV)
+			continue;
+		/* PDEV drivers don't get passed any parameters */
+		driver->init(NULL, NULL);
+	}
+	return 0;
+}
diff --git a/lib/librte_eal/common/eal_common_vdev.c b/lib/librte_eal/common/eal_common_vdev.c
deleted file mode 100644
index 62d0302..0000000
--- a/lib/librte_eal/common/eal_common_vdev.c
+++ /dev/null
@@ -1,97 +0,0 @@
-/*-
- *   BSD LICENSE
- * 
- *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
- *   Copyright(c) 2014 6WIND S.A.
- *   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 <string.h>
-#include <inttypes.h>
-#include <sys/queue.h>
-
-#include <rte_vdev.h>
-#include <rte_devargs.h>
-#include <rte_debug.h>
-#include <rte_devargs.h>
-
-#include "eal_private.h"
-
-/** Global list of virtual device drivers. */
-static struct rte_vdev_driver_list vdev_driver_list =
-	TAILQ_HEAD_INITIALIZER(vdev_driver_list);
-
-/* register a driver */
-void
-rte_eal_vdev_driver_register(struct rte_vdev_driver *driver)
-{
-	TAILQ_INSERT_TAIL(&vdev_driver_list, driver, next);
-}
-
-/* unregister a driver */
-void
-rte_eal_vdev_driver_unregister(struct rte_vdev_driver *driver)
-{
-	TAILQ_REMOVE(&vdev_driver_list, driver, next);
-}
-
-int
-rte_eal_vdev_init(void)
-{
-	struct rte_devargs *devargs;
-	struct rte_vdev_driver *driver;
-
-	/* No need to register drivers that are embeded in DPDK
-	 * (pmd_pcap, pmd_ring, ...). The initialization function have
-	 * the ((constructor)) attribute so they will register at
-	 * startup. */
-
-	/* call the init function for each virtual device */
-	TAILQ_FOREACH(devargs, &devargs_list, next) {
-
-		if (devargs->type != RTE_DEVTYPE_VIRTUAL)
-			continue;
-
-		TAILQ_FOREACH(driver, &vdev_driver_list, next) {
-			/* search a driver prefix in virtual device name */
-			if (!strncmp(driver->name, devargs->virtual.drv_name,
-					strlen(driver->name))) {
-				driver->init(devargs->virtual.drv_name,
-					devargs->args);
-				break;
-			}
-		}
-
-		if (driver == NULL) {
-			rte_panic("no driver found for %s\n",
-				  devargs->virtual.drv_name);
-		}
-	}
-	return 0;
-}
diff --git a/lib/librte_eal/common/include/eal_private.h b/lib/librte_eal/common/include/eal_private.h
index 22d8b08..b99ad23 100644
--- a/lib/librte_eal/common/include/eal_private.h
+++ b/lib/librte_eal/common/include/eal_private.h
@@ -201,6 +201,6 @@ int rte_eal_alarm_init(void);
  *
  * This function is private to the EAL.
  */
-int rte_eal_vdev_init(void);
+int rte_eal_dev_init(void);
 
 #endif /* _EAL_PRIVATE_H_ */
diff --git a/lib/librte_eal/common/include/rte_dev.h b/lib/librte_eal/common/include/rte_dev.h
new file mode 100644
index 0000000..5af36c8
--- /dev/null
+++ b/lib/librte_eal/common/include/rte_dev.h
@@ -0,0 +1,111 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2014 6WIND S.A.
+ *   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 6WIND S.A. 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.
+ */
+
+#ifndef _RTE_DEV_H_
+#define _RTE_DEV_H_
+
+/**
+ * @file
+ *
+ * RTE PMD Driver Registration Interface
+ *
+ * This file manages the list of device drivers.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <sys/queue.h>
+
+/** Double linked list of device drivers. */
+TAILQ_HEAD(rte_driver_list, rte_driver);
+
+/**
+ * Initialization function called for each device driver once.
+ */
+typedef int (rte_dev_init_t)(const char *name, const char *args);
+
+/**
+ * Driver type enumeration
+ */
+enum pmd_type {
+	PMD_VDEV = 0,
+	PMD_PDEV = 1,
+};
+
+/**
+ * A structure describing a device driver.
+ */
+struct rte_driver {
+	TAILQ_ENTRY(rte_driver) next;  /**< Next in list. */
+	enum pmd_type type;		   /**< PMD Driver type */
+	const char *name;                   /**< Driver name. */
+	rte_dev_init_t *init;              /**< Device init. function. */
+};
+
+/**
+ * Register a device driver.
+ *
+ * @param driver
+ *   A pointer to a rte_dev structure describing the driver
+ *   to be registered.
+ */
+void rte_eal_driver_register(struct rte_driver *driver);
+
+/**
+ * Unregister a device driver.
+ *
+ * @param driver
+ *   A pointer to a rte_dev structure describing the driver
+ *   to be unregistered.
+ */
+void rte_eal_driver_unregister(struct rte_driver *driver);
+
+/**
+ * Initalize all the registered drivers in this process
+ */
+int rte_eal_dev_init(void);
+
+#define PMD_REGISTER_DRIVER(d)\
+void devinitfn_ ##d(void);\
+void __attribute__((constructor, used)) devinitfn_ ##d(void)\
+{\
+		rte_eal_driver_register(&d);\
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RTE_VDEV_H_ */
diff --git a/lib/librte_eal/common/include/rte_vdev.h b/lib/librte_eal/common/include/rte_vdev.h
deleted file mode 100644
index c7aa795..0000000
--- a/lib/librte_eal/common/include/rte_vdev.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/*-
- *   BSD LICENSE
- *
- *   Copyright(c) 2014 6WIND S.A.
- *   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 6WIND S.A. 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.
- */
-
-#ifndef _RTE_VDEV_H_
-#define _RTE_VDEV_H_
-
-/**
- * @file
- *
- * RTE Virtual Devices Interface
- *
- * This file manages the list of the virtual device drivers.
- */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <sys/queue.h>
-
-/** Double linked list of virtual device drivers. */
-TAILQ_HEAD(rte_vdev_driver_list, rte_vdev_driver);
-
-/**
- * Initialization function called for each virtual device probing.
- */
-typedef int (rte_vdev_init_t)(const char *name, const char *args);
-
-/**
- * A structure describing a virtual device driver.
- */
-struct rte_vdev_driver {
-	TAILQ_ENTRY(rte_vdev_driver) next;  /**< Next in list. */
-	const char *name;                   /**< Driver name. */
-	rte_vdev_init_t *init;              /**< Device init. function. */
-};
-
-/**
- * Register a virtual device driver.
- *
- * @param driver
- *   A pointer to a rte_vdev structure describing the driver
- *   to be registered.
- */
-void rte_eal_vdev_driver_register(struct rte_vdev_driver *driver);
-
-/**
- * Unregister a virtual device driver.
- *
- * @param driver
- *   A pointer to a rte_vdev structure describing the driver
- *   to be unregistered.
- */
-void rte_eal_vdev_driver_unregister(struct rte_vdev_driver *driver);
-
-enum rte_pmd_driver_type {
-	PMD_VDEV = 1
-};
-
-extern void rte_eal_nonpci_dev_init_register(const char *name, int (*dev_initfn)(const char *, const char *));
-#define PMD_REGISTER_DRIVER(d, t)\
-void devinitfn_ ##d(void);\
-void __attribute__((constructor, used)) devinitfn_ ##d(void)\
-{\
-	enum rte_pmd_driver_type _t = (t);\
-	switch(_t)\
-	{\
-		case PMD_VDEV:\
-			rte_eal_vdev_driver_register(&d);\
-			break;\
-	};\
-}
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _RTE_VDEV_H_ */
diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
index 00f7367..e800e60 100644
--- a/lib/librte_eal/linuxapp/eal/Makefile
+++ b/lib/librte_eal/linuxapp/eal/Makefile
@@ -77,7 +77,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_errno.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_cpuflags.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_hexdump.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_devargs.c
-SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_vdev.c
+SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_dev.c
 
 CFLAGS_eal.o := -D_GNU_SOURCE
 CFLAGS_eal_thread.o := -D_GNU_SOURCE
diff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c
index 04b2b32..d95fd54 100644
--- a/lib/librte_eal/linuxapp/eal/eal.c
+++ b/lib/librte_eal/linuxapp/eal/eal.c
@@ -1058,8 +1058,8 @@ rte_eal_init(int argc, char **argv)
 			RTE_LOG(WARNING, EAL, "%s\n", dlerror());
 	}
 
-	if (rte_eal_vdev_init() < 0)
-		rte_panic("Cannot init virtual devices\n");
+	if (rte_eal_dev_init() < 0)
+		rte_panic("Cannot init pmd devices\n");
 
 	RTE_LOG(DEBUG, EAL, "Master core %u is ready (tid=%x)\n",
 		rte_config.master_lcore, (int)thread_id);
diff --git a/lib/librte_pmd_pcap/rte_eth_pcap.c b/lib/librte_pmd_pcap/rte_eth_pcap.c
index c987940..dc4670c 100644
--- a/lib/librte_pmd_pcap/rte_eth_pcap.c
+++ b/lib/librte_pmd_pcap/rte_eth_pcap.c
@@ -40,7 +40,7 @@
 #include <rte_string_fns.h>
 #include <rte_cycles.h>
 #include <rte_kvargs.h>
-#include <rte_vdev.h>
+#include <rte_dev.h>
 
 #include <net/if.h>
 
@@ -767,9 +767,10 @@ rte_pmd_pcap_devinit(const char *name, const char *params)
 
 }
 
-static struct rte_vdev_driver pmd_pcap_drv = {
+static struct rte_driver pmd_pcap_drv = {
 	.name = "eth_pcap",
+	.type = PMD_VDEV,
 	.init = rte_pmd_pcap_devinit,
 };
 
-PMD_REGISTER_DRIVER(pmd_pcap_drv, PMD_VDEV);
+PMD_REGISTER_DRIVER(pmd_pcap_drv);
diff --git a/lib/librte_pmd_ring/rte_eth_ring.c b/lib/librte_pmd_ring/rte_eth_ring.c
index 6325a3a..b761543 100644
--- a/lib/librte_pmd_ring/rte_eth_ring.c
+++ b/lib/librte_pmd_ring/rte_eth_ring.c
@@ -37,7 +37,7 @@
 #include <rte_malloc.h>
 #include <rte_memcpy.h>
 #include <rte_string_fns.h>
-#include <rte_vdev.h>
+#include <rte_dev.h>
 #include <rte_kvargs.h>
 
 #define ETH_RING_NUMA_NODE_ACTION_ARG	"nodeaction"
@@ -522,9 +522,10 @@ out:
 	return ret;
 }
 
-static struct rte_vdev_driver pmd_ring_drv = {
+static struct rte_driver pmd_ring_drv = {
 	.name = "eth_ring",
+	.type = PMD_VDEV,
 	.init = rte_pmd_ring_devinit,
 };
 
-PMD_REGISTER_DRIVER(pmd_ring_drv, PMD_VDEV);
+PMD_REGISTER_DRIVER(pmd_ring_drv);
diff --git a/lib/librte_pmd_xenvirt/rte_eth_xenvirt.c b/lib/librte_pmd_xenvirt/rte_eth_xenvirt.c
index ecafe7a..5b976d3 100644
--- a/lib/librte_pmd_xenvirt/rte_eth_xenvirt.c
+++ b/lib/librte_pmd_xenvirt/rte_eth_xenvirt.c
@@ -53,7 +53,7 @@
 #include <rte_malloc.h>
 #include <rte_memcpy.h>
 #include <rte_string_fns.h>
-#include <rte_vdev.h>
+#include <rte_dev.h>
 #include <cmdline_parse.h>
 #include <cmdline_parse_etheraddr.h>
 
@@ -706,9 +706,10 @@ rte_pmd_xenvirt_devinit(const char *name, const char *params)
 	return 0;
 }
 
-static struct rte_vdev_driver pmd_xenvirt_drv = {
+static struct rte_driver pmd_xenvirt_drv = {
 	.name = "eth_xenvirt",
+	.type = PMD_VDEV,
 	.init = rte_pmd_xenvirt_devinit,
 };
 
-PMD_REGISTER_DRIVER(pmd_xenvirt_drv, PMD_VDEV);
+PMD_REGISTER_DRIVER(pmd_xenvirt_drv);
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 77+ messages in thread

* [PATCH 0/X v5 07/14] igb: Convert to use of PMD_REGISTER_DRIVER and fix linking
       [not found]     ` <1398092379-7679-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
                         ` (5 preceding siblings ...)
  2014-04-21 14:59       ` [PATCH 0/X v5 06/14] eal: Make vdev init path generic for both virtual and physcial devices Neil Horman
@ 2014-04-21 14:59       ` Neil Horman
  2014-04-21 14:59       ` [PATCH 0/X v5 08/14] igbvf: " Neil Horman
                         ` (10 subsequent siblings)
  17 siblings, 0 replies; 77+ messages in thread
From: Neil Horman @ 2014-04-21 14:59 UTC (permalink / raw)
  To: dev-VfR2kkLFssw

convert the igb pmd driver to use the PMD_REGISTER_DRIVER macro.
This means that the test applications now have no reference to the igb library
when building DSO's and must specify its use on the command line with the -d
option.  Static linking will still initalize the driver automatically.

Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
---
 examples/dpdk_qat/main.c          |  4 ----
 lib/librte_ether/rte_ethdev.h     | 13 -------------
 lib/librte_pmd_e1000/igb_ethdev.c | 12 ++++++++++--
 3 files changed, 10 insertions(+), 19 deletions(-)

diff --git a/examples/dpdk_qat/main.c b/examples/dpdk_qat/main.c
index cdf6832..64cb610 100644
--- a/examples/dpdk_qat/main.c
+++ b/examples/dpdk_qat/main.c
@@ -697,10 +697,6 @@ MAIN(int argc, char **argv)
 		return -1;
 
 	/* init driver */
-#ifdef RTE_LIBRTE_IGB_PMD
-	if (rte_igb_pmd_init() < 0)
-		rte_panic("Cannot init igb pmd\n");
-#endif
 #ifdef RTE_LIBRTE_IXGBE_PMD
 	if (rte_ixgbe_pmd_init() < 0)
 		rte_panic("Cannot init ixgbe pmd\n");
diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index dea7471..e50ed48 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -1317,15 +1317,6 @@ extern void rte_eth_driver_register(struct eth_driver *eth_drv);
 
 /**
  * The initialization function of the driver for
- * Intel(r) IGB Gigabit Ethernet Controller devices.
- * This function is invoked once at EAL start time.
- * @return
- *   0 on success
- */
-extern int rte_igb_pmd_init(void);
-
-/**
- * The initialization function of the driver for
  * Intel(r) EM Gigabit Ethernet Controller devices.
  * This function is invoked once at EAL start time.
  * @return
@@ -1402,10 +1393,6 @@ int rte_pmd_init_all(void)
 	int ret = -ENODEV;
 
 #ifdef RTE_LIBRTE_IGB_PMD
-	if ((ret = rte_igb_pmd_init()) != 0) {
-		RTE_LOG(ERR, PMD, "Cannot init igb PMD\n");
-		return (ret);
-	}
 	if ((ret = rte_igbvf_pmd_init()) != 0) {
 		RTE_LOG(ERR, PMD, "Cannot init igbvf PMD\n");
 		return (ret);
diff --git a/lib/librte_pmd_e1000/igb_ethdev.c b/lib/librte_pmd_e1000/igb_ethdev.c
index 673b4de..5e578c5 100644
--- a/lib/librte_pmd_e1000/igb_ethdev.c
+++ b/lib/librte_pmd_e1000/igb_ethdev.c
@@ -51,6 +51,7 @@
 #include <rte_eal.h>
 #include <rte_atomic.h>
 #include <rte_malloc.h>
+#include <rte_dev.h>
 
 #include "e1000_logs.h"
 #include "e1000/e1000_api.h"
@@ -619,8 +620,8 @@ static struct eth_driver rte_igbvf_pmd = {
 	.dev_private_size = sizeof(struct e1000_adapter),
 };
 
-int
-rte_igb_pmd_init(void)
+static int
+rte_igb_pmd_init(const char *name __rte_unused, const char *params __rte_unused)
 {
 	rte_eth_driver_register(&rte_igb_pmd);
 	return 0;
@@ -2182,3 +2183,10 @@ eth_igb_rss_reta_query(struct rte_eth_dev *dev,
  
 	return 0;
 }
+
+static struct rte_driver pmd_igb_drv = {
+        .type = PMD_PDEV,
+	.init = rte_igb_pmd_init,
+};
+
+PMD_REGISTER_DRIVER(pmd_igb_drv);
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 77+ messages in thread

* [PATCH 0/X v5 08/14] igbvf: Convert to use of PMD_REGISTER_DRIVER and fix linking
       [not found]     ` <1398092379-7679-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
                         ` (6 preceding siblings ...)
  2014-04-21 14:59       ` [PATCH 0/X v5 07/14] igb: Convert to use of PMD_REGISTER_DRIVER and fix linking Neil Horman
@ 2014-04-21 14:59       ` Neil Horman
  2014-04-21 14:59       ` [PATCH 0/X v5 09/14] e1000: " Neil Horman
                         ` (9 subsequent siblings)
  17 siblings, 0 replies; 77+ messages in thread
From: Neil Horman @ 2014-04-21 14:59 UTC (permalink / raw)
  To: dev-VfR2kkLFssw

convert the igbvf pmd driver to use the PMD_REGISTER_DRIVER macro.
This means that the test applications now have no reference to the igbvf library
when building DSO's and must specify its use on the command line with the -d
option.  Static linking will still initalize the driver automatically.

Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
---
 lib/librte_ether/rte_ethdev.h     | 16 ----------------
 lib/librte_pmd_e1000/igb_ethdev.c | 10 ++++++++--
 2 files changed, 8 insertions(+), 18 deletions(-)

diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index e50ed48..d13cc4f 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -1325,15 +1325,6 @@ extern void rte_eth_driver_register(struct eth_driver *eth_drv);
 extern int rte_em_pmd_init(void);
 
 /**
- * The initialization function of the driver for 1Gbps Intel IGB_VF
- * Ethernet devices.
- * Invoked once at EAL start time.
- * @return
- *   0 on success
- */
-extern int rte_igbvf_pmd_init(void);
-
-/**
  * The initialization function of the driver for 10Gbps Intel IXGBE
  * Ethernet devices.
  * Invoked once at EAL start time.
@@ -1392,13 +1383,6 @@ int rte_pmd_init_all(void)
 {
 	int ret = -ENODEV;
 
-#ifdef RTE_LIBRTE_IGB_PMD
-	if ((ret = rte_igbvf_pmd_init()) != 0) {
-		RTE_LOG(ERR, PMD, "Cannot init igbvf PMD\n");
-		return (ret);
-	}
-#endif /* RTE_LIBRTE_IGB_PMD */
-
 #ifdef RTE_LIBRTE_EM_PMD
 	if ((ret = rte_em_pmd_init()) != 0) {
 		RTE_LOG(ERR, PMD, "Cannot init em PMD\n");
diff --git a/lib/librte_pmd_e1000/igb_ethdev.c b/lib/librte_pmd_e1000/igb_ethdev.c
index 5e578c5..6aaded0 100644
--- a/lib/librte_pmd_e1000/igb_ethdev.c
+++ b/lib/librte_pmd_e1000/igb_ethdev.c
@@ -643,8 +643,8 @@ igb_vmdq_vlan_hw_filter_enable(struct rte_eth_dev *dev)
  * Invoked one at EAL init time.
  * Register itself as the [Virtual Poll Mode] Driver of PCI IGB devices.
  */
-int
-rte_igbvf_pmd_init(void)
+static int
+rte_igbvf_pmd_init(const char *name __rte_unused, const char *params __rte_unused)
 {
 	DEBUGFUNC("rte_igbvf_pmd_init");
 
@@ -2189,4 +2189,10 @@ static struct rte_driver pmd_igb_drv = {
 	.init = rte_igb_pmd_init,
 };
 
+static struct rte_driver pmd_igbvf_drv = {
+	.type = PMD_PDEV,
+	.init = rte_igbvf_pmd_init,
+};
+
 PMD_REGISTER_DRIVER(pmd_igb_drv);
+PMD_REGISTER_DRIVER(pmd_igbvf_drv);
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 77+ messages in thread

* [PATCH 0/X v5 09/14] e1000: Convert to use of PMD_REGISTER_DRIVER and fix linking
       [not found]     ` <1398092379-7679-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
                         ` (7 preceding siblings ...)
  2014-04-21 14:59       ` [PATCH 0/X v5 08/14] igbvf: " Neil Horman
@ 2014-04-21 14:59       ` Neil Horman
  2014-04-21 14:59       ` [PATCH 0/X v5 10/14] ixgbe: " Neil Horman
                         ` (8 subsequent siblings)
  17 siblings, 0 replies; 77+ messages in thread
From: Neil Horman @ 2014-04-21 14:59 UTC (permalink / raw)
  To: dev-VfR2kkLFssw

convert the e1000 pmd driver to use the PMD_REGISTER_DRIVER macro.
This means that the test applications now have no reference to the e1000 library
when building DSO's and must specify its use on the command line with the -d
option.  Static linking will still initalize the driver automatically.

Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
---
 lib/librte_ether/rte_ethdev.h    | 16 ----------------
 lib/librte_pmd_e1000/em_ethdev.c | 12 ++++++++++--
 mk/rte.app.mk                    |  8 ++++----
 3 files changed, 14 insertions(+), 22 deletions(-)

diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index d13cc4f..9e32f56 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -1316,15 +1316,6 @@ struct eth_driver {
 extern void rte_eth_driver_register(struct eth_driver *eth_drv);
 
 /**
- * The initialization function of the driver for
- * Intel(r) EM Gigabit Ethernet Controller devices.
- * This function is invoked once at EAL start time.
- * @return
- *   0 on success
- */
-extern int rte_em_pmd_init(void);
-
-/**
  * The initialization function of the driver for 10Gbps Intel IXGBE
  * Ethernet devices.
  * Invoked once at EAL start time.
@@ -1383,13 +1374,6 @@ int rte_pmd_init_all(void)
 {
 	int ret = -ENODEV;
 
-#ifdef RTE_LIBRTE_EM_PMD
-	if ((ret = rte_em_pmd_init()) != 0) {
-		RTE_LOG(ERR, PMD, "Cannot init em PMD\n");
-		return (ret);
-	}
-#endif /* RTE_LIBRTE_EM_PMD */
-
 #ifdef RTE_LIBRTE_IXGBE_PMD
 	if ((ret = rte_ixgbe_pmd_init()) != 0) {
 		RTE_LOG(ERR, PMD, "Cannot init ixgbe PMD\n");
diff --git a/lib/librte_pmd_e1000/em_ethdev.c b/lib/librte_pmd_e1000/em_ethdev.c
index d8c9a9b..000feef 100644
--- a/lib/librte_pmd_e1000/em_ethdev.c
+++ b/lib/librte_pmd_e1000/em_ethdev.c
@@ -51,6 +51,7 @@
 #include <rte_eal.h>
 #include <rte_atomic.h>
 #include <rte_malloc.h>
+#include <rte_dev.h>
 
 #include "e1000_logs.h"
 #include "e1000/e1000_api.h"
@@ -285,8 +286,8 @@ static struct eth_driver rte_em_pmd = {
 	.dev_private_size = sizeof(struct e1000_adapter),
 };
 
-int
-rte_em_pmd_init(void)
+static int
+rte_em_pmd_init(const char *name __rte_unused, const char *params __rte_unused)
 {
 	rte_eth_driver_register(&rte_em_pmd);
 	return 0;
@@ -1433,3 +1434,10 @@ eth_em_rar_clear(struct rte_eth_dev *dev, uint32_t index)
 
 	e1000_rar_set(hw, addr, index);
 }
+
+struct rte_driver em_pmd_drv = {
+	.type = PMD_PDEV,
+	.init = rte_em_pmd_init,
+};
+
+PMD_REGISTER_DRIVER(em_pmd_drv);
diff --git a/mk/rte.app.mk b/mk/rte.app.mk
index aabe75e..a94830e 100644
--- a/mk/rte.app.mk
+++ b/mk/rte.app.mk
@@ -73,10 +73,6 @@ LDLIBS += -lrte_ivshmem
 endif
 endif
 
-ifeq ($(CONFIG_RTE_LIBRTE_E1000_PMD),y)
-LDLIBS += -lrte_pmd_e1000
-endif
-
 ifeq ($(CONFIG_RTE_LIBRTE_IXGBE_PMD),y)
 LDLIBS += -lrte_pmd_ixgbe
 endif
@@ -169,6 +165,10 @@ endif
 
 ifeq ($(RTE_BUILD_SHARED_LIB),n)
 
+ifeq ($(CONFIG_RTE_LIBRTE_E1000_PMD),y)
+LDLIBS += -lrte_pmd_e1000
+endif
+
 ifeq ($(CONFIG_RTE_LIBRTE_PMD_RING),y)
 LDLIBS += -lrte_pmd_ring
 endif
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 77+ messages in thread

* [PATCH 0/X v5 10/14] ixgbe: Convert to use of PMD_REGISTER_DRIVER and fix linking
       [not found]     ` <1398092379-7679-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
                         ` (8 preceding siblings ...)
  2014-04-21 14:59       ` [PATCH 0/X v5 09/14] e1000: " Neil Horman
@ 2014-04-21 14:59       ` Neil Horman
  2014-04-21 14:59       ` [PATCH 0/X v5 11/14] ixgbevf: " Neil Horman
                         ` (7 subsequent siblings)
  17 siblings, 0 replies; 77+ messages in thread
From: Neil Horman @ 2014-04-21 14:59 UTC (permalink / raw)
  To: dev-VfR2kkLFssw

convert the ixgbe pmd driver to use the PMD_REGISTER_DRIVER macro.
This means that the test applications now have no reference to the ixgbe library
when building DSO's and must specify its use on the command line with the -d
option.  Static linking will still initalize the driver automatically.

Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
---
 examples/dpdk_qat/main.c            |  6 ------
 examples/vmdq_dcb/main.c            |  4 ----
 lib/librte_ether/rte_ethdev.h       | 13 -------------
 lib/librte_pmd_ixgbe/ixgbe_ethdev.c | 12 ++++++++++--
 4 files changed, 10 insertions(+), 25 deletions(-)

diff --git a/examples/dpdk_qat/main.c b/examples/dpdk_qat/main.c
index 64cb610..741d3f3 100644
--- a/examples/dpdk_qat/main.c
+++ b/examples/dpdk_qat/main.c
@@ -696,12 +696,6 @@ MAIN(int argc, char **argv)
 	if (ret < 0)
 		return -1;
 
-	/* init driver */
-#ifdef RTE_LIBRTE_IXGBE_PMD
-	if (rte_ixgbe_pmd_init() < 0)
-		rte_panic("Cannot init ixgbe pmd\n");
-#endif
-
 	if (rte_eal_pci_probe() < 0)
 		rte_panic("Cannot probe PCI\n");
 
diff --git a/examples/vmdq_dcb/main.c b/examples/vmdq_dcb/main.c
index 844f334..1626ba5 100644
--- a/examples/vmdq_dcb/main.c
+++ b/examples/vmdq_dcb/main.c
@@ -455,10 +455,6 @@ MAIN(int argc, char *argv[])
 	if (ret < 0)
 		rte_exit(EXIT_FAILURE, "Invalid VMDQ argument\n");
 
-	if (rte_ixgbe_pmd_init() != 0 ||
-			rte_eal_pci_probe() != 0)
-		rte_exit(EXIT_FAILURE, "Error with NIC driver initialization\n");
-	
 	cores = rte_lcore_count();
 	if ((cores & (cores - 1)) != 0 || cores > 128) {
 		rte_exit(EXIT_FAILURE,"This program can only run on an even"
diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index 9e32f56..9621be7 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -1316,15 +1316,6 @@ struct eth_driver {
 extern void rte_eth_driver_register(struct eth_driver *eth_drv);
 
 /**
- * The initialization function of the driver for 10Gbps Intel IXGBE
- * Ethernet devices.
- * Invoked once at EAL start time.
- * @return
- *   0 on success
- */
-extern int rte_ixgbe_pmd_init(void);
-
-/**
  * The initialization function of the driver for 10Gbps Intel IXGBE_VF
  * Ethernet devices.
  * Invoked once at EAL start time.
@@ -1375,10 +1366,6 @@ int rte_pmd_init_all(void)
 	int ret = -ENODEV;
 
 #ifdef RTE_LIBRTE_IXGBE_PMD
-	if ((ret = rte_ixgbe_pmd_init()) != 0) {
-		RTE_LOG(ERR, PMD, "Cannot init ixgbe PMD\n");
-		return (ret);
-	}
 	if ((ret = rte_ixgbevf_pmd_init()) != 0) {
 		RTE_LOG(ERR, PMD, "Cannot init ixgbevf PMD\n");
 		return (ret);
diff --git a/lib/librte_pmd_ixgbe/ixgbe_ethdev.c b/lib/librte_pmd_ixgbe/ixgbe_ethdev.c
index a5a7f9a..efe899a 100644
--- a/lib/librte_pmd_ixgbe/ixgbe_ethdev.c
+++ b/lib/librte_pmd_ixgbe/ixgbe_ethdev.c
@@ -58,6 +58,7 @@
 #include <rte_ethdev.h>
 #include <rte_atomic.h>
 #include <rte_malloc.h>
+#include <rte_dev.h>
 
 #include "ixgbe_logs.h"
 #include "ixgbe/ixgbe_api.h"
@@ -955,8 +956,8 @@ static struct eth_driver rte_ixgbevf_pmd = {
  * Invoked once at EAL init time.
  * Register itself as the [Poll Mode] Driver of PCI IXGBE devices.
  */
-int
-rte_ixgbe_pmd_init(void)
+static int
+rte_ixgbe_pmd_init(const char *name __rte_unused, const char *params __rte_unused)
 {
 	PMD_INIT_FUNC_TRACE();
 
@@ -3060,3 +3061,10 @@ ixgbe_mirror_rule_reset(struct rte_eth_dev *dev, uint8_t rule_id)
 
 	return 0;
 }
+
+struct rte_driver rte_ixgbe_driver = {
+	.type = PMD_PDEV,
+	.init = rte_ixgbe_pmd_init,
+};
+
+PMD_REGISTER_DRIVER(rte_ixgbe_driver);
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 77+ messages in thread

* [PATCH 0/X v5 11/14] ixgbevf: Convert to use of PMD_REGISTER_DRIVER and fix linking
       [not found]     ` <1398092379-7679-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
                         ` (9 preceding siblings ...)
  2014-04-21 14:59       ` [PATCH 0/X v5 10/14] ixgbe: " Neil Horman
@ 2014-04-21 14:59       ` Neil Horman
  2014-04-21 14:59       ` [PATCH 0/X v5 12/14] virtio: " Neil Horman
                         ` (6 subsequent siblings)
  17 siblings, 0 replies; 77+ messages in thread
From: Neil Horman @ 2014-04-21 14:59 UTC (permalink / raw)
  To: dev-VfR2kkLFssw

convert the ixgbevf pmd driver to use the PMD_REGISTER_DRIVER macro.
This means that the test applications now have no reference to the ixgbevf library
when building DSO's and must specify its use on the command line with the -d
option.  Static linking will still initalize the driver automatically.

Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
---
 lib/librte_ether/rte_ethdev.h       | 16 ----------------
 lib/librte_pmd_ixgbe/ixgbe_ethdev.c | 12 +++++++++---
 mk/rte.app.mk                       |  8 ++++----
 3 files changed, 13 insertions(+), 23 deletions(-)

diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index 9621be7..ba535dc 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -1316,15 +1316,6 @@ struct eth_driver {
 extern void rte_eth_driver_register(struct eth_driver *eth_drv);
 
 /**
- * The initialization function of the driver for 10Gbps Intel IXGBE_VF
- * Ethernet devices.
- * Invoked once at EAL start time.
- * @return
- *   0 on success
- */
-extern int rte_ixgbevf_pmd_init(void);
-
-/**
  * The initialization function of the driver for Qumranet virtio-net
  * Ethernet devices.
  * Invoked once at EAL start time.
@@ -1365,13 +1356,6 @@ int rte_pmd_init_all(void)
 {
 	int ret = -ENODEV;
 
-#ifdef RTE_LIBRTE_IXGBE_PMD
-	if ((ret = rte_ixgbevf_pmd_init()) != 0) {
-		RTE_LOG(ERR, PMD, "Cannot init ixgbevf PMD\n");
-		return (ret);
-	}
-#endif /* RTE_LIBRTE_IXGBE_PMD */
-
 #ifdef RTE_LIBRTE_VIRTIO_PMD
 	if ((ret = rte_virtio_pmd_init()) != 0) {
 		RTE_LOG(ERR, PMD, "Cannot init virtio PMD\n");
diff --git a/lib/librte_pmd_ixgbe/ixgbe_ethdev.c b/lib/librte_pmd_ixgbe/ixgbe_ethdev.c
index efe899a..10dde5f 100644
--- a/lib/librte_pmd_ixgbe/ixgbe_ethdev.c
+++ b/lib/librte_pmd_ixgbe/ixgbe_ethdev.c
@@ -970,8 +970,8 @@ rte_ixgbe_pmd_init(const char *name __rte_unused, const char *params __rte_unuse
  * Invoked one at EAL init time.
  * Register itself as the [Virtual Poll Mode] Driver of PCI niantic devices.
  */
-int
-rte_ixgbevf_pmd_init(void)
+static int
+rte_ixgbevf_pmd_init(const char *name __rte_unused, const char *param __rte_unused)
 {
 	DEBUGFUNC("rte_ixgbevf_pmd_init");
 
@@ -3062,9 +3062,15 @@ ixgbe_mirror_rule_reset(struct rte_eth_dev *dev, uint8_t rule_id)
 	return 0;
 }
 
-struct rte_driver rte_ixgbe_driver = {
+static struct rte_driver rte_ixgbe_driver = {
 	.type = PMD_PDEV,
 	.init = rte_ixgbe_pmd_init,
 };
 
+static struct rte_driver rte_ixgbevf_driver = {
+	.type = PMD_PDEV,
+	.init = rte_ixgbevf_pmd_init,
+};
+
 PMD_REGISTER_DRIVER(rte_ixgbe_driver);
+PMD_REGISTER_DRIVER(rte_ixgbevf_driver);
diff --git a/mk/rte.app.mk b/mk/rte.app.mk
index a94830e..d8f7907 100644
--- a/mk/rte.app.mk
+++ b/mk/rte.app.mk
@@ -73,10 +73,6 @@ LDLIBS += -lrte_ivshmem
 endif
 endif
 
-ifeq ($(CONFIG_RTE_LIBRTE_IXGBE_PMD),y)
-LDLIBS += -lrte_pmd_ixgbe
-endif
-
 ifeq ($(CONFIG_RTE_LIBRTE_VIRTIO_PMD),y)
 LDLIBS += -lrte_pmd_virtio_uio
 endif
@@ -165,6 +161,10 @@ endif
 
 ifeq ($(RTE_BUILD_SHARED_LIB),n)
 
+ifeq ($(CONFIG_RTE_LIBRTE_IXGBE_PMD),y)
+LDLIBS += -lrte_pmd_ixgbe
+endif
+
 ifeq ($(CONFIG_RTE_LIBRTE_E1000_PMD),y)
 LDLIBS += -lrte_pmd_e1000
 endif
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 77+ messages in thread

* [PATCH 0/X v5 12/14] virtio: Convert to use of PMD_REGISTER_DRIVER and fix linking
       [not found]     ` <1398092379-7679-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
                         ` (10 preceding siblings ...)
  2014-04-21 14:59       ` [PATCH 0/X v5 11/14] ixgbevf: " Neil Horman
@ 2014-04-21 14:59       ` Neil Horman
  2014-04-21 14:59       ` [PATCH 0/X v5 13/14] vmxnet3: " Neil Horman
                         ` (5 subsequent siblings)
  17 siblings, 0 replies; 77+ messages in thread
From: Neil Horman @ 2014-04-21 14:59 UTC (permalink / raw)
  To: dev-VfR2kkLFssw

convert the virtio pmd driver to use the PMD_REGISTER_DRIVER macro.
This means that the test applications now have no reference to the virtio library
when building DSO's and must specify its use on the command line with the -d
option.  Static linking will still initalize the driver automatically.

Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
---
 lib/librte_ether/rte_ethdev.h         | 16 ----------------
 lib/librte_pmd_virtio/virtio_ethdev.c | 12 ++++++++++--
 mk/rte.app.mk                         |  8 ++++----
 3 files changed, 14 insertions(+), 22 deletions(-)

diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index ba535dc..7126f95 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -1316,15 +1316,6 @@ struct eth_driver {
 extern void rte_eth_driver_register(struct eth_driver *eth_drv);
 
 /**
- * The initialization function of the driver for Qumranet virtio-net
- * Ethernet devices.
- * Invoked once at EAL start time.
- * @return
- *   0 on success
- */
-extern int rte_virtio_pmd_init(void);
-
-/**
  * The initialization function of the driver for VMware VMXNET3
  * Ethernet devices.
  * Invoked once at EAL start time.
@@ -1356,13 +1347,6 @@ int rte_pmd_init_all(void)
 {
 	int ret = -ENODEV;
 
-#ifdef RTE_LIBRTE_VIRTIO_PMD
-	if ((ret = rte_virtio_pmd_init()) != 0) {
-		RTE_LOG(ERR, PMD, "Cannot init virtio PMD\n");
-		return (ret);
-	}
-#endif /* RTE_LIBRTE_VIRTIO_PMD */
-
 #ifdef RTE_LIBRTE_VMXNET3_PMD
 	if ((ret = rte_vmxnet3_pmd_init()) != 0) {
 		RTE_LOG(ERR, PMD, "Cannot init vmxnet3 PMD\n");
diff --git a/lib/librte_pmd_virtio/virtio_ethdev.c b/lib/librte_pmd_virtio/virtio_ethdev.c
index f107161..611393e 100644
--- a/lib/librte_pmd_virtio/virtio_ethdev.c
+++ b/lib/librte_pmd_virtio/virtio_ethdev.c
@@ -50,6 +50,7 @@
 
 #include <rte_memory.h>
 #include <rte_eal.h>
+#include <rte_dev.h>
 
 #include "virtio_ethdev.h"
 #include "virtio_pci.h"
@@ -486,8 +487,8 @@ static struct eth_driver rte_virtio_pmd = {
  * Register itself as the [Poll Mode] Driver of PCI virtio devices.
  * Returns 0 on success.
  */
-int
-rte_virtio_pmd_init(void)
+static int
+rte_virtio_pmd_init(const char *name __rte_unused, const char *param __rte_unused)
 {
 	rte_eth_driver_register(&rte_virtio_pmd);
 	return (0);
@@ -643,3 +644,10 @@ virtio_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 	dev_info->max_rx_pktlen = VIRTIO_MAX_RX_PKTLEN;
 	dev_info->max_mac_addrs = VIRTIO_MAX_MAC_ADDRS;
 }
+
+static struct rte_driver rte_virtio_driver = {
+	.type = PMD_PDEV,
+	.init = rte_virtio_pmd_init,
+};
+
+PMD_REGISTER_DRIVER(rte_virtio_driver);
diff --git a/mk/rte.app.mk b/mk/rte.app.mk
index d8f7907..3f1386b 100644
--- a/mk/rte.app.mk
+++ b/mk/rte.app.mk
@@ -73,10 +73,6 @@ LDLIBS += -lrte_ivshmem
 endif
 endif
 
-ifeq ($(CONFIG_RTE_LIBRTE_VIRTIO_PMD),y)
-LDLIBS += -lrte_pmd_virtio_uio
-endif
-
 ifeq ($(CONFIG_RTE_LIBRTE_VMXNET3_PMD),y)
 LDLIBS += -lrte_pmd_vmxnet3_uio
 endif
@@ -161,6 +157,10 @@ endif
 
 ifeq ($(RTE_BUILD_SHARED_LIB),n)
 
+ifeq ($(CONFIG_RTE_LIBRTE_VIRTIO_PMD),y)
+LDLIBS += -lrte_pmd_virtio_uio
+endif
+
 ifeq ($(CONFIG_RTE_LIBRTE_IXGBE_PMD),y)
 LDLIBS += -lrte_pmd_ixgbe
 endif
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 77+ messages in thread

* [PATCH 0/X v5 13/14] vmxnet3: Convert to use of PMD_REGISTER_DRIVER and fix linking
       [not found]     ` <1398092379-7679-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
                         ` (11 preceding siblings ...)
  2014-04-21 14:59       ` [PATCH 0/X v5 12/14] virtio: " Neil Horman
@ 2014-04-21 14:59       ` Neil Horman
  2014-04-21 14:59       ` [PATCH 0/X v5 14/14] pmd: Remove rte_pmd_init_all Neil Horman
                         ` (4 subsequent siblings)
  17 siblings, 0 replies; 77+ messages in thread
From: Neil Horman @ 2014-04-21 14:59 UTC (permalink / raw)
  To: dev-VfR2kkLFssw

convert the vmxnet3 pmd driver to use the PMD_REGISTER_DRIVER macro.
This means that the test applications now have no reference to the vmxnet3 library
when building DSO's and must specify its use on the command line with the -d
option.  Static linking will still initalize the driver automatically.

Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
---
 lib/librte_ether/rte_ethdev.h           | 19 +------------------
 lib/librte_pmd_vmxnet3/vmxnet3_ethdev.c | 12 ++++++++++--
 mk/rte.app.mk                           |  8 ++++----
 3 files changed, 15 insertions(+), 24 deletions(-)

diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index 7126f95..24288f8 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -1316,16 +1316,6 @@ struct eth_driver {
 extern void rte_eth_driver_register(struct eth_driver *eth_drv);
 
 /**
- * The initialization function of the driver for VMware VMXNET3
- * Ethernet devices.
- * Invoked once at EAL start time.
- * @return
- *   0 on success
- */
-extern int rte_vmxnet3_pmd_init(void);
-
-
-/**
  * The initialization function of *all* supported and enabled drivers.
  * Right now, the following PMDs are supported:
  *  - igb
@@ -1345,14 +1335,7 @@ extern int rte_vmxnet3_pmd_init(void);
 static inline
 int rte_pmd_init_all(void)
 {
-	int ret = -ENODEV;
-
-#ifdef RTE_LIBRTE_VMXNET3_PMD
-	if ((ret = rte_vmxnet3_pmd_init()) != 0) {
-		RTE_LOG(ERR, PMD, "Cannot init vmxnet3 PMD\n");
-		return (ret);
-	}
-#endif /* RTE_LIBRTE_VMXNET3_PMD */
+	int ret = 0;
 
 	if (ret == -ENODEV)
 		RTE_LOG(ERR, PMD, "No PMD(s) are configured\n");
diff --git a/lib/librte_pmd_vmxnet3/vmxnet3_ethdev.c b/lib/librte_pmd_vmxnet3/vmxnet3_ethdev.c
index 8259cfe..c41032f 100644
--- a/lib/librte_pmd_vmxnet3/vmxnet3_ethdev.c
+++ b/lib/librte_pmd_vmxnet3/vmxnet3_ethdev.c
@@ -60,6 +60,7 @@
 #include <rte_atomic.h>
 #include <rte_string_fns.h>
 #include <rte_malloc.h>
+#include <rte_dev.h>
 
 #include "vmxnet3/vmxnet3_defs.h"
 
@@ -278,8 +279,8 @@ static struct eth_driver rte_vmxnet3_pmd = {
  * Invoked once at EAL init time.
  * Register itself as the [Poll Mode] Driver of Virtual PCI VMXNET3 devices.
  */
-int
-rte_vmxnet3_pmd_init(void)
+static int
+rte_vmxnet3_pmd_init(const char *name __rte_unused, const char *param __rte_unused)
 {
 	PMD_INIT_FUNC_TRACE();
 
@@ -763,3 +764,10 @@ vmxnet3_process_events(struct vmxnet3_hw *hw)
 
 }
 #endif
+
+static struct rte_driver rte_vmxnet3_driver = {
+	.type = PMD_PDEV,
+	.init = rte_vmxnet3_pmd_init,
+};
+
+PMD_REGISTER_DRIVER(rte_vmxnet3_driver);
diff --git a/mk/rte.app.mk b/mk/rte.app.mk
index 3f1386b..cfea6c6 100644
--- a/mk/rte.app.mk
+++ b/mk/rte.app.mk
@@ -73,10 +73,6 @@ LDLIBS += -lrte_ivshmem
 endif
 endif
 
-ifeq ($(CONFIG_RTE_LIBRTE_VMXNET3_PMD),y)
-LDLIBS += -lrte_pmd_vmxnet3_uio
-endif
-
 ifeq ($(CONFIG_RTE_LIBRTE_TIMER),y)
 LDLIBS += -lrte_timer
 endif
@@ -157,6 +153,10 @@ endif
 
 ifeq ($(RTE_BUILD_SHARED_LIB),n)
 
+ifeq ($(CONFIG_RTE_LIBRTE_VMXNET3_PMD),y)
+LDLIBS += -lrte_pmd_vmxnet3_uio
+endif
+
 ifeq ($(CONFIG_RTE_LIBRTE_VIRTIO_PMD),y)
 LDLIBS += -lrte_pmd_virtio_uio
 endif
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 77+ messages in thread

* [PATCH 0/X v5 14/14] pmd: Remove rte_pmd_init_all
       [not found]     ` <1398092379-7679-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
                         ` (12 preceding siblings ...)
  2014-04-21 14:59       ` [PATCH 0/X v5 13/14] vmxnet3: " Neil Horman
@ 2014-04-21 14:59       ` Neil Horman
  2014-04-21 17:05       ` [PATCH v5 00/14] dpdk: Separate compile time linkage between eal lib and pmd's Neil Horman
                         ` (3 subsequent siblings)
  17 siblings, 0 replies; 77+ messages in thread
From: Neil Horman @ 2014-04-21 14:59 UTC (permalink / raw)
  To: dev-VfR2kkLFssw

Now that we've converted all the pmds in dpdk to use the driver registration
macro, rte_pmd_init_all has become empty.  As theres no reason to keep it around
anymore, just remove it and fix up all the eample callers.

Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
---
 app/test-pmd/testpmd.c                             |  3 ---
 app/test/test_kni.c                                |  5 ----
 examples/exception_path/main.c                     |  5 ----
 examples/ip_reassembly/main.c                      |  4 ----
 examples/ipv4_frag/main.c                          |  4 ----
 examples/ipv4_multicast/main.c                     |  4 ----
 examples/kni/main.c                                |  5 ----
 examples/l2fwd-ivshmem/host/host.c                 |  4 ----
 examples/l2fwd/main.c                              |  4 ----
 examples/l3fwd-power/main.c                        |  4 ----
 examples/l3fwd-vf/main.c                           |  4 ----
 examples/l3fwd/main.c                              |  4 ----
 examples/link_status_interrupt/main.c              |  4 ----
 examples/load_balancer/init.c                      |  6 -----
 .../client_server_mp/shared/init_drivers.h         |  2 +-
 examples/multi_process/l2fwd_fork/main.c           |  4 ----
 examples/multi_process/symmetric_mp/main.c         |  2 --
 examples/netmap_compat/bridge/bridge.c             |  4 ----
 examples/qos_meter/main.c                          |  4 ----
 examples/qos_sched/init.c                          |  4 ----
 examples/quota_watermark/qw/init.c                 |  5 ----
 examples/vhost/main.c                              |  2 +-
 examples/vhost_xen/main.c                          |  2 +-
 examples/vmdq/main.c                               |  2 +-
 lib/librte_ether/rte_ethdev.h                      | 27 ----------------------
 25 files changed, 4 insertions(+), 114 deletions(-)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 04dca57..7f2dcde 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1755,9 +1755,6 @@ main(int argc, char** argv)
 	if (diag < 0)
 		rte_panic("Cannot init EAL\n");
 
-	if (rte_pmd_init_all())
-		rte_panic("Cannot init PMD\n");
-
 	if (rte_eal_pci_probe())
 		rte_panic("Cannot probe PCI\n");
 
diff --git a/app/test/test_kni.c b/app/test/test_kni.c
index e0fe44e..d37758b 100644
--- a/app/test/test_kni.c
+++ b/app/test/test_kni.c
@@ -509,11 +509,6 @@ test_kni(void)
 		printf("fail to create mempool for kni\n");
 		return -1;
 	}
-	ret = rte_pmd_init_all();
-	if (ret < 0) {
-		printf("fail to initialize PMD\n");
-		return -1;
-	}
 	ret = rte_eal_pci_probe();
 	if (ret < 0) {
 		printf("fail to probe PCI devices\n");
diff --git a/examples/exception_path/main.c b/examples/exception_path/main.c
index 0bc149d..d73b413 100644
--- a/examples/exception_path/main.c
+++ b/examples/exception_path/main.c
@@ -566,11 +566,6 @@ main(int argc, char** argv)
 		return -1;
 	}
 
-	/* Initialise PMD driver(s) */
-	ret = rte_pmd_init_all();
-	if (ret < 0)
-		FATAL_ERROR("Could not probe PMD (%d)", ret);
-
 	/* Scan PCI bus for recognised devices */
 	ret = rte_eal_pci_probe();
 	if (ret < 0)
diff --git a/examples/ip_reassembly/main.c b/examples/ip_reassembly/main.c
index 4880a5f..bafa8d9 100644
--- a/examples/ip_reassembly/main.c
+++ b/examples/ip_reassembly/main.c
@@ -1553,10 +1553,6 @@ MAIN(int argc, char **argv)
 		rte_exit(EXIT_FAILURE, "init_lcore_rx_queues failed\n");
 
 
-	/* init driver(s) */
-	if (rte_pmd_init_all() < 0)
-		rte_exit(EXIT_FAILURE, "Cannot init pmd\n");
-
 	if (rte_eal_pci_probe() < 0)
 		rte_exit(EXIT_FAILURE, "Cannot probe PCI\n");
 
diff --git a/examples/ipv4_frag/main.c b/examples/ipv4_frag/main.c
index 93664c8..329f2ce 100644
--- a/examples/ipv4_frag/main.c
+++ b/examples/ipv4_frag/main.c
@@ -608,10 +608,6 @@ MAIN(int argc, char **argv)
 	if (pool_indirect == NULL)
 		rte_panic("Cannot init indirect mbuf pool\n");
 
-	/* init driver */
-	if (rte_pmd_init_all() < 0)
-		rte_panic("Cannot init PMD\n");
-
 	if (rte_eal_pci_probe() < 0)
 		rte_panic("Cannot probe PCI\n");
 
diff --git a/examples/ipv4_multicast/main.c b/examples/ipv4_multicast/main.c
index 3bd37e4..da4e09d 100644
--- a/examples/ipv4_multicast/main.c
+++ b/examples/ipv4_multicast/main.c
@@ -753,10 +753,6 @@ MAIN(int argc, char **argv)
 	if (clone_pool == NULL)
 		rte_exit(EXIT_FAILURE, "Cannot init clone mbuf pool\n");
 
-	/* init driver */
-	if (rte_pmd_init_all() < 0)
-		rte_exit(EXIT_FAILURE, "Cannot init pmd\n");
-
 	if (rte_eal_pci_probe() < 0)
 		rte_exit(EXIT_FAILURE, "Cannot probe PCI\n");
 
diff --git a/examples/kni/main.c b/examples/kni/main.c
index 274990b..fe823b3 100644
--- a/examples/kni/main.c
+++ b/examples/kni/main.c
@@ -889,11 +889,6 @@ main(int argc, char** argv)
 		return -1;
 	}
 
-	/* Initialise PMD driver(s) */
-	ret = rte_pmd_init_all();
-	if (ret < 0)
-		rte_exit(EXIT_FAILURE, "Could not initialise PMD (%d)\n", ret);
-
 	/* Scan PCI bus for recognised devices */
 	ret = rte_eal_pci_probe();
 	if (ret < 0)
diff --git a/examples/l2fwd-ivshmem/host/host.c b/examples/l2fwd-ivshmem/host/host.c
index 6aaa082..e0627a4 100644
--- a/examples/l2fwd-ivshmem/host/host.c
+++ b/examples/l2fwd-ivshmem/host/host.c
@@ -716,10 +716,6 @@ int main(int argc, char **argv)
 	if (l2fwd_ivshmem_pktmbuf_pool == NULL)
 		rte_exit(EXIT_FAILURE, "Cannot init mbuf pool\n");
 
-	/* init driver(s) */
-	if (rte_pmd_init_all() < 0)
-		rte_exit(EXIT_FAILURE, "Cannot init pmd\n");
-
 	if (rte_eal_pci_probe() < 0)
 		rte_exit(EXIT_FAILURE, "Cannot probe PCI\n");
 
diff --git a/examples/l2fwd/main.c b/examples/l2fwd/main.c
index 2d94366..d04e27a 100644
--- a/examples/l2fwd/main.c
+++ b/examples/l2fwd/main.c
@@ -615,10 +615,6 @@ MAIN(int argc, char **argv)
 	if (l2fwd_pktmbuf_pool == NULL)
 		rte_exit(EXIT_FAILURE, "Cannot init mbuf pool\n");
 
-	/* init driver(s) */
-	if (rte_pmd_init_all() < 0)
-		rte_exit(EXIT_FAILURE, "Cannot init pmd\n");
-
 	if (rte_eal_pci_probe() < 0)
 		rte_exit(EXIT_FAILURE, "Cannot probe PCI\n");
 
diff --git a/examples/l3fwd-power/main.c b/examples/l3fwd-power/main.c
index 219f802..598b7a2 100644
--- a/examples/l3fwd-power/main.c
+++ b/examples/l3fwd-power/main.c
@@ -1547,10 +1547,6 @@ MAIN(int argc, char **argv)
 		rte_exit(EXIT_FAILURE, "init_lcore_rx_queues failed\n");
 
 
-	/* init driver(s) */
-	if (rte_pmd_init_all() < 0)
-		rte_exit(EXIT_FAILURE, "Cannot init pmd\n");
-
 	if (rte_eal_pci_probe() < 0)
 		rte_exit(EXIT_FAILURE, "Cannot probe PCI\n");
 
diff --git a/examples/l3fwd-vf/main.c b/examples/l3fwd-vf/main.c
index fb811fa..793cacc 100644
--- a/examples/l3fwd-vf/main.c
+++ b/examples/l3fwd-vf/main.c
@@ -1007,10 +1007,6 @@ MAIN(int argc, char **argv)
 	if (ret < 0)
 		rte_exit(EXIT_FAILURE, "init_lcore_rx_queues failed\n");
 
-	/* init driver */
-	if (rte_pmd_init_all() < 0)
-		rte_exit(EXIT_FAILURE, "Cannot init pmd\n");
-
 	if (rte_eal_pci_probe() < 0)
 		rte_exit(EXIT_FAILURE, "Cannot probe PCI\n");
 
diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c
index 1ba4ca2..8ee1af9 100755
--- a/examples/l3fwd/main.c
+++ b/examples/l3fwd/main.c
@@ -1841,10 +1841,6 @@ MAIN(int argc, char **argv)
 		rte_exit(EXIT_FAILURE, "init_lcore_rx_queues failed\n");
 
 
-	/* init driver(s) */
-	if (rte_pmd_init_all() < 0)
-		rte_exit(EXIT_FAILURE, "Cannot init pmd\n");
-
 	if (rte_eal_pci_probe() < 0)
 		rte_exit(EXIT_FAILURE, "Cannot probe PCI\n");
 
diff --git a/examples/link_status_interrupt/main.c b/examples/link_status_interrupt/main.c
index de6c87f..8d17b01 100644
--- a/examples/link_status_interrupt/main.c
+++ b/examples/link_status_interrupt/main.c
@@ -663,10 +663,6 @@ MAIN(int argc, char **argv)
 	if (lsi_pktmbuf_pool == NULL)
 		rte_panic("Cannot init mbuf pool\n");
 
-	/* init driver(s) */
-	if (rte_pmd_init_all() < 0)
-		rte_panic("Cannot init pmd\n");
-
 	if (rte_eal_pci_probe() < 0)
 		rte_panic("Cannot probe PCI\n");
 
diff --git a/examples/load_balancer/init.c b/examples/load_balancer/init.c
index 6a2f218..e997238 100644
--- a/examples/load_balancer/init.c
+++ b/examples/load_balancer/init.c
@@ -450,12 +450,6 @@ app_init_nics(void)
 	int ret;
 	uint32_t n_rx_queues, n_tx_queues;
 
-	/* Init driver */
-	printf("Initializing the PMD driver ...\n");
-	if (rte_pmd_init_all() < 0) {
-		rte_panic("Cannot init PMD\n");
-	}
-
 	if (rte_eal_pci_probe() < 0) {
 		rte_panic("Cannot probe PCI\n");
 	}
diff --git a/examples/multi_process/client_server_mp/shared/init_drivers.h b/examples/multi_process/client_server_mp/shared/init_drivers.h
index afa03bd..5d9a90f 100644
--- a/examples/multi_process/client_server_mp/shared/init_drivers.h
+++ b/examples/multi_process/client_server_mp/shared/init_drivers.h
@@ -40,7 +40,7 @@
 static inline int
 init_drivers(void)
 {
-	if (rte_pmd_init_all() < 0 || rte_eal_pci_probe() < 0)
+	if (rte_eal_pci_probe() < 0)
 		return -1;
 
 	return 0;
diff --git a/examples/multi_process/l2fwd_fork/main.c b/examples/multi_process/l2fwd_fork/main.c
index 3dd2b2a..a34f420 100644
--- a/examples/multi_process/l2fwd_fork/main.c
+++ b/examples/multi_process/l2fwd_fork/main.c
@@ -1050,10 +1050,6 @@ MAIN(int argc, char **argv)
 	for (i = 0; i < RTE_MAX_LCORE; i++)
 		lcore_resource[i].lcore_id = i;
 	
-	/* init driver(s) */
-	if (rte_pmd_init_all() < 0)
-		rte_exit(EXIT_FAILURE, "Cannot init pmd\n");
-
 	if (rte_eal_pci_probe() < 0)
 		rte_exit(EXIT_FAILURE, "Cannot probe PCI\n");
 
diff --git a/examples/multi_process/symmetric_mp/main.c b/examples/multi_process/symmetric_mp/main.c
index 12fa28d..028f98d 100644
--- a/examples/multi_process/symmetric_mp/main.c
+++ b/examples/multi_process/symmetric_mp/main.c
@@ -463,8 +463,6 @@ main(int argc, char **argv)
 
 	/* probe to determine the NIC devices available */
 	proc_type = rte_eal_process_type();
-	if (rte_pmd_init_all() < 0)
-		rte_exit(EXIT_FAILURE, "Cannot init pmd\n");
 	if (rte_eal_pci_probe() < 0)
 		rte_exit(EXIT_FAILURE, "Cannot probe PCI\n");
 	if (rte_eth_dev_count() == 0)
diff --git a/examples/netmap_compat/bridge/bridge.c b/examples/netmap_compat/bridge/bridge.c
index ecf5757..e0cef57 100644
--- a/examples/netmap_compat/bridge/bridge.c
+++ b/examples/netmap_compat/bridge/bridge.c
@@ -294,10 +294,6 @@ int main(int argc, char *argv[])
 	if (ports.num == 0)
 		rte_exit(EXIT_FAILURE, "no ports specified\n");
 
-	err = rte_pmd_init_all();
-	if (err < 0)
-		rte_exit(EXIT_FAILURE, "rte_pmd_init_all(): error %d\n", err);
-
 	err = rte_eal_pci_probe();
 	if (err < 0)
 		rte_exit(EXIT_FAILURE, "rte_eal_pci_probe(): error %d\n", err);
diff --git a/examples/qos_meter/main.c b/examples/qos_meter/main.c
index bc76703..e1698cc 100755
--- a/examples/qos_meter/main.c
+++ b/examples/qos_meter/main.c
@@ -386,10 +386,6 @@ MAIN(int argc, char **argv)
 	if (pool == NULL)
 		rte_exit(EXIT_FAILURE, "Buffer pool creation error\n");
 
-	/* PMD init */
-	if (rte_pmd_init_all() < 0)
-		rte_exit(EXIT_FAILURE, "PMD init error\n");
-
 	if (rte_eal_pci_probe() < 0)
 		rte_exit(EXIT_FAILURE, "PCI probe error\n");
 
diff --git a/examples/qos_sched/init.c b/examples/qos_sched/init.c
index 7c5c62e..e021815 100755
--- a/examples/qos_sched/init.c
+++ b/examples/qos_sched/init.c
@@ -305,10 +305,6 @@ int app_init(void)
 	char ring_name[MAX_NAME_LEN];
 	char pool_name[MAX_NAME_LEN];
 
-	/* init driver(s) */
-	if (rte_pmd_init_all() < 0)
-		rte_exit(EXIT_FAILURE, "Cannot init PMD\n");
-
 	if (rte_eal_pci_probe() < 0)
 		rte_exit(EXIT_FAILURE, "Cannot probe PCI\n");
 
diff --git a/examples/quota_watermark/qw/init.c b/examples/quota_watermark/qw/init.c
index f42eb8b..44455b2 100644
--- a/examples/quota_watermark/qw/init.c
+++ b/examples/quota_watermark/qw/init.c
@@ -138,11 +138,6 @@ init_dpdk(void)
 {
     int ret;
 
-    /* Initialize the PMD */
-    ret = rte_pmd_init_all();
-    if (ret < 0)
-        rte_exit(EXIT_FAILURE, "Failed to initialize poll mode drivers (error %d)\n", ret);
-
     /* Bind the drivers to usable devices */
     ret = rte_eal_pci_probe();
     if (ret < 0)
diff --git a/examples/vhost/main.c b/examples/vhost/main.c
index 816a71a..b86d57d 100644
--- a/examples/vhost/main.c
+++ b/examples/vhost/main.c
@@ -1657,7 +1657,7 @@ MAIN(int argc, char *argv[])
 	if (ret < 0)
 		rte_exit(EXIT_FAILURE, "Invalid argument\n");
 
-	if (rte_pmd_init_all() != 0 || rte_eal_pci_probe() != 0)
+	if (rte_eal_pci_probe() != 0)
 		rte_exit(EXIT_FAILURE, "Error with NIC driver initialization\n");
 
 	for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id ++)
diff --git a/examples/vhost_xen/main.c b/examples/vhost_xen/main.c
index eafc0aa..2ec44ee 100644
--- a/examples/vhost_xen/main.c
+++ b/examples/vhost_xen/main.c
@@ -1464,7 +1464,7 @@ MAIN(int argc, char *argv[])
 	if (ret < 0)
 		rte_exit(EXIT_FAILURE, "Invalid argument\n");
 
-	if (rte_pmd_init_all() != 0 || rte_eal_pci_probe() != 0)
+	if (rte_eal_pci_probe() != 0)
 		rte_exit(EXIT_FAILURE, "Error with NIC driver initialization\n");
 
 	for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id ++)
diff --git a/examples/vmdq/main.c b/examples/vmdq/main.c
index fac24aa..0f52bdd 100644
--- a/examples/vmdq/main.c
+++ b/examples/vmdq/main.c
@@ -597,7 +597,7 @@ MAIN(int argc, char *argv[])
 	if (ret < 0)
 		rte_exit(EXIT_FAILURE, "Invalid VMDQ argument\n");
 
-	if (rte_pmd_init_all() != 0 || rte_eal_pci_probe() != 0)
+	if (rte_eal_pci_probe() != 0)
 		rte_exit(EXIT_FAILURE, "Error with NIC driver initialization\n");
 	
 	for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id ++) 
diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index 24288f8..d5ea46b 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -1316,33 +1316,6 @@ struct eth_driver {
 extern void rte_eth_driver_register(struct eth_driver *eth_drv);
 
 /**
- * The initialization function of *all* supported and enabled drivers.
- * Right now, the following PMDs are supported:
- *  - igb
- *  - igbvf
- *  - em
- *  - ixgbe
- *  - ixgbevf
- *  - virtio
- *  - vmxnet3
- * This function is invoked once at EAL start time.
- * @return
- *   0 on success.
- *   Error code of the device initialization failure,
- *   -ENODEV if there are no drivers available
- *   (e.g. if all driver config options are = n).
- */
-static inline
-int rte_pmd_init_all(void)
-{
-	int ret = 0;
-
-	if (ret == -ENODEV)
-		RTE_LOG(ERR, PMD, "No PMD(s) are configured\n");
-	return (ret);
-}
-
-/**
  * Configure an Ethernet device.
  * This function must be invoked first before any other function in the
  * Ethernet API. This function can also be re-invoked when a device is in the
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 77+ messages in thread

* Re: [PATCH v5 00/14] dpdk: Separate compile time linkage between eal lib and pmd's
       [not found]     ` <1398092379-7679-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
                         ` (13 preceding siblings ...)
  2014-04-21 14:59       ` [PATCH 0/X v5 14/14] pmd: Remove rte_pmd_init_all Neil Horman
@ 2014-04-21 17:05       ` Neil Horman
  2014-04-21 20:10       ` Stephen Hemminger
                         ` (2 subsequent siblings)
  17 siblings, 0 replies; 77+ messages in thread
From: Neil Horman @ 2014-04-21 17:05 UTC (permalink / raw)
  To: dev-VfR2kkLFssw

On Mon, Apr 21, 2014 at 10:59:25AM -0400, Neil Horman wrote:
> Disconnect compile time linkage between eal library / applications and pmd's
> 
> I noticed that, while tinkering with dpdk, building for shared libraries still
> resulted in all the test applications linking to all the built pmd's, despite
> not actually needing them all.  We are able to tell an application at run time
> (via the -d/--blacklist/--whitelist/--vdev options) which pmd's we want to use,
> and so have no need to link them at all. The only reason they get pulled in is
> because rte_eal_non_pci_init_etherdev and rte_pmd_init_all contain static lists
> to the individual pmd init functions. The result is that, even when building as
> DSO's, we have to load all the pmd libraries, which is space inefficient and
> defeating of some of the purpose of shared objects.
> 
> To correct this, I developed this patch series, which introduces a new macro,
> PMD_REGISTER_DRIVER, which wraps up Oliviers work using constructors on the
> virtual device pmds, then expands on it to include the physical device pmds,
> allowing us to break linkages between dpdk applications and pmd's almost
> entirely (save for the ring and xenvirt drivers, which have additional api's
> outside of the standard dpdk code that we need to further fix).  This also
> allows us to completely remove the rte_pmd_init_all routine, hiding its function
> internally to the rte_eal_init path.
> 
> I've tested this feature using the igb and pcap pmd's, both statically and
> dynamically linked with the test and testpmd sample applications, and it seems
> to work well.
> 
> Note, I encountered  a few bugs along the way, which I fixed and noted in the
> series.
> 
> Regards
> Neil
> 
> Change Notes:
> 
> 1) Reposted the entire series.  Recent changes permeated accross several
> patches, and since a few patches already had multiple versions, I've reposted
> the entire series and bumped the version number to 5, whcih skips a few
> versions, but ensures this series is seen as the most recent.
> 
> 2) Merged the PMD_REGISTER_DRIVER macro into rte_dev.h, which is a better
> location for it.  Required removing include of rte_pmd.h across most of the
> patches in the series.
> 
> 3) Cleaned up various leftover "virtual" comments in the driver registration api
> that no longer belong there after making it generic
> 
> 4) Fixed the LINK_USING_CC check in rte.lib.mk so it works like other uses
> 
> 5) Fixed CPU_LDFLAGS conversion to use -Wl in case we link with gcc.
> 
> 
> 

Shoot, I fat fingered in a 0/X in all the patch prefixes.  sorry about that.
Neil

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH v5 00/14] dpdk: Separate compile time linkage between eal lib and pmd's
       [not found]     ` <1398092379-7679-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
                         ` (14 preceding siblings ...)
  2014-04-21 17:05       ` [PATCH v5 00/14] dpdk: Separate compile time linkage between eal lib and pmd's Neil Horman
@ 2014-04-21 20:10       ` Stephen Hemminger
       [not found]         ` <20140421131000.743b6d9b-We1ePj4FEcvRI77zikRAJc56i+j3xesD0e7PPNI6Mm0@public.gmane.org>
  2014-05-16 15:28       ` Neil Horman
  2014-05-20 12:45       ` Thomas Monjalon
  17 siblings, 1 reply; 77+ messages in thread
From: Stephen Hemminger @ 2014-04-21 20:10 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev-VfR2kkLFssw

On Mon, 21 Apr 2014 10:59:25 -0400
Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org> wrote:

> Disconnect compile time linkage between eal library / applications and pmd's
> 
> I noticed that, while tinkering with dpdk, building for shared libraries still
> resulted in all the test applications linking to all the built pmd's, despite
> not actually needing them all.  We are able to tell an application at run time
> (via the -d/--blacklist/--whitelist/--vdev options) which pmd's we want to use,
> and so have no need to link them at all. The only reason they get pulled in is
> because rte_eal_non_pci_init_etherdev and rte_pmd_init_all contain static lists
> to the individual pmd init functions. The result is that, even when building as
> DSO's, we have to load all the pmd libraries, which is space inefficient and
> defeating of some of the purpose of shared objects.
> 
> To correct this, I developed this patch series, which introduces a new macro,
> PMD_REGISTER_DRIVER, which wraps up Oliviers work using constructors on the
> virtual device pmds, then expands on it to include the physical device pmds,
> allowing us to break linkages between dpdk applications and pmd's almost
> entirely (save for the ring and xenvirt drivers, which have additional api's
> outside of the standard dpdk code that we need to further fix).  This also
> allows us to completely remove the rte_pmd_init_all routine, hiding its function
> internally to the rte_eal_init path.
> 
> I've tested this feature using the igb and pcap pmd's, both statically and
> dynamically linked with the test and testpmd sample applications, and it seems
> to work well.
> 
> Note, I encountered  a few bugs along the way, which I fixed and noted in the
> series.
> 
> Regards
> Neil
> 
> Change Notes:
> 
> 1) Reposted the entire series.  Recent changes permeated accross several
> patches, and since a few patches already had multiple versions, I've reposted
> the entire series and bumped the version number to 5, whcih skips a few
> versions, but ensures this series is seen as the most recent.
> 
> 2) Merged the PMD_REGISTER_DRIVER macro into rte_dev.h, which is a better
> location for it.  Required removing include of rte_pmd.h across most of the
> patches in the series.
> 
> 3) Cleaned up various leftover "virtual" comments in the driver registration api
> that no longer belong there after making it generic
> 
> 4) Fixed the LINK_USING_CC check in rte.lib.mk so it works like other uses
> 
> 5) Fixed CPU_LDFLAGS conversion to use -Wl in case we link with gcc.

I am ok with build device drivers as libraries, but there can be a
performance impact.  For performance, we link with link-time optimization
and that is not possible as shared library. Haven't measured but at least
in the kernel, modules add a performance tax because they aren't in same
memory region and therefore cause a TLB miss. Might have same impact in
user mode.

You might be able to get some of this back by compiling with link-time-optimization
on a device at a time, and
also use the flags to tell compiler that only certain entry points are
shared and need tob e global.

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH v5 00/14] dpdk: Separate compile time linkage between eal lib and pmd's
       [not found]         ` <20140421131000.743b6d9b-We1ePj4FEcvRI77zikRAJc56i+j3xesD0e7PPNI6Mm0@public.gmane.org>
@ 2014-04-21 20:36           ` Neil Horman
  0 siblings, 0 replies; 77+ messages in thread
From: Neil Horman @ 2014-04-21 20:36 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: dev-VfR2kkLFssw

On Mon, Apr 21, 2014 at 01:10:00PM -0700, Stephen Hemminger wrote:
> On Mon, 21 Apr 2014 10:59:25 -0400
> Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org> wrote:
> 
> > Disconnect compile time linkage between eal library / applications and pmd's
> > 
> > I noticed that, while tinkering with dpdk, building for shared libraries still
> > resulted in all the test applications linking to all the built pmd's, despite
> > not actually needing them all.  We are able to tell an application at run time
> > (via the -d/--blacklist/--whitelist/--vdev options) which pmd's we want to use,
> > and so have no need to link them at all. The only reason they get pulled in is
> > because rte_eal_non_pci_init_etherdev and rte_pmd_init_all contain static lists
> > to the individual pmd init functions. The result is that, even when building as
> > DSO's, we have to load all the pmd libraries, which is space inefficient and
> > defeating of some of the purpose of shared objects.
> > 
> > To correct this, I developed this patch series, which introduces a new macro,
> > PMD_REGISTER_DRIVER, which wraps up Oliviers work using constructors on the
> > virtual device pmds, then expands on it to include the physical device pmds,
> > allowing us to break linkages between dpdk applications and pmd's almost
> > entirely (save for the ring and xenvirt drivers, which have additional api's
> > outside of the standard dpdk code that we need to further fix).  This also
> > allows us to completely remove the rte_pmd_init_all routine, hiding its function
> > internally to the rte_eal_init path.
> > 
> > I've tested this feature using the igb and pcap pmd's, both statically and
> > dynamically linked with the test and testpmd sample applications, and it seems
> > to work well.
> > 
> > Note, I encountered  a few bugs along the way, which I fixed and noted in the
> > series.
> > 
> > Regards
> > Neil
> > 
> > Change Notes:
> > 
> > 1) Reposted the entire series.  Recent changes permeated accross several
> > patches, and since a few patches already had multiple versions, I've reposted
> > the entire series and bumped the version number to 5, whcih skips a few
> > versions, but ensures this series is seen as the most recent.
> > 
> > 2) Merged the PMD_REGISTER_DRIVER macro into rte_dev.h, which is a better
> > location for it.  Required removing include of rte_pmd.h across most of the
> > patches in the series.
> > 
> > 3) Cleaned up various leftover "virtual" comments in the driver registration api
> > that no longer belong there after making it generic
> > 
> > 4) Fixed the LINK_USING_CC check in rte.lib.mk so it works like other uses
> > 
> > 5) Fixed CPU_LDFLAGS conversion to use -Wl in case we link with gcc.
> 
> I am ok with build device drivers as libraries, but there can be a
> performance impact.  For performance, we link with link-time optimization
> and that is not possible as shared library. Haven't measured but at least
> in the kernel, modules add a performance tax because they aren't in same
> memory region and therefore cause a TLB miss. Might have same impact in
> user mode.
> 
Possibly, but that seems like a build time decision.  Performance numbers are
definately good for guidance here, but one way or another if you're not ok with
the impact, you configure to build statically, and go on about your day.  We're
not preventing that here, just making the DSO build case work a little more
sanely, so that the core libraries and applications don't have to link against
the DSO's directly.

> You might be able to get some of this back by compiling with link-time-optimization
> on a device at a time, and
> also use the flags to tell compiler that only certain entry points are
> shared and need tob e global.
> 
That seems like a fine idea.  In fact with this patch, a typical pmd would need
no global entry points, as the constructor registers the init routine (which can
be static), and the init routine registers the ethernet device driver.  We could
probably (with this changeset) create a boilerplate linker script for the pmds
that marked all the symbols except constructors as local (xenvirt and ring are
notable exceptions to this rule, but those can likely be fixed up).

Regardless, I'd like to address that in a separate patch, as I think this series
is doing enough on its own.  It a good idea for optimization though.

Neil

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 01/15 v2] makefiles: Fixed -share command line option error
       [not found]         ` <1397656304-468-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
  2014-04-18 11:23           ` Thomas Monjalon
@ 2014-04-29 23:42           ` Thomas Monjalon
  2014-05-02 11:09             ` Neil Horman
  1 sibling, 1 reply; 77+ messages in thread
From: Thomas Monjalon @ 2014-04-29 23:42 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev-VfR2kkLFssw

2014-04-16 09:51, Neil Horman:
> The shared libraries built with the current makefile set produce static
> libraries rather than actual shared objects.  This is due to several missing
> options that are required to correctly build shared objects using ld, as
> well as a mis-specified -share option (which should be -shared). Switching
> to the use of CC rather than LD and fixing the -shared option corrects
> these problems and builds the DSOs correctly.
> 
> Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>

Applied for version 1.6.0r2.

Thanks
-- 
Thomas

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 01/15 v2] makefiles: Fixed -share command line option error
  2014-04-29 23:42           ` Thomas Monjalon
@ 2014-05-02 11:09             ` Neil Horman
       [not found]               ` <20140502110927.GA15335-B26myB8xz7F8NnZeBjwnZQMhkBWG/bsMQH7oEaQurus@public.gmane.org>
  0 siblings, 1 reply; 77+ messages in thread
From: Neil Horman @ 2014-05-02 11:09 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev-VfR2kkLFssw

On Wed, Apr 30, 2014 at 01:42:12AM +0200, Thomas Monjalon wrote:
> 2014-04-16 09:51, Neil Horman:
> > The shared libraries built with the current makefile set produce static
> > libraries rather than actual shared objects.  This is due to several missing
> > options that are required to correctly build shared objects using ld, as
> > well as a mis-specified -share option (which should be -shared). Switching
> > to the use of CC rather than LD and fixing the -shared option corrects
> > these problems and builds the DSOs correctly.
> > 
> > Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
> 
> Applied for version 1.6.0r2.
> 
> Thanks
> -- 
> Thomas
> 

So, I just went and looked at 1.6.0r2 and noted that you applied this patch, but
the rest of the series is still missing.  This is what I was talking about
earlier when I said you weren't applying patch series atomically.  It makes it
impossible to have any clue what the upstream development head is going to look
like.  On top of that, since you're clearly integrating other changes ahead of
this, theres every likelyhood the rest of my v5 series won't apply.

the v5 series has sat out here for a few weeks now without comment. If there
aren't any objections to it, apply it.  Whats the problem here?  I'm not going
to package the DPDK until this series (or the functionality it offers) is in
place.

Neil

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 01/15 v2] makefiles: Fixed -share command line option error
       [not found]               ` <20140502110927.GA15335-B26myB8xz7F8NnZeBjwnZQMhkBWG/bsMQH7oEaQurus@public.gmane.org>
@ 2014-05-02 12:22                 ` Thomas Monjalon
  2014-05-02 13:01                   ` Neil Horman
  0 siblings, 1 reply; 77+ messages in thread
From: Thomas Monjalon @ 2014-05-02 12:22 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev-VfR2kkLFssw

2014-05-02 07:09, Neil Horman:
> On Wed, Apr 30, 2014 at 01:42:12AM +0200, Thomas Monjalon wrote:
> > 2014-04-16 09:51, Neil Horman:
> > > The shared libraries built with the current makefile set produce static
> > > libraries rather than actual shared objects.  This is due to several
> > > missing options that are required to correctly build shared objects
> > > using ld, as well as a mis-specified -share option (which should be
> > > -shared). Switching to the use of CC rather than LD and fixing the
> > > -shared option corrects these problems and builds the DSOs correctly.
> > > 
> > > Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
> > 
> > Applied for version 1.6.0r2.
> 
> So, I just went and looked at 1.6.0r2 and noted that you applied this patch,
> but the rest of the series is still missing.  This is what I was talking
> about earlier when I said you weren't applying patch series atomically.  It
> makes it impossible to have any clue what the upstream development head is
> going to look like.  On top of that, since you're clearly integrating other
> changes ahead of this, theres every likelyhood the rest of my v5 series
> won't apply.
> 
> the v5 series has sat out here for a few weeks now without comment. If there
> aren't any objections to it, apply it.  Whats the problem here?  I'm not
> going to package the DPDK until this series (or the functionality it
> offers) is in place.

This patch is clearly an important fix. So I took it for release 1.6.0r2.
The other patches of the serie are enhancements which will be in 1.7.0.

The goal is to change the integration model.
Now we'll stop integrating enhancements and big changes when first release 
candidate is out. Then it will be clear that only fixes and mandatory changes 
will be integrated in the last part of the release cycle.

I hope you agree we're improving the workflow.
-- 
Thomas

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 01/15 v2] makefiles: Fixed -share command line option error
  2014-05-02 12:22                 ` Thomas Monjalon
@ 2014-05-02 13:01                   ` Neil Horman
       [not found]                     ` <20140502130148.GD15335-B26myB8xz7F8NnZeBjwnZQMhkBWG/bsMQH7oEaQurus@public.gmane.org>
  0 siblings, 1 reply; 77+ messages in thread
From: Neil Horman @ 2014-05-02 13:01 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev-VfR2kkLFssw

On Fri, May 02, 2014 at 02:22:17PM +0200, Thomas Monjalon wrote:
> 2014-05-02 07:09, Neil Horman:
> > On Wed, Apr 30, 2014 at 01:42:12AM +0200, Thomas Monjalon wrote:
> > > 2014-04-16 09:51, Neil Horman:
> > > > The shared libraries built with the current makefile set produce static
> > > > libraries rather than actual shared objects.  This is due to several
> > > > missing options that are required to correctly build shared objects
> > > > using ld, as well as a mis-specified -share option (which should be
> > > > -shared). Switching to the use of CC rather than LD and fixing the
> > > > -shared option corrects these problems and builds the DSOs correctly.
> > > > 
> > > > Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
> > > 
> > > Applied for version 1.6.0r2.
> > 
> > So, I just went and looked at 1.6.0r2 and noted that you applied this patch,
> > but the rest of the series is still missing.  This is what I was talking
> > about earlier when I said you weren't applying patch series atomically.  It
> > makes it impossible to have any clue what the upstream development head is
> > going to look like.  On top of that, since you're clearly integrating other
> > changes ahead of this, theres every likelyhood the rest of my v5 series
> > won't apply.
> > 
> > the v5 series has sat out here for a few weeks now without comment. If there
> > aren't any objections to it, apply it.  Whats the problem here?  I'm not
> > going to package the DPDK until this series (or the functionality it
> > offers) is in place.
> 
> This patch is clearly an important fix. So I took it for release 1.6.0r2.
> The other patches of the serie are enhancements which will be in 1.7.0.
> 
> The goal is to change the integration model.
> Now we'll stop integrating enhancements and big changes when first release 
> candidate is out. Then it will be clear that only fixes and mandatory changes 
> will be integrated in the last part of the release cycle.
> 
> I hope you agree we're improving the workflow.

Apologies to you Thomas, and the rest of the 6wind list.  He just explained to
me that patch applications ni 1.6.0r2 aren't inherited by 1.7.0 so the entire
patch series will need to be reapplied to 1.7.0.  The workflow is atypical to
me, but I should have seen that, given there is no master branch.  Sorry for the
outburst.
Neil

> -- 
> Thomas
> 

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 01/15 v2] makefiles: Fixed -share command line option error
       [not found]                     ` <20140502130148.GD15335-B26myB8xz7F8NnZeBjwnZQMhkBWG/bsMQH7oEaQurus@public.gmane.org>
@ 2014-05-02 13:18                       ` Thomas Monjalon
  0 siblings, 0 replies; 77+ messages in thread
From: Thomas Monjalon @ 2014-05-02 13:18 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev-VfR2kkLFssw

2014-05-02 09:01, Neil Horman:
> On Fri, May 02, 2014 at 02:22:17PM +0200, Thomas Monjalon wrote:
> > 2014-05-02 07:09, Neil Horman:
> > > On Wed, Apr 30, 2014 at 01:42:12AM +0200, Thomas Monjalon wrote:
> > > > 2014-04-16 09:51, Neil Horman:
> > > > > The shared libraries built with the current makefile set produce
> > > > > static
> > > > > libraries rather than actual shared objects.  This is due to several
> > > > > missing options that are required to correctly build shared objects
> > > > > using ld, as well as a mis-specified -share option (which should be
> > > > > -shared). Switching to the use of CC rather than LD and fixing the
> > > > > -shared option corrects these problems and builds the DSOs
> > > > > correctly.
> > > > > 
> > > > > Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
> > > > 
> > > > Applied for version 1.6.0r2.
> > > 
> > > So, I just went and looked at 1.6.0r2 and noted that you applied this
> > > patch, but the rest of the series is still missing.  This is what I was
> > > talking about earlier when I said you weren't applying patch series
> > > atomically.  It makes it impossible to have any clue what the upstream
> > > development head is going to look like.  On top of that, since you're
> > > clearly integrating other changes ahead of this, theres every
> > > likelyhood the rest of my v5 series won't apply.
> > > 
> > > the v5 series has sat out here for a few weeks now without comment. If
> > > there aren't any objections to it, apply it.  Whats the problem here? 
> > > I'm not going to package the DPDK until this series (or the
> > > functionality it offers) is in place.
> > 
> > This patch is clearly an important fix. So I took it for release 1.6.0r2.
> > The other patches of the serie are enhancements which will be in 1.7.0.
> > 
> > The goal is to change the integration model.
> > Now we'll stop integrating enhancements and big changes when first release
> > candidate is out. Then it will be clear that only fixes and mandatory
> > changes will be integrated in the last part of the release cycle.
> > 
> > I hope you agree we're improving the workflow.
> 
> Apologies to you Thomas, and the rest of the 6wind list.  He just explained
> to me that patch applications ni 1.6.0r2 aren't inherited by 1.7.0 so the
> entire patch series will need to be reapplied to 1.7.0.

Sorry, you misunderstood :)
I'm starting a master branch from 1.6.0r2.
So the rest of you serie will be applied on master branch where 1.7.0 is going 
to live.
I won't split patch serie anymore.

Apologies for the confusion.
-- 
Thomas

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH v5 00/14] dpdk: Separate compile time linkage between eal lib and pmd's
       [not found]     ` <1398092379-7679-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
                         ` (15 preceding siblings ...)
  2014-04-21 20:10       ` Stephen Hemminger
@ 2014-05-16 15:28       ` Neil Horman
       [not found]         ` <20140516152847.GB5432-B26myB8xz7F8NnZeBjwnZQMhkBWG/bsMQH7oEaQurus@public.gmane.org>
  2014-05-20 12:45       ` Thomas Monjalon
  17 siblings, 1 reply; 77+ messages in thread
From: Neil Horman @ 2014-05-16 15:28 UTC (permalink / raw)
  To: dev-VfR2kkLFssw

On Mon, Apr 21, 2014 at 10:59:25AM -0400, Neil Horman wrote:
> Disconnect compile time linkage between eal library / applications and pmd's
> 
> I noticed that, while tinkering with dpdk, building for shared libraries still
> resulted in all the test applications linking to all the built pmd's, despite
> not actually needing them all.  We are able to tell an application at run time
> (via the -d/--blacklist/--whitelist/--vdev options) which pmd's we want to use,
> and so have no need to link them at all. The only reason they get pulled in is
> because rte_eal_non_pci_init_etherdev and rte_pmd_init_all contain static lists
> to the individual pmd init functions. The result is that, even when building as
> DSO's, we have to load all the pmd libraries, which is space inefficient and
> defeating of some of the purpose of shared objects.
> 
> To correct this, I developed this patch series, which introduces a new macro,
> PMD_REGISTER_DRIVER, which wraps up Oliviers work using constructors on the
> virtual device pmds, then expands on it to include the physical device pmds,
> allowing us to break linkages between dpdk applications and pmd's almost
> entirely (save for the ring and xenvirt drivers, which have additional api's
> outside of the standard dpdk code that we need to further fix).  This also
> allows us to completely remove the rte_pmd_init_all routine, hiding its function
> internally to the rte_eal_init path.
> 
> I've tested this feature using the igb and pcap pmd's, both statically and
> dynamically linked with the test and testpmd sample applications, and it seems
> to work well.
> 
> Note, I encountered  a few bugs along the way, which I fixed and noted in the
> series.
> 
> Regards
> Neil
> 
> Change Notes:
> 
> 1) Reposted the entire series.  Recent changes permeated accross several
> patches, and since a few patches already had multiple versions, I've reposted
> the entire series and bumped the version number to 5, whcih skips a few
> versions, but ensures this series is seen as the most recent.
> 
> 2) Merged the PMD_REGISTER_DRIVER macro into rte_dev.h, which is a better
> location for it.  Required removing include of rte_pmd.h across most of the
> patches in the series.
> 
> 3) Cleaned up various leftover "virtual" comments in the driver registration api
> that no longer belong there after making it generic
> 
> 4) Fixed the LINK_USING_CC check in rte.lib.mk so it works like other uses
> 
> 5) Fixed CPU_LDFLAGS conversion to use -Wl in case we link with gcc.
> 
> 
> 

Ping, so whats the status on the rest of this series?  You said you would
integrate it with 1.7.0, but you've applied several dozen patches ahead of it
(many of which were posted after it), and as a result, it no longer applies.  I
assume you're planning on fixing all of this up?

Neil

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH v5 00/14] dpdk: Separate compile time linkage between eal lib and pmd's
       [not found]         ` <20140516152847.GB5432-B26myB8xz7F8NnZeBjwnZQMhkBWG/bsMQH7oEaQurus@public.gmane.org>
@ 2014-05-16 15:39           ` Thomas Monjalon
  0 siblings, 0 replies; 77+ messages in thread
From: Thomas Monjalon @ 2014-05-16 15:39 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev-VfR2kkLFssw

Hi Neil,

2014-05-16 11:28, Neil Horman:
> Ping, so whats the status on the rest of this series?  You said you would
> integrate it with 1.7.0, but you've applied several dozen patches ahead of
> it (many of which were posted after it), and as a result, it no longer
> applies.  I assume you're planning on fixing all of this up?

I was pretty sure you'll ping me :)
This serie should be the next to be applied, probably on Monday.

I take this opportunity to "recruit" more reviewers.
Many patches are pending for review and there will be probably even more in 
next days. So reviewers are welcome!

	http://dpdk.org/dev#review

Thanks
-- 
Thomas

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH v5 00/14] dpdk: Separate compile time linkage between eal lib and pmd's
       [not found]     ` <1398092379-7679-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
                         ` (16 preceding siblings ...)
  2014-05-16 15:28       ` Neil Horman
@ 2014-05-20 12:45       ` Thomas Monjalon
  2014-05-20 14:13         ` Neil Horman
  17 siblings, 1 reply; 77+ messages in thread
From: Thomas Monjalon @ 2014-05-20 12:45 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev-VfR2kkLFssw

2014-04-21 10:59, Neil Horman:
> Disconnect compile time linkage between eal library / applications and pmd's
> 
> I noticed that, while tinkering with dpdk, building for shared libraries
> still resulted in all the test applications linking to all the built pmd's,
> despite not actually needing them all.  We are able to tell an application
> at run time (via the -d/--blacklist/--whitelist/--vdev options) which pmd's
> we want to use, and so have no need to link them at all. The only reason
> they get pulled in is because rte_eal_non_pci_init_etherdev and
> rte_pmd_init_all contain static lists to the individual pmd init functions.
> The result is that, even when building as DSO's, we have to load all the
> pmd libraries, which is space inefficient and defeating of some of the
> purpose of shared objects.
> 
> To correct this, I developed this patch series, which introduces a new
> macro, PMD_REGISTER_DRIVER, which wraps up Oliviers work using constructors
> on the virtual device pmds, then expands on it to include the physical
> device pmds, allowing us to break linkages between dpdk applications and
> pmd's almost entirely (save for the ring and xenvirt drivers, which have
> additional api's outside of the standard dpdk code that we need to further
> fix).  This also allows us to completely remove the rte_pmd_init_all
> routine, hiding its function internally to the rte_eal_init path.
> 
> I've tested this feature using the igb and pcap pmd's, both statically and
> dynamically linked with the test and testpmd sample applications, and it
> seems to work well.
> 
> Note, I encountered  a few bugs along the way, which I fixed and noted in
> the series.

Thanks for this nice cleanup.

Acked-by: Thomas Monjalon <thomas.monjalon-pdR9zngts4EAvxtiuMwx3w@public.gmane.org>

Applied for version 1.7.0.

-- 
Thomas

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH v5 00/14] dpdk: Separate compile time linkage between eal lib and pmd's
  2014-05-20 12:45       ` Thomas Monjalon
@ 2014-05-20 14:13         ` Neil Horman
  0 siblings, 0 replies; 77+ messages in thread
From: Neil Horman @ 2014-05-20 14:13 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev-VfR2kkLFssw

On Tue, May 20, 2014 at 02:45:09PM +0200, Thomas Monjalon wrote:
> 2014-04-21 10:59, Neil Horman:
> > Disconnect compile time linkage between eal library / applications and pmd's
> > 
> > I noticed that, while tinkering with dpdk, building for shared libraries
> > still resulted in all the test applications linking to all the built pmd's,
> > despite not actually needing them all.  We are able to tell an application
> > at run time (via the -d/--blacklist/--whitelist/--vdev options) which pmd's
> > we want to use, and so have no need to link them at all. The only reason
> > they get pulled in is because rte_eal_non_pci_init_etherdev and
> > rte_pmd_init_all contain static lists to the individual pmd init functions.
> > The result is that, even when building as DSO's, we have to load all the
> > pmd libraries, which is space inefficient and defeating of some of the
> > purpose of shared objects.
> > 
> > To correct this, I developed this patch series, which introduces a new
> > macro, PMD_REGISTER_DRIVER, which wraps up Oliviers work using constructors
> > on the virtual device pmds, then expands on it to include the physical
> > device pmds, allowing us to break linkages between dpdk applications and
> > pmd's almost entirely (save for the ring and xenvirt drivers, which have
> > additional api's outside of the standard dpdk code that we need to further
> > fix).  This also allows us to completely remove the rte_pmd_init_all
> > routine, hiding its function internally to the rte_eal_init path.
> > 
> > I've tested this feature using the igb and pcap pmd's, both statically and
> > dynamically linked with the test and testpmd sample applications, and it
> > seems to work well.
> > 
> > Note, I encountered  a few bugs along the way, which I fixed and noted in
> > the series.
> 
> Thanks for this nice cleanup.
> 
> Acked-by: Thomas Monjalon <thomas.monjalon-pdR9zngts4EAvxtiuMwx3w@public.gmane.org>
> 
> Applied for version 1.7.0.
> 
Thank you Thomas, I will pull this into the rpm I have awaiting revew for
Fedora asap.

Neil

> -- 
> Thomas
> 

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 05/15 v3] ring: Convert to use of PMD_REGISTER_DRIVER and fix linking
       [not found]             ` <1397747816-23245-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
@ 2014-06-13 13:28               ` De Lara Guarch, Pablo
  0 siblings, 0 replies; 77+ messages in thread
From: De Lara Guarch, Pablo @ 2014-06-13 13:28 UTC (permalink / raw)
  To: Neil Horman, dev-VfR2kkLFssw

> -----Original Message-----
> From: dev [mailto:dev-bounces-VfR2kkLFssw@public.gmane.org] On Behalf Of Neil Horman
> Sent: Thursday, April 17, 2014 4:17 PM
> To: dev-VfR2kkLFssw@public.gmane.org
> Subject: [dpdk-dev] [PATCH 05/15 v3] ring: Convert to use of
> PMD_REGISTER_DRIVER and fix linking
> 
> convert the ring driver to use the PMD_REGISTER_DRIVER macro and fix up
> the
> Makefile so that its linkage is only done if we are building static libraries.
> This means that the test applications now have no reference to the ring
> library
> when building DSO's and must specify its use on the command line with the -
> d
> option.  Static linking will still initalize the driver automatically.
> 
> Note that the ring driver was also written in such a way that it violated some
> general layering principles, several functions were contained in the pmd
> which
> were being called by example from the test application in the app/test
> directory.  Specifically it was calling eth_ring_pair_attach,
> eth_ring_pair_create and rte_eth_ring_devinit, which should only be called
> internally to the dpdk core library.  To correct this I've removed those
> functions, and instead allowed them to be called indirectly at initalization
> time using the vdev command line argument key
> nodeaction=<name>:<node>:<action>
> where action is one of ATTACH or CREATE.  I've tested out the functionality of
> the command line with the testpmd utility, with success, and have removed
> the
> called functions from the test utility.  This will affect how the test utility
> is invoked (the -d and --vdev option will need to be specified on the
> command
> line now), but honestly, given the way it was coded, I think the testing of the
> ring pmd was not the best example of how to code with dpdk to begin with.  I
> have also left the two layer violating functions in place, so as not to break
> existing applications, but added deprecation warnings to them so that apps
> can
> migrate off them.
> 
> Signed-off-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
> 
> ---
> Change notes
> 
> v2) fixed DEPDIR specifcation, should depend on RING not PCAP
> 
> v3) Cleaned up strcmp error checking, printfs, and other parsing issues as
> pointed out by Konstantin Ananyev <konstantin.ananyev-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
> ---
>  app/test/test_pmd_ring.c           |  95 -------------------------
>  lib/librte_pmd_ring/Makefile       |   1 +
>  lib/librte_pmd_ring/rte_eth_ring.c | 141
> ++++++++++++++++++++++++++++++++++---
>  mk/rte.app.mk                      |  14 ++--
>  4 files changed, 142 insertions(+), 109 deletions(-)
> 
> diff --git a/app/test/test_pmd_ring.c b/app/test/test_pmd_ring.c
> index 4d9c2ba..1fe38fa 100644
> --- a/app/test/test_pmd_ring.c
> +++ b/app/test/test_pmd_ring.c
> @@ -42,7 +42,6 @@
>  /* two test rings, r1 is used by two ports, r2 just by one */
>  static struct rte_ring *r1[2], *r2;
> 
> -static struct rte_ring *nullring = NULL;
>  static struct rte_mempool *mp;
>  static uint8_t start_idx; /* will store the port id of the first of our new ports
> */
> 
> @@ -59,58 +58,6 @@ static uint8_t start_idx; /* will store the port id of the
> first of our new port
>  #define MBUF_SIZE (2048 + sizeof(struct rte_mbuf) +
> RTE_PKTMBUF_HEADROOM)
>  #define NB_MBUF   512
> 
> -
> -static int
> -test_ring_ethdev_create(void)
> -{
> -	int retval;
> -	printf("Testing ring pmd create\n");
> -
> -	retval = rte_eth_from_rings(NULL, 0, NULL, 0, SOCKET0);
> -	if (retval < 0) {
> -		printf("Failure, failed to create zero-sized RXTX ring pmd\n");
> -		return -1;
> -	}
> -
> -	retval = rte_eth_from_rings(NULL, 0, NULL, 0,
> RTE_MAX_NUMA_NODES);
> -	if (retval >= 0) {
> -		printf("Failure, can create ring pmd on socket %d\n",
> RTE_MAX_NUMA_NODES);
> -		return -1;
> -	}
> -
> -	retval = rte_eth_from_rings(NULL, 1, &r2, 1, SOCKET0);
> -	if (retval >= 0) {
> -		printf("Failure, can create pmd with null rx rings\n");
> -		return -1;
> -	}
> -
> -	retval = rte_eth_from_rings(r1, 1, NULL, 1, SOCKET0);
> -	if (retval >= 0) {
> -		printf("Failure, can create pmd with null tx rings\n");
> -		return -1;
> -	}
> -
> -	retval = rte_eth_from_rings(&nullring, 1, r1, 2, SOCKET0);
> -	if (retval < 0) {
> -		printf("Failure, failed to create TX-only ring pmd\n");
> -		return -1;
> -	}
> -
> -	retval = rte_eth_from_rings(r1, 1, &nullring, 1, SOCKET0);
> -	if (retval < 0) {
> -		printf("Failure, failed to create RX-only ring pmd\n");
> -		return -1;
> -	}
> -
> -	retval = rte_eth_from_rings(&r2, 1, &r2, 1, SOCKET0);
> -	if (retval < 0) {
> -		printf("Failure, failed to create RXTX ring pmd\n");
> -		return -1;
> -	}
> -
> -	return 0;
> -}
> -
>  static int
>  test_ethdev_configure(void)
>  {
> @@ -305,26 +252,12 @@ test_stats_reset(void)
>  static int
>  test_pmd_ring_init(void)
>  {
> -	const char * name1 = "R3";
> -	const char * name2 = "R4";
> -	const char * params_null = NULL;
> -	const char * params = "PARAMS";
>  	struct rte_eth_stats stats;
>  	struct rte_mbuf buf, *pbuf = &buf;
>  	struct rte_eth_conf null_conf;
> 
>  	printf("Testing ring pmd init\n");
> 
> -	if (rte_pmd_ring_devinit(name1, params_null) < 0) {
> -		printf("Testing ring pmd init fail\n");
> -		return -1;
> -	}
> -
> -	if (rte_pmd_ring_devinit(name2, params) < 0) {
> -		printf("Testing ring pmd init fail\n");
> -		return -1;
> -	}
> -
>  	if (RXTX_PORT2 >= RTE_MAX_ETHPORTS) {
>  		printf(" TX/RX port exceed max eth ports\n");
>  		return -1;
> @@ -371,24 +304,16 @@ test_pmd_ring_init(void)
> 
>  	rte_eth_dev_stop(RXTX_PORT2);
> 
> -	/* Test init same name pmd ring */
> -	rte_pmd_ring_devinit(name1, params_null);
>  	return 0;
>  }
> 
>  static int
>  test_pmd_ring_pair_create(void)
>  {
> -	const char * name1 = "_RNG_P0";
>  	struct rte_eth_stats stats, stats2;
>  	struct rte_mbuf buf, *pbuf = &buf;
>  	struct rte_eth_conf null_conf;
> 
> -	if (rte_eth_ring_pair_create(name1, SOCKET0) < 0) {
> -		printf("Create ring pair failed\n");
> -		return -1;
> -	}
> -
>  	if ((RXTX_PORT4 >= RTE_MAX_ETHPORTS) || (RXTX_PORT5 >=
> RTE_MAX_ETHPORTS)) {
>  		printf(" TX/RX port exceed max eth ports\n");
>  		return -1;
> @@ -447,28 +372,16 @@ test_pmd_ring_pair_create(void)
>  	rte_eth_dev_stop(RXTX_PORT4);
>  	rte_eth_dev_stop(RXTX_PORT5);
> 
> -	/* Test create same name ring pair */
> -	if (rte_eth_ring_pair_create(name1, SOCKET0) == 0) {
> -		printf("Create same name ring pair error\n");
> -		return -1;
> -	}
>  	return 0;
>  }
> 
>  static int
>  test_pmd_ring_pair_attach(void)
>  {
> -	const char * name1 = "_RNG_P0";
> -	const char * name2 = "_RNG_P1";
>  	struct rte_eth_stats stats, stats2;
>  	struct rte_mbuf buf, *pbuf = &buf;
>  	struct rte_eth_conf null_conf;
> 
> -	if (rte_eth_ring_pair_attach(name1, SOCKET0) < 0) {
> -		printf("Attach ring pair failed\n");
> -		return -1;
> -	}
> -
>  	if ((RXTX_PORT4 >= RTE_MAX_ETHPORTS) || (RXTX_PORT5 >=
> RTE_MAX_ETHPORTS)) {
>  		printf(" TX/RX port exceed max eth ports\n");
>  		return -1;
> @@ -529,11 +442,6 @@ test_pmd_ring_pair_attach(void)
>  	rte_eth_dev_stop(RXTX_PORT4);
>  	rte_eth_dev_stop(RXTX_PORT5);
> 
> -	/* Test attach non-existing ring pair */
> -	if (rte_eth_ring_pair_attach(name2, SOCKET0) == 0) {
> -		printf("Attach non-existing ring pair error\n");
> -		return -1;
> -	}
>  	return 0;
>  }
> 
> @@ -568,9 +476,6 @@ test_pmd_ring(void)
>  		return -1;
>  	}
> 
> -	if (test_ring_ethdev_create() < 0)
> -		return -1;
> -
>  	if (test_ethdev_configure() < 0)
>  		return -1;
> 
> diff --git a/lib/librte_pmd_ring/Makefile b/lib/librte_pmd_ring/Makefile
> index 73b2d38..35d40cb 100644
> --- a/lib/librte_pmd_ring/Makefile
> +++ b/lib/librte_pmd_ring/Makefile
> @@ -52,5 +52,6 @@ SYMLINK-y-include += rte_eth_ring.h
>  # this lib depends upon:
>  DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_RING) += lib/librte_eal lib/librte_ring
>  DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_RING) += lib/librte_mbuf
> lib/librte_ether
> +DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_RING) += lib/librte_kvargs
> 
>  include $(RTE_SDK)/mk/rte.lib.mk
> diff --git a/lib/librte_pmd_ring/rte_eth_ring.c
> b/lib/librte_pmd_ring/rte_eth_ring.c
> index cee3fff..3a129b6 100644
> --- a/lib/librte_pmd_ring/rte_eth_ring.c
> +++ b/lib/librte_pmd_ring/rte_eth_ring.c
> @@ -38,6 +38,17 @@
>  #include <rte_memcpy.h>
>  #include <rte_string_fns.h>
>  #include <rte_vdev.h>
> +#include <rte_pmd.h>
> +#include <rte_kvargs.h>
> +
> +#define ETH_RING_NUMA_NODE_ACTION_ARG	"nodeaction"
> +#define ETH_RING_ACTION_CREATE		"CREATE"
> +#define ETH_RING_ACTION_ATTACH		"ATTACH"
> +
> +static const char *valid_arguments[] = {
> +	ETH_RING_NUMA_NODE_ACTION_ARG,
> +	NULL
> +};
> 
>  struct ring_queue {
>  	struct rte_ring *rng;
> @@ -373,28 +384,143 @@ eth_dev_ring_pair_create(const char *name,
> const unsigned numa_node,
>  int
>  rte_eth_ring_pair_create(const char *name, const unsigned numa_node)
>  {
> +	RTE_LOG(WARNING, PMD, "rte_eth_ring_pair_create is
> deprecated\n");
>  	return eth_dev_ring_pair_create(name, numa_node, DEV_CREATE);
>  }
> 
>  int
>  rte_eth_ring_pair_attach(const char *name, const unsigned numa_node)
>  {
> +	RTE_LOG(WARNING, PMD, "rte_eth_ring_pair_attach is
> deprecated\n");
>  	return eth_dev_ring_pair_create(name, numa_node, DEV_ATTACH);
>  }
> 
> +struct node_action_pair {
> +	char name[PATH_MAX];
> +	unsigned node;
> +	enum dev_action action;
> +};
> +
> +struct node_action_list {
> +	unsigned total;
> +	unsigned count;
> +	struct node_action_pair *list;
> +};
> +
> +static int parse_kvlist (const char *key __rte_unused, const char *value,
> void *data)
> +{
> +	struct node_action_list *info = data;
> +	int ret;
> +	char *name;
> +	char *action;
> +	char *node;
> +	char *end;
> +
> +	name = strdup(value);
> +
> +	ret = -EINVAL;
> +
> +	if (!name) {
> +		RTE_LOG(WARNING, PMD, "command line paramter is empty
> for ring pmd!\n");
> +		goto out;
> +	}
> +
> +	node = strchr(name, ':');
> +	if (!node) {
> +		RTE_LOG(WARNING, PMD, "could not parse node value from
> %s", name);
> +		goto out;
> +	}
> +
> +	*node = '\0';
> +	node++;
> +
> +	action = strchr(node, ':');
> +	if (!action) {
> +		RTE_LOG(WARNING, PMD, "could not action value from %s",
> node);
> +		goto out;
> +	}
> +
> +	*action = '\0';
> +	action++;
> +
> +	/*
> +	 * Need to do some sanity checking here
> +	 */
> +
> +	if (strcmp(action, ETH_RING_ACTION_ATTACH) == 0)
> +		info->list[info->count].action = DEV_ATTACH;
> +	else if (strcmp(action, ETH_RING_ACTION_CREATE) == 0)
> +		info->list[info->count].action = DEV_CREATE;
> +	else
> +		goto out;
> +
> +	errno = 0;
> +	info->list[info->count].node = strtol(node, &end, 10);
> +
> +	if ((errno != 0) || (*end != '\0')) {
> +		RTE_LOG(WARNING, PMD, "node value %s is unparseable as
> a number\n", node);
> +		goto out;
> +	}
> +
> +	rte_snprintf(info->list[info->count].name, sizeof(info->list[info-
> >count].name), "%s", name);
> +
> +	info->count++;
> +
> +	ret = 0;
> +out:
> +	free(name);
> +	return ret;
> +}
> +
>  int
>  rte_pmd_ring_devinit(const char *name, const char *params)
>  {
> +	struct rte_kvargs *kvlist;
> +	int ret = 0;
> +	struct node_action_list *info = NULL;
> +
>  	RTE_LOG(INFO, PMD, "Initializing pmd_ring for %s\n", name);
> 
> +
>  	if (params == NULL || params[0] == '\0')
>  		eth_dev_ring_create(name, rte_socket_id(), DEV_CREATE);
>  	else {
> -		RTE_LOG(INFO, PMD, "Ignoring unsupported parameters
> when creating"
> -				" rings-backed ethernet device\n");
> -		eth_dev_ring_create(name, rte_socket_id(), DEV_CREATE);
> +		kvlist = rte_kvargs_parse(params, valid_arguments);
> +
> +		if (!kvlist) {
> +			RTE_LOG(INFO, PMD, "Ignoring unsupported
> parameters when creating"
> +					" rings-backed ethernet device\n");
> +			eth_dev_ring_create(name, rte_socket_id(),
> DEV_CREATE);
> +			return 0;
> +		} else {
> +			eth_dev_ring_create(name, rte_socket_id(),
> DEV_CREATE);
> +			ret = rte_kvargs_count(kvlist,
> ETH_RING_NUMA_NODE_ACTION_ARG);
> +			info = rte_zmalloc("struct node_action_list",
> sizeof(struct node_action_list) +
> +					   (sizeof(struct node_action_pair) *
> ret), 0);
> +			if (!info)
> +				goto out;
> +
> +			info->total = ret;
> +			info->list = (struct node_action_pair*)(info + 1);
> +
> +			ret = rte_kvargs_process(kvlist,
> ETH_RING_NUMA_NODE_ACTION_ARG,
> +						 parse_kvlist, info);
> +
> +			if (ret < 0)
> +				goto out_free;
> +
> +			for (info->count = 0; info->count < info->total; info-
> >count++) {
> +				eth_dev_ring_pair_create(name, info-
> >list[info->count].node,
> +						    info->list[info-
> >count].action);
> +			}
> +
> +		}
>  	}
> -	return 0;
> +
> +out_free:
> +	rte_free(info);
> +out:
> +	return ret;
>  }
> 
>  static struct rte_vdev_driver pmd_ring_drv = {
> @@ -402,9 +528,4 @@ static struct rte_vdev_driver pmd_ring_drv = {
>  	.init = rte_pmd_ring_devinit,
>  };
> 
> -__attribute__((constructor))
> -static void
> -rte_pmd_ring_init(void)
> -{
> -	rte_eal_vdev_driver_register(&pmd_ring_drv);
> -}
> +PMD_REGISTER_DRIVER(pmd_ring_drv, PMD_VDEV);
> diff --git a/mk/rte.app.mk b/mk/rte.app.mk
> index e6d09b8..4f167aa 100644
> --- a/mk/rte.app.mk
> +++ b/mk/rte.app.mk
> @@ -133,10 +133,6 @@ ifeq ($(CONFIG_RTE_LIBRTE_ETHER),y)
>  LDLIBS += -lethdev
>  endif
> 
> -ifeq ($(CONFIG_RTE_LIBRTE_PMD_RING),y)
> -LDLIBS += -lrte_pmd_ring
> -endif
> -
>  ifeq ($(CONFIG_RTE_LIBRTE_MALLOC),y)
>  LDLIBS += -lrte_malloc
>  endif
> @@ -173,9 +169,19 @@ LDLIBS += -lrte_cmdline
>  endif
> 
>  ifeq ($(RTE_BUILD_SHARED_LIB),n)
> +
> +ifeq ($(CONFIG_RTE_LIBRTE_PMD_RING),y)
> +LDLIBS += -lrte_pmd_ring
> +endif
> +
> +ifeq ($(CONFIG_RTE_LIBRTE_PMD_RING),y)
> +LDLIBS += -lrte_pmd_ring
> +endif
> +
>  ifeq ($(CONFIG_RTE_LIBRTE_PMD_PCAP),y)
>  LDLIBS += -lrte_pmd_pcap -lpcap
>  endif
> +
>  endif
> 
>  LDLIBS += $(EXECENV_LDLIBS)
> --
> 1.8.3.1

Hi Neil,

Sorry for opening this thread again, but I have encountered that the ring PMD unit test (ring_pmd_autotest in the test application) fails, due to this patch, as several functions calls were removed (such as rte_eth_ring_pair_create) . According to the explanation of this patch, you said that using -d/-vdev is required for the test app. Have you checked if unit test worked for you? In that case, could you tell me which parameters are needed, please?

Thanks,
Pablo

^ permalink raw reply	[flat|nested] 77+ messages in thread

end of thread, other threads:[~2014-06-13 13:28 UTC | newest]

Thread overview: 77+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-04-15 18:05 [PATCH 0/15] dpdk: Separate compile time linkage between eal lib and pmd's Neil Horman
     [not found] ` <1397585169-14537-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
2014-04-15 18:05   ` [PATCH 01/15] makefiles: Fixed -share command line option error Neil Horman
     [not found]     ` <1397585169-14537-2-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
2014-04-16  9:22       ` Thomas Monjalon
2014-04-16 11:00         ` Neil Horman
     [not found]           ` <20140416110018.GB26829-B26myB8xz7F8NnZeBjwnZQMhkBWG/bsMQH7oEaQurus@public.gmane.org>
2014-04-16 11:37             ` Thomas Monjalon
2014-04-16 13:51       ` [PATCH 01/15 v2] " Neil Horman
     [not found]         ` <1397656304-468-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
2014-04-18 11:23           ` Thomas Monjalon
2014-04-18 13:18             ` Neil Horman
     [not found]               ` <20140418131849.GC4053-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2014-04-18 13:29                 ` Thomas Monjalon
2014-04-18 17:36                   ` Neil Horman
2014-04-21 14:41                   ` Neil Horman
2014-04-29 23:42           ` Thomas Monjalon
2014-05-02 11:09             ` Neil Horman
     [not found]               ` <20140502110927.GA15335-B26myB8xz7F8NnZeBjwnZQMhkBWG/bsMQH7oEaQurus@public.gmane.org>
2014-05-02 12:22                 ` Thomas Monjalon
2014-05-02 13:01                   ` Neil Horman
     [not found]                     ` <20140502130148.GD15335-B26myB8xz7F8NnZeBjwnZQMhkBWG/bsMQH7oEaQurus@public.gmane.org>
2014-05-02 13:18                       ` Thomas Monjalon
2014-04-15 18:05   ` [PATCH 02/15] make: include whole archive on static link Neil Horman
     [not found]     ` <1397585169-14537-3-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
2014-04-16  9:26       ` Thomas Monjalon
2014-04-16 11:02         ` Neil Horman
     [not found]           ` <20140416110204.GC26829-B26myB8xz7F8NnZeBjwnZQMhkBWG/bsMQH7oEaQurus@public.gmane.org>
2014-04-16 11:40             ` Thomas Monjalon
2014-04-16 13:02               ` Neil Horman
     [not found]                 ` <20140416130204.GB11887-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2014-04-16 13:33                   ` Neil Horman
2014-04-15 18:05   ` [PATCH 03/15] pmd: Add PMD_REGISTER_DRIVER macro Neil Horman
     [not found]     ` <1397585169-14537-4-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
2014-04-16 11:52       ` Thomas Monjalon
2014-04-16 12:59         ` John W. Linville
2014-04-16 13:08         ` Neil Horman
     [not found]           ` <20140416130848.GC11887-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2014-04-16 16:11             ` Olivier MATZ
     [not found]               ` <534EABB4.9020301-pdR9zngts4EAvxtiuMwx3w@public.gmane.org>
2014-04-16 17:15                 ` John W. Linville
2014-04-16 17:29                 ` Neil Horman
     [not found]                   ` <20140416172924.GE11887-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2014-04-17  8:08                     ` Olivier MATZ
     [not found]                       ` <534F8BFD.6070701-pdR9zngts4EAvxtiuMwx3w@public.gmane.org>
2014-04-17 10:59                         ` Neil Horman
2014-04-18 11:42       ` Thomas Monjalon
2014-04-18 12:04         ` Neil Horman
     [not found]           ` <20140418120409.GB2812-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2014-04-18 12:08             ` Thomas Monjalon
2014-04-18 13:20               ` Neil Horman
     [not found]                 ` <20140418132054.GD4053-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2014-04-18 13:32                   ` Thomas Monjalon
2014-04-18 17:42                     ` Neil Horman
2014-04-15 18:05   ` [PATCH 04/15] pcap: Convert to use of PMD_REGISTER_DRIVER and fix linking Neil Horman
2014-04-15 18:05   ` [PATCH 05/15] ring: " Neil Horman
     [not found]     ` <1397585169-14537-6-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
2014-04-16 13:53       ` [PATCH 05/15 v2] " Neil Horman
2014-04-17  9:50       ` [PATCH 05/15] " Ananyev, Konstantin
     [not found]         ` <2601191342CEEE43887BDE71AB9772580EF973E4-kPTMFJFq+rEu0RiL9chJVbfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2014-04-17 11:06           ` Neil Horman
2014-04-17 15:16           ` [PATCH 05/15 v3] " Neil Horman
     [not found]             ` <1397747816-23245-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
2014-06-13 13:28               ` De Lara Guarch, Pablo
2014-04-15 18:06   ` [PATCH 06/15] xenvirt: " Neil Horman
2014-04-15 18:06   ` [PATCH 07/15] eal: Make vdev init path generic for both virtual and physcial devices Neil Horman
     [not found]     ` <1397585169-14537-8-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
2014-04-18 12:02       ` Thomas Monjalon
2014-04-15 18:06   ` [PATCH 08/15] igb: Convert to use of PMD_REGISTER_DRIVER and fix linking Neil Horman
2014-04-15 18:06   ` [PATCH 09/15] igbvf: " Neil Horman
2014-04-15 18:06   ` [PATCH 10/15] e1000: " Neil Horman
2014-04-15 18:06   ` [PATCH 11/15] ixgbe: " Neil Horman
2014-04-15 18:06   ` [PATCH 12/15] ixgbevf: " Neil Horman
2014-04-15 18:06   ` [PATCH 13/15] virtio: " Neil Horman
2014-04-15 18:06   ` [PATCH 14/15] vmxnet3: " Neil Horman
2014-04-15 18:06   ` [PATCH 15/15] pmd: Remove rte_pmd_init_all Neil Horman
2014-04-21 14:59   ` [PATCH v5 00/14] dpdk: Separate compile time linkage between eal lib and pmd's Neil Horman
     [not found]     ` <1398092379-7679-1-git-send-email-nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
2014-04-21 14:59       ` [PATCH 0/X v5 01/14] makefiles: Fixed -share command line option error Neil Horman
2014-04-21 14:59       ` [PATCH 0/X v5 02/14] pmd: Add PMD_REGISTER_DRIVER macro Neil Horman
2014-04-21 14:59       ` [PATCH 0/X v5 03/14] pcap: Convert to use of PMD_REGISTER_DRIVER and fix linking Neil Horman
2014-04-21 14:59       ` [PATCH 0/X v5 04/14] ring: " Neil Horman
2014-04-21 14:59       ` [PATCH 0/X v5 05/14] xenvirt: " Neil Horman
2014-04-21 14:59       ` [PATCH 0/X v5 06/14] eal: Make vdev init path generic for both virtual and physcial devices Neil Horman
2014-04-21 14:59       ` [PATCH 0/X v5 07/14] igb: Convert to use of PMD_REGISTER_DRIVER and fix linking Neil Horman
2014-04-21 14:59       ` [PATCH 0/X v5 08/14] igbvf: " Neil Horman
2014-04-21 14:59       ` [PATCH 0/X v5 09/14] e1000: " Neil Horman
2014-04-21 14:59       ` [PATCH 0/X v5 10/14] ixgbe: " Neil Horman
2014-04-21 14:59       ` [PATCH 0/X v5 11/14] ixgbevf: " Neil Horman
2014-04-21 14:59       ` [PATCH 0/X v5 12/14] virtio: " Neil Horman
2014-04-21 14:59       ` [PATCH 0/X v5 13/14] vmxnet3: " Neil Horman
2014-04-21 14:59       ` [PATCH 0/X v5 14/14] pmd: Remove rte_pmd_init_all Neil Horman
2014-04-21 17:05       ` [PATCH v5 00/14] dpdk: Separate compile time linkage between eal lib and pmd's Neil Horman
2014-04-21 20:10       ` Stephen Hemminger
     [not found]         ` <20140421131000.743b6d9b-We1ePj4FEcvRI77zikRAJc56i+j3xesD0e7PPNI6Mm0@public.gmane.org>
2014-04-21 20:36           ` Neil Horman
2014-05-16 15:28       ` Neil Horman
     [not found]         ` <20140516152847.GB5432-B26myB8xz7F8NnZeBjwnZQMhkBWG/bsMQH7oEaQurus@public.gmane.org>
2014-05-16 15:39           ` Thomas Monjalon
2014-05-20 12:45       ` Thomas Monjalon
2014-05-20 14:13         ` Neil Horman

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.