Re: [lng-odp] [PATCH v6 6/6] test: l2fwd: word copy ethernet addresses
On 10/26/2015 13:28, Elo, Matias (Nokia - FI/Espoo) wrote: -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(_addr, 0, sizeof(odph_ethaddr_t)); - new_addr.addr[0] = 0x02; - new_addr.addr[5] = i; + memset(_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 = (uint
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--- 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(_addr, 0, sizeof(odph_ethaddr_t)); - new_addr.addr[0] = 0x02; - new_addr.addr[5] = i; + memset(_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
Re: [lng-odp] [PATCH v6 6/6] test: l2fwd: word copy ethernet addresses
> -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(_addr, 0, sizeof(odph_ethaddr_t)); > > - new_addr.addr[0] = 0x02; > > - new_addr.addr[5] = i; > > + memset(_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)) { > >
[lng-odp] [PATCH v6 6/6] test: l2fwd: word copy ethernet addresses
Optimize ethernet address filling by using word copy. Signed-off-by: Matias Elo--- 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(_addr, 0, sizeof(odph_ethaddr_t)); - new_addr.addr[0] = 0x02; - new_addr.addr[5] = i; + memset(_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; + copy_eth_addr(to, from); + } } } } -- 1.9.1 ___ lng-odp mailing list lng-odp@lists.linaro.org https://lists.linaro.org/mailman/listinfo/lng-odp