Using weak symbols have a few issues with static linking: - normally the linker searches the .o files already linked, if your weak one is there, it won't check if there is a strong version - unless the symbol is directly referred, but it's not the right thing to rely on - or --whole-archive specified in the command line, which pulls in a lot of unwanted stuff - whole-archive also makes libtool dropping the library from the command line, which is what should happen with dynamic linking, but not with static (observed on Ubuntu 14.04). This is an important bug if you build a static library depending on DPDK
This patch merges the two version and make the behaviour rely on the config. If we can agree in the concept, I can send a series to fix this for the other weak functions. Signed-off-by: Zoltan Kiss <zoltan.kiss at schaman.hu> --- drivers/net/i40e/i40e_rxtx.c | 36 +++++++++++++++++++++++++++++++++++- drivers/net/i40e/i40e_rxtx_vec.c | 36 ------------------------------------ 2 files changed, 35 insertions(+), 37 deletions(-) diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c index d3cfb98..ad34d3a 100644 --- a/drivers/net/i40e/i40e_rxtx.c +++ b/drivers/net/i40e/i40e_rxtx.c @@ -3278,10 +3278,44 @@ i40e_set_tx_function(struct rte_eth_dev *dev) } /* Stubs needed for linkage when CONFIG_RTE_I40E_INC_VECTOR is set to 'n' */ -int __attribute__((weak)) +int __attribute__((cold)) i40e_rx_vec_dev_conf_condition_check(struct rte_eth_dev __rte_unused *dev) { +#ifndef RTE_LIBRTE_I40E_INC_VECTOR return -1; +#else +#ifndef RTE_LIBRTE_IEEE1588 + struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode; + struct rte_fdir_conf *fconf = &dev->data->dev_conf.fdir_conf; + + /* need SSE4.1 support */ + if (!rte_cpu_get_flag_enabled(RTE_CPUFLAG_SSE4_1)) + return -1; + +#ifndef RTE_LIBRTE_I40E_RX_OLFLAGS_ENABLE + /* whithout rx ol_flags, no VP flag report */ + if (rxmode->hw_vlan_strip != 0 || + rxmode->hw_vlan_extend != 0) + return -1; +#endif /* RTE_LIBRTE_I40E_RX_OLFLAGS_ENABLE */ + + /* no fdir support */ + if (fconf->mode != RTE_FDIR_MODE_NONE) + return -1; + + /* - no csum error report support + * - no header split support + */ + if (rxmode->hw_ip_checksum == 1 || + rxmode->header_split == 1) + return -1; + + return 0; +#else + RTE_SET_USED(dev); + return -1; +#endif /* RTE_LIBRTE_IEEE1588 */ +#endif /* RTE_LIBRTE_I40E_INC_VECTOR */ } uint16_t __attribute__((weak)) diff --git a/drivers/net/i40e/i40e_rxtx_vec.c b/drivers/net/i40e/i40e_rxtx_vec.c index 05cb415..983b2c0 100644 --- a/drivers/net/i40e/i40e_rxtx_vec.c +++ b/drivers/net/i40e/i40e_rxtx_vec.c @@ -723,39 +723,3 @@ i40e_txq_vec_setup(struct i40e_tx_queue __rte_unused *txq) { return 0; } - -int __attribute__((cold)) -i40e_rx_vec_dev_conf_condition_check(struct rte_eth_dev *dev) -{ -#ifndef RTE_LIBRTE_IEEE1588 - struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode; - struct rte_fdir_conf *fconf = &dev->data->dev_conf.fdir_conf; - - /* need SSE4.1 support */ - if (!rte_cpu_get_flag_enabled(RTE_CPUFLAG_SSE4_1)) - return -1; - -#ifndef RTE_LIBRTE_I40E_RX_OLFLAGS_ENABLE - /* whithout rx ol_flags, no VP flag report */ - if (rxmode->hw_vlan_strip != 0 || - rxmode->hw_vlan_extend != 0) - return -1; -#endif - - /* no fdir support */ - if (fconf->mode != RTE_FDIR_MODE_NONE) - return -1; - - /* - no csum error report support - * - no header split support - */ - if (rxmode->hw_ip_checksum == 1 || - rxmode->header_split == 1) - return -1; - - return 0; -#else - RTE_SET_USED(dev); - return -1; -#endif -} -- 1.9.1