Previously each dpdk pmd driver had to be individually referred in the odp
code to ensure proper gcc constructor linking. Using the -—whole-archive
option when linking the drivers removes this need. After this patch new
dpdk pmd drivers are automatically linked.

Signed-off-by: Matias Elo <matias....@nokia.com>
---
 platform/linux-generic/m4/odp_dpdk.m4 |  33 +++++---
 platform/linux-generic/pktio/dpdk.c   | 152 +---------------------------------
 2 files changed, 22 insertions(+), 163 deletions(-)

diff --git a/platform/linux-generic/m4/odp_dpdk.m4 
b/platform/linux-generic/m4/odp_dpdk.m4
index 30347dc..58d1472 100644
--- a/platform/linux-generic/m4/odp_dpdk.m4
+++ b/platform/linux-generic/m4/odp_dpdk.m4
@@ -2,22 +2,10 @@
 # Enable DPDK support
 ##########################################################################
 pktio_dpdk_support=no
-AC_ARG_ENABLE([dpdk_support],
-    [  --enable-dpdk-support  include dpdk IO support],
-    [if test x$enableval = xyes; then
-        pktio_dpdk_support=yes
-    fi])
-
-##########################################################################
-# Set optional DPDK path
-##########################################################################
 AC_ARG_WITH([dpdk-path],
-AC_HELP_STRING([--with-dpdk-path=DIR   path to dpdk build directory],
-               [(or in the default path if not specified).]),
+AC_HELP_STRING([--with-dpdk-path=DIR   path to dpdk build directory]),
     [DPDK_PATH=$withval
     AM_CPPFLAGS="$AM_CPPFLAGS -msse4.2 -isystem $DPDK_PATH/include"
-    AM_LDFLAGS="$AM_LDFLAGS -L$DPDK_PATH/lib"
-    LIBS="$LIBS -ldpdk -ldl -lpcap"
     pktio_dpdk_support=yes],[])
 
 ##########################################################################
@@ -28,12 +16,31 @@ CPPFLAGS="$AM_CPPFLAGS $CPPFLAGS"
 
 ##########################################################################
 # Check for DPDK availability
+#
+# DPDK pmd drivers are not linked unless the --whole-archive option is
+# used. No spaces are allowed between the --whole-arhive flags.
 ##########################################################################
 if test x$pktio_dpdk_support = xyes
 then
     AC_CHECK_HEADERS([rte_config.h], [],
         [AC_MSG_FAILURE(["can't find DPDK header"])])
+
+    DPDK_PMD=--whole-archive,
+    for filename in $with_dpdk_path/lib/*.a; do
+        cur_driver=`echo $(basename "$filename" .a) | \
+            sed -n 's/^\(librte_pmd_\)/-lrte_pmd_/p' | sed -n 's/$/,/p'`
+        # rte_pmd_nfp has external dependencies which break linking
+        if test "$cur_driver" = "-lrte_pmd_nfp,"; then
+            echo "skip linking rte_pmd_nfp"
+        else
+            DPDK_PMD+=$cur_driver
+        fi
+    done
+    DPDK_PMD+=--no-whole-archive
+
     ODP_CFLAGS="$ODP_CFLAGS -DODP_PKTIO_DPDK"
+    AM_LDFLAGS="$AM_LDFLAGS -L$DPDK_PATH/lib -Wl,$DPDK_PMD"
+    LIBS="$LIBS -ldpdk -ldl -lpcap"
 else
     pktio_dpdk_support=no
 fi
diff --git a/platform/linux-generic/pktio/dpdk.c 
b/platform/linux-generic/pktio/dpdk.c
index 1922109..6ac89bd 100644
--- a/platform/linux-generic/pktio/dpdk.c
+++ b/platform/linux-generic/pktio/dpdk.c
@@ -34,49 +34,6 @@ static int disable_pktio; /** !0 this pktio disabled, 0 
enabled */
 /* Has dpdk_pktio_init() been called */
 static odp_bool_t dpdk_initialized;
 
-#define PMD_EXT(drv) \
-extern void devinitfn_##drv(void)
-
-PMD_EXT(aesni_gcm_pmd_drv);
-PMD_EXT(cryptodev_aesni_mb_pmd_drv);
-PMD_EXT(cryptodev_kasumi_pmd_drv);
-PMD_EXT(cryptodev_null_pmd_drv);
-PMD_EXT(cryptodev_snow3g_pmd_drv);
-PMD_EXT(pmd_qat_drv);
-PMD_EXT(pmd_af_packet_drv);
-PMD_EXT(rte_bnx2x_driver);
-PMD_EXT(rte_bnx2xvf_driver);
-PMD_EXT(bnxt_pmd_drv);
-PMD_EXT(bond_drv);
-PMD_EXT(rte_cxgbe_driver);
-PMD_EXT(em_pmd_drv);
-PMD_EXT(pmd_igb_drv);
-PMD_EXT(pmd_igbvf_drv);
-PMD_EXT(ena_pmd_drv);
-PMD_EXT(rte_enic_driver);
-PMD_EXT(rte_fm10k_driver);
-PMD_EXT(rte_i40e_driver);
-PMD_EXT(rte_i40evf_driver);
-PMD_EXT(rte_ixgbe_driver);
-PMD_EXT(rte_ixgbevf_driver);
-PMD_EXT(rte_mlx4_driver);
-PMD_EXT(rte_mlx5_driver);
-PMD_EXT(pmd_mpipe_xgbe_drv);
-PMD_EXT(pmd_mpipe_gbe_drv);
-PMD_EXT(rte_nfp_net_driver);
-PMD_EXT(pmd_null_drv);
-PMD_EXT(pmd_pcap_drv);
-PMD_EXT(rte_qede_driver);
-PMD_EXT(rte_qedevf_driver);
-PMD_EXT(pmd_ring_drv);
-PMD_EXT(pmd_szedata2_drv);
-PMD_EXT(rte_nicvf_driver);
-PMD_EXT(pmd_vhost_drv);
-PMD_EXT(rte_virtio_driver);
-PMD_EXT(virtio_user_driver);
-PMD_EXT(rte_vmxnet3_driver);
-PMD_EXT(pmd_xenvirt_drv);
-
 #define MEMPOOL_OPS(hdl) \
 extern void mp_hdlr_init_##hdl(void)
 
@@ -89,116 +46,11 @@ MEMPOOL_OPS(ops_stack);
 /*
  * This function is not called from anywhere, it's only purpose is to make sure
  * that if ODP and DPDK are statically linked to an application, the GCC
- * constructors of the PMDs are linked as well. Otherwise the linker would omit
- * them. It's not an issue with dynamic linking. */
+ * constructors of mempool handlers are linked as well. Otherwise the linker
+ * would omit them. It's not an issue with dynamic linking. */
 void refer_constructors(void);
 void refer_constructors(void)
 {
-#ifdef RTE_LIBRTE_PMD_AESNI_GCM
-       devinitfn_aesni_gcm_pmd_drv();
-#endif
-#ifdef RTE_LIBRTE_PMD_AESNI_MB
-       devinitfn_cryptodev_aesni_mb_pmd_drv();
-#endif
-#ifdef RTE_LIBRTE_PMD_KASUMI
-       devinitfn_cryptodev_kasumi_pmd_drv();
-#endif
-#ifdef RTE_LIBRTE_PMD_NULL_CRYPTO
-       devinitfn_cryptodev_null_pmd_drv();
-#endif
-#ifdef RTE_LIBRTE_PMD_SNOW3G
-       devinitfn_cryptodev_snow3g_pmd_drv();
-#endif
-#ifdef RTE_LIBRTE_PMD_QAT
-       devinitfn_pmd_qat_drv();
-#endif
-#ifdef RTE_LIBRTE_PMD_AF_PACKET
-       devinitfn_pmd_af_packet_drv();
-#endif
-#ifdef RTE_LIBRTE_BNX2X_PMD
-       devinitfn_rte_bnx2x_driver();
-       devinitfn_rte_bnx2xvf_driver();
-#endif
-#ifdef RTE_LIBRTE_BNXT_PMD
-       devinitfn_bnxt_pmd_drv();
-#endif
-#ifdef RTE_LIBRTE_PMD_BOND
-       devinitfn_bond_drv();
-#endif
-#ifdef RTE_LIBRTE_CXGBE_PMD
-       devinitfn_rte_cxgbe_driver();
-#endif
-#ifdef RTE_LIBRTE_EM_PMD
-       devinitfn_em_pmd_drv();
-#endif
-#ifdef RTE_LIBRTE_IGB_PMD
-       devinitfn_pmd_igb_drv();
-       devinitfn_pmd_igbvf_drv();
-#endif
-#ifdef RTE_LIBRTE_ENA_PMD
-       devinitfn_ena_pmd_drv();
-#endif
-#ifdef RTE_LIBRTE_ENIC_PMD
-       devinitfn_rte_enic_driver();
-#endif
-#ifdef RTE_LIBRTE_FM10K_PMD
-       devinitfn_rte_fm10k_driver();
-#endif
-#ifdef RTE_LIBRTE_I40E_PMD
-       devinitfn_rte_i40e_driver();
-       devinitfn_rte_i40evf_driver();
-#endif
-#ifdef RTE_LIBRTE_IXGBE_PMD
-       devinitfn_rte_ixgbe_driver();
-       devinitfn_rte_ixgbevf_driver();
-#endif
-#ifdef RTE_LIBRTE_MLX4_PMD
-       devinitfn_rte_mlx4_driver();
-#endif
-#ifdef RTE_LIBRTE_MLX5_PMD
-       devinitfn_rte_mlx5_driver();
-#endif
-#ifdef RTE_LIBRTE_MPIPE_PMD
-       devinitfn_pmd_mpipe_xgbe_drv()
-       devinitfn_pmd_mpipe_gbe_drv()
-#endif
-#ifdef RTE_LIBRTE_NFP_PMD
-       devinitfn_rte_nfp_net_driver();
-#endif
-#ifdef RTE_LIBRTE_PMD_NULL
-       devinitfn_pmd_null_drv();
-#endif
-#ifdef RTE_LIBRTE_PMD_PCAP
-       devinitfn_pmd_pcap_drv();
-#endif
-#ifdef RTE_LIBRTE_QEDE_PMD
-       devinitfn_rte_qede_driver();
-       devinitfn_rte_qedevf_driver();
-#endif
-#ifdef RTE_LIBRTE_PMD_RING
-       devinitfn_pmd_ring_drv();
-#endif
-#ifdef RTE_LIBRTE_PMD_SZEDATA2
-       devinitfn_pmd_szedata2_drv();
-#endif
-#ifdef RTE_LIBRTE_THUNDERX_NICVF_PMD
-       devinitfn_rte_nicvf_driver();
-#endif
-#ifdef RTE_LIBRTE_PMD_VHOST
-       devinitfn_pmd_vhost_drv();
-#endif
-#ifdef RTE_LIBRTE_VIRTIO_PMD
-       devinitfn_rte_virtio_driver();
-#endif
-#ifdef RTE_VIRTIO_USER
-       devinitfn_rte_virtio_driver();
-#endif
-#ifdef RTE_LIBRTE_VMXNET3_PMD
-       devinitfn_rte_vmxnet3_driver();
-#endif
-#ifdef RTE_LIBRTE_PMD_XENVIRT
-       devinitfn_pmd_xenvirt_drv();
-#endif
        mp_hdlr_init_ops_mp_mc();
        mp_hdlr_init_ops_sp_sc();
        mp_hdlr_init_ops_mp_sc();
-- 
2.7.4

Reply via email to