> -----Original Message----- > From: lng-odp [mailto:lng-odp-boun...@lists.linaro.org] On Behalf Of EXT Maxim > Uvarov > Sent: Monday, October 26, 2015 11:36 AM > To: lng-odp@lists.linaro.org > Subject: Re: [lng-odp] [PATCH v6 6/6] test: l2fwd: word copy ethernet > addresses > > On 10/23/2015 16:01, Matias Elo wrote: > > Optimize ethernet address filling by using word copy. > > > > Signed-off-by: Matias Elo <matias....@nokia.com> > > --- > > test/performance/odp_l2fwd.c | 57 > ++++++++++++++++++++++++++++++++++---------- > > 1 file changed, 45 insertions(+), 12 deletions(-) > > > > diff --git a/test/performance/odp_l2fwd.c b/test/performance/odp_l2fwd.c > > index fb5f656..4e371a1 100644 > > --- a/test/performance/odp_l2fwd.c > > +++ b/test/performance/odp_l2fwd.c > > @@ -92,6 +92,14 @@ typedef struct { > > } thread_args_t; > > > > /** > > + * Optimized type for storing ethernet addresses > > + */ > > +typedef union { > > + uint8_t u8[6]; > > + uint16_t u16[3]; > > +} eth_addr_t; > > + > > +/** > > * Grouping of all global data > > */ > > typedef struct { > > @@ -102,9 +110,9 @@ typedef struct { > > /** Table of pktio handles */ > > odp_pktio_t pktios[ODP_CONFIG_PKTIO_ENTRIES]; > > /** Table of port ethernet addresses */ > > - odph_ethaddr_t port_eth_addr[ODP_CONFIG_PKTIO_ENTRIES]; > > + eth_addr_t port_eth_addr[ODP_CONFIG_PKTIO_ENTRIES]; > > /** Table of dst ethernet addresses */ > > - odph_ethaddr_t dst_eth_addr[ODP_CONFIG_PKTIO_ENTRIES]; > > + eth_addr_t dst_eth_addr[ODP_CONFIG_PKTIO_ENTRIES]; > > /** Table of port default output queues */ > > odp_queue_t outq_def[ODP_CONFIG_PKTIO_ENTRIES]; > > /** Table of dst ports */ > > @@ -433,7 +441,7 @@ int main(int argc, char *argv[]) > > odp_shm_t shm; > > odp_cpumask_t cpumask; > > char cpumaskstr[ODP_CPUMASK_STR_SIZE]; > > - odph_ethaddr_t new_addr; > > + eth_addr_t new_addr; > > odp_pktio_t pktio; > > odp_pool_param_t params; > > int ret; > > @@ -508,7 +516,7 @@ int main(int argc, char *argv[]) > > gbl_args->pktios[i] = pktio; > > > > /* Save interface ethernet address */ > > - if (odp_pktio_mac_addr(pktio, gbl_args->port_eth_addr[i].addr, > > + if (odp_pktio_mac_addr(pktio, gbl_args->port_eth_addr[i].u8, > > ODPH_ETHADDR_LEN) != > ODPH_ETHADDR_LEN) { > > LOG_ERR("Error: interface ethernet address > unknown\n"); > > exit(EXIT_FAILURE); > > @@ -521,9 +529,9 @@ int main(int argc, char *argv[]) > > /* Save destination eth address */ > > if (gbl_args->appl.dst_change) { > > /* 02:00:00:00:00:XX */ > > - memset(&new_addr, 0, sizeof(odph_ethaddr_t)); > > - new_addr.addr[0] = 0x02; > > - new_addr.addr[5] = i; > > + memset(&new_addr, 0, sizeof(eth_addr_t)); > > + new_addr.u8[0] = 0x02; > > + new_addr.u8[5] = i; > > gbl_args->dst_eth_addr[i] = new_addr; > > } > > > > @@ -615,6 +623,24 @@ static int drop_err_pkts(odp_packet_t pkt_tbl[], > unsigned len) > > } > > > > /** > > + * Word copy ethernet address > > + * > > + * @param to Destination memory address > > + * @param from Source memory address > > + */ > > +static void copy_eth_addr(uint16_t *to, uint16_t *from) > > +{ > > + uint16_t fw0, fw1, fw2; > > + > > + fw0 = from[0]; > > + fw1 = from[1]; > > + fw2 = from[2]; > > + to[0] = fw0; > > + to[1] = fw1; > > + to[2] = fw2; > > +} > > + > > +/** > > * Fill packets' eth addresses according to the destination port > > * > > * @param pkt_tbl Array of packets > > @@ -626,6 +652,8 @@ static void fill_eth_addrs(odp_packet_t pkt_tbl[], > unsigned num, int dst_port) > > odp_packet_t pkt; > > odph_ethhdr_t *eth; > > unsigned i; > > + uint16_t *to; > > + uint16_t *from; > > > > if (!gbl_args->appl.dst_change && !gbl_args->appl.src_change) > > return; > > @@ -635,11 +663,16 @@ static void fill_eth_addrs(odp_packet_t pkt_tbl[], > unsigned num, int dst_port) > > if (odp_packet_has_eth(pkt)) { > > eth = (odph_ethhdr_t *)odp_packet_l2_ptr(pkt, NULL); > > > > - if (gbl_args->appl.src_change) > > - eth->src = gbl_args->port_eth_addr[dst_port]; > > - > > - if (gbl_args->appl.dst_change) > > - eth->dst = gbl_args->dst_eth_addr[dst_port]; > > + if (gbl_args->appl.src_change) { > > + from = gbl_args->port_eth_addr[dst_port].u16; > > + to = (uint16_t *)eth->src.addr; > > + copy_eth_addr(to, from); > > + } > > + if (gbl_args->appl.dst_change) { > > + from = gbl_args->dst_eth_addr[dst_port].u16; > > + to = (uint16_t *)eth->dst.addr; > Please fix arm build: > > http://releases.linaro.org/15.02/components/toolchain/binaries/arm-linux- > gnueabihf/gcc-linaro-4.9-2015.02-3-x86_64_arm-linux-gnueabihf.tar.xz > > odp_l2fwd.c: In function 'fill_eth_addrs': > odp_l2fwd.c:668:10: error: cast increases required alignment of target > type [-Werror=cast-align] > to = (uint16_t *)eth->src.addr; > ^ > odp_l2fwd.c:673:10: error: cast increases required alignment of target > type [-Werror=cast-align] > to = (uint16_t *)eth->dst.addr; > > Something like: > to = (uint16_t *)ð->dst.addr; > > Maxim.
Could you merge just the five first commit now? Let's forget the last commit for now and fix it later. -Matias > > > > + copy_eth_addr(to, from); > > + } > > } > > } > > } > > _______________________________________________ > lng-odp mailing list > lng-odp@lists.linaro.org > https://lists.linaro.org/mailman/listinfo/lng-odp _______________________________________________ lng-odp mailing list lng-odp@lists.linaro.org https://lists.linaro.org/mailman/listinfo/lng-odp