On 04.02.2019 15:50, Asaf Penso wrote: > In netdev_dpdk_add_rte_flow_offload function different rte_flow_item are > created as part of the pattern matching. > > For most of them, there is a check whether the wildcards are not zero. > In case of zero, nothing is being done with the rte_flow_item. > > Befor the wildcard check, and regardless of the result, the > rte_flow_item is being memset. > > The patch moves the memset function only if the condition of the > wildcard is true, thus saving cycles of memset if not needed.
Structures are actually used only inside their 'if' blocks. IMHO, it's better to move the definitions inside too. > > Signed-off-by: Asaf Penso <as...@mellanox.com> > --- > lib/netdev-dpdk.c | 28 ++++++++++++++-------------- > 1 file changed, 14 insertions(+), 14 deletions(-) > > diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c > index 4bf0ca9..5216b74 100644 > --- a/lib/netdev-dpdk.c > +++ b/lib/netdev-dpdk.c > @@ -4570,10 +4570,10 @@ netdev_dpdk_add_rte_flow_offload(struct netdev > *netdev, > /* Eth */ > struct rte_flow_item_eth eth_spec; > struct rte_flow_item_eth eth_mask; > - memset(ð_spec, 0, sizeof(eth_spec)); > - memset(ð_mask, 0, sizeof(eth_mask)); > if (!eth_addr_is_zero(match->wc.masks.dl_src) || > !eth_addr_is_zero(match->wc.masks.dl_dst)) { > + memset(ð_spec, 0, sizeof(eth_spec)); > + memset(ð_mask, 0, sizeof(eth_mask)); > rte_memcpy(ð_spec.dst, &match->flow.dl_dst, sizeof(eth_spec.dst)); > rte_memcpy(ð_spec.src, &match->flow.dl_src, sizeof(eth_spec.src)); > eth_spec.type = match->flow.dl_type; > @@ -4600,9 +4600,9 @@ netdev_dpdk_add_rte_flow_offload(struct netdev *netdev, > /* VLAN */ > struct rte_flow_item_vlan vlan_spec; > struct rte_flow_item_vlan vlan_mask; > - memset(&vlan_spec, 0, sizeof(vlan_spec)); > - memset(&vlan_mask, 0, sizeof(vlan_mask)); > if (match->wc.masks.vlans[0].tci && match->flow.vlans[0].tci) { > + memset(&vlan_spec, 0, sizeof(vlan_spec)); > + memset(&vlan_mask, 0, sizeof(vlan_mask)); > vlan_spec.tci = match->flow.vlans[0].tci & ~htons(VLAN_CFI); > vlan_mask.tci = match->wc.masks.vlans[0].tci & ~htons(VLAN_CFI); > > @@ -4617,9 +4617,9 @@ netdev_dpdk_add_rte_flow_offload(struct netdev *netdev, > uint8_t proto = 0; > struct rte_flow_item_ipv4 ipv4_spec; > struct rte_flow_item_ipv4 ipv4_mask; > - memset(&ipv4_spec, 0, sizeof(ipv4_spec)); > - memset(&ipv4_mask, 0, sizeof(ipv4_mask)); > if (match->flow.dl_type == htons(ETH_TYPE_IP)) { > + memset(&ipv4_spec, 0, sizeof(ipv4_spec)); > + memset(&ipv4_mask, 0, sizeof(ipv4_mask)); > > ipv4_spec.hdr.type_of_service = match->flow.nw_tos; > ipv4_spec.hdr.time_to_live = match->flow.nw_ttl; > @@ -4662,9 +4662,9 @@ netdev_dpdk_add_rte_flow_offload(struct netdev *netdev, > > struct rte_flow_item_tcp tcp_spec; > struct rte_flow_item_tcp tcp_mask; > - memset(&tcp_spec, 0, sizeof(tcp_spec)); > - memset(&tcp_mask, 0, sizeof(tcp_mask)); > if (proto == IPPROTO_TCP) { > + memset(&tcp_spec, 0, sizeof(tcp_spec)); > + memset(&tcp_mask, 0, sizeof(tcp_mask)); > tcp_spec.hdr.src_port = match->flow.tp_src; > tcp_spec.hdr.dst_port = match->flow.tp_dst; > tcp_spec.hdr.data_off = ntohs(match->flow.tcp_flags) >> 8; > @@ -4687,9 +4687,9 @@ netdev_dpdk_add_rte_flow_offload(struct netdev *netdev, > > struct rte_flow_item_udp udp_spec; > struct rte_flow_item_udp udp_mask; > - memset(&udp_spec, 0, sizeof(udp_spec)); > - memset(&udp_mask, 0, sizeof(udp_mask)); > if (proto == IPPROTO_UDP) { > + memset(&udp_spec, 0, sizeof(udp_spec)); > + memset(&udp_mask, 0, sizeof(udp_mask)); > udp_spec.hdr.src_port = match->flow.tp_src; > udp_spec.hdr.dst_port = match->flow.tp_dst; > > @@ -4708,9 +4708,9 @@ netdev_dpdk_add_rte_flow_offload(struct netdev *netdev, > > struct rte_flow_item_sctp sctp_spec; > struct rte_flow_item_sctp sctp_mask; > - memset(&sctp_spec, 0, sizeof(sctp_spec)); > - memset(&sctp_mask, 0, sizeof(sctp_mask)); > if (proto == IPPROTO_SCTP) { > + memset(&sctp_spec, 0, sizeof(sctp_spec)); > + memset(&sctp_mask, 0, sizeof(sctp_mask)); > sctp_spec.hdr.src_port = match->flow.tp_src; > sctp_spec.hdr.dst_port = match->flow.tp_dst; > > @@ -4729,9 +4729,9 @@ netdev_dpdk_add_rte_flow_offload(struct netdev *netdev, > > struct rte_flow_item_icmp icmp_spec; > struct rte_flow_item_icmp icmp_mask; > - memset(&icmp_spec, 0, sizeof(icmp_spec)); > - memset(&icmp_mask, 0, sizeof(icmp_mask)); > if (proto == IPPROTO_ICMP) { > + memset(&icmp_spec, 0, sizeof(icmp_spec)); > + memset(&icmp_mask, 0, sizeof(icmp_mask)); > icmp_spec.hdr.icmp_type = (uint8_t)ntohs(match->flow.tp_src); > icmp_spec.hdr.icmp_code = (uint8_t)ntohs(match->flow.tp_dst); > > _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev