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
>

Reply via email to