On 1 February 2017 at 13:47, Matias Elo <matias....@nokia.com> wrote: > 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> > --- > > Putting the whole dpdk lib inside --whole-archive flags doesn't work as it > breaks dpdk initialisation when building a shared odp library (dpdk gcc > constructors get called multiple times). > > platform/linux-generic/m4/odp_dpdk.m4 | 27 +++--- > platform/linux-generic/pktio/dpdk.c | 152 > +--------------------------------- > 2 files changed, 16 insertions(+), 163 deletions(-) > > diff --git a/platform/linux-generic/m4/odp_dpdk.m4 > b/platform/linux-generic/m4/odp_dpdk.m4 > index 30347dc..c3ff39d 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,25 @@ 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 > + DPDK_PMD+=`echo $(basename "$filename" .a) | \ > + sed -n 's/^\(librte_pmd_\)/-lrte_pmd_/p' | sed -n 's/$/,/p'` > + done > + DPDK_PMD+=--no-whole-archive > + > ODP_CFLAGS="$ODP_CFLAGS -DODP_PKTIO_DPDK" > + AM_LDFLAGS="$AM_LDFLAGS -L$DPDK_PATH/lib -Wl,$DPDK_PMD"
As far as I remember, some autotools version won't allow that: it will reject it with a message saying you are not allowed to set LDD libs withing flags (LDFLAGS)... What autotools version are you using? Hopefully, new ones will no longer do that, but I remember trying different versions... Christophe > + 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 0eb025a..a8cd3c2 100644 > --- a/platform/linux-generic/pktio/dpdk.c > +++ b/platform/linux-generic/pktio/dpdk.c > @@ -31,49 +31,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) > > @@ -86,116 +43,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 >