From: Morten Brørup Date: Fri, 26 Jun 2020 16:51:35 +0000 (+0200) Subject: net: optimize ethernet address functions X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=a6f67a3b64f558b4a376e683ad9d8d7e7e7bbbf9;p=dpdk.git net: optimize ethernet address functions * rte_is_broadcast_ether_addr(): Use binary logic instead of comparisons and boolean logic, thus reducing the number of branches. It now resembles rte_is_zero_ether_addr(). * rte_ether_addr_copy(): The source code modifications were discussed on the mailing list: http://mails.dpdk.org/archives/dev/2020-June/171584.html Remove obsolete ICC-specific code and related comment. Restrict pointer aliasing (suggested by Jerin Jacob). Remove superfluous "Fast" from function description headline; all DPDK data plane functions are supposed to be fast. Signed-off-by: Morten Brørup Acked-by: Olivier Matz --- diff --git a/lib/librte_net/rte_ether.h b/lib/librte_net/rte_ether.h index a9c6925f8d..42f2c3288c 100644 --- a/lib/librte_net/rte_ether.h +++ b/lib/librte_net/rte_ether.h @@ -150,10 +150,9 @@ static inline int rte_is_multicast_ether_addr(const struct rte_ether_addr *ea) */ static inline int rte_is_broadcast_ether_addr(const struct rte_ether_addr *ea) { - const uint16_t *ea_words = (const uint16_t *)ea; + const uint16_t *w = (const uint16_t *)ea; - return (ea_words[0] == 0xFFFF && ea_words[1] == 0xFFFF && - ea_words[2] == 0xFFFF); + return (w[0] & w[1] & w[2]) == 0xFFFF; } /** @@ -212,29 +211,18 @@ void rte_eth_random_addr(uint8_t *addr); /** - * Fast copy an Ethernet address. + * Copy an Ethernet address. * * @param ea_from * A pointer to a ether_addr structure holding the Ethernet address to copy. * @param ea_to * A pointer to a ether_addr structure where to copy the Ethernet address. */ -static inline void rte_ether_addr_copy(const struct rte_ether_addr *ea_from, - struct rte_ether_addr *ea_to) +static inline void +rte_ether_addr_copy(const struct rte_ether_addr *__restrict ea_from, + struct rte_ether_addr *__restrict ea_to) { -#ifdef __INTEL_COMPILER - uint16_t *from_words = (uint16_t *)(ea_from->addr_bytes); - uint16_t *to_words = (uint16_t *)(ea_to->addr_bytes); - - to_words[0] = from_words[0]; - to_words[1] = from_words[1]; - to_words[2] = from_words[2]; -#else - /* - * Use the common way, because of a strange gcc warning. - */ *ea_to = *ea_from; -#endif } #define RTE_ETHER_ADDR_FMT_SIZE 18