On Wed, Apr 13, 2016 at 7:42 AM, Sugesh Chandran <sugesh.chand...@intel.com> wrote: > Optimizing tunneling performance in userspace datapath by offloading the > rx checksum validation on tunnel packets to the NIC when it is supported. > > This patch improves the bidirectional VxLAN tunneling performance by 8% and > decapsulation performance by 24%. However it introduces 1% performance drop in > PHY-PHY case due to the overhead of validating invalid checksum flag reported > by NIC. > > Signed-off-by: Sugesh Chandran <sugesh.chand...@intel.com> > --- > lib/dpif-netdev.c | 40 ++++++++++++++++++++++++++++++++-------- > lib/netdev-dpdk.c | 39 +++++++++++++++++++++++++-------------- > lib/netdev-provider.h | 3 +++ > lib/netdev-vport.c | 25 +++++++++++++++---------- > lib/netdev.c | 1 + > lib/netdev.h | 5 +++++ > lib/packets.h | 1 + > 7 files changed, 82 insertions(+), 32 deletions(-) > > diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c > index 2870951..5de5c6a 100644 > --- a/lib/dpif-netdev.c > +++ b/lib/dpif-netdev.c > @@ -70,6 +70,7 @@ > #include "util.h" > > #include "openvswitch/vlog.h" > +#include "netdev-provider.h" > > VLOG_DEFINE_THIS_MODULE(dpif_netdev); > > @@ -479,7 +480,8 @@ static void dp_netdev_execute_actions(struct > dp_netdev_pmd_thread *pmd, > const struct nlattr *actions, > size_t actions_len); > static void dp_netdev_input(struct dp_netdev_pmd_thread *, > - struct dp_packet **, int cnt, odp_port_t > port_no); > + struct dp_packet **, int cnt, > + struct dp_netdev_port *port); > static void dp_netdev_recirculate(struct dp_netdev_pmd_thread *, > struct dp_packet **, int cnt); > > @@ -2572,7 +2574,7 @@ dp_netdev_process_rxq_port(struct dp_netdev_pmd_thread > *pmd, > *recirc_depth_get() = 0; > > cycles_count_start(pmd); > - dp_netdev_input(pmd, packets, cnt, port->port_no); > + dp_netdev_input(pmd, packets, cnt, port); > cycles_count_end(pmd, PMD_CYCLES_PROCESSING); > } else if (error != EAGAIN && error != EOPNOTSUPP) { > static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5); > @@ -3394,6 +3396,20 @@ dp_netdev_queue_batches(struct dp_packet *pkt, > packet_batch_update(batch, pkt, mf); > } > > +static inline bool > +is_checksum_valid(struct dp_packet *packet) { > +#ifdef DPDK_NETDEV > + if (packet->mbuf.ol_flags & (PKT_RX_IP_CKSUM_BAD | > + PKT_RX_L4_CKSUM_BAD)) { > + return 0; > + } > + packet->md.ol_flags = NETDEV_RX_CHECKSUM_OFFLOAD; There is no need to define redundant flags for same information in dp_packet. We can just access packet->mbuf members to check the checksum flag.
> + return 1; > +#else > + return 0; > +#endif > +} > + > /* Try to process all ('cnt') the 'packets' using only the exact match cache > * 'pmd->flow_cache'. If a flow is not found for a packet 'packets[i]', the > * miniflow is copied into 'keys' and the packet pointer is moved at the > @@ -3409,11 +3425,13 @@ static inline size_t > emc_processing(struct dp_netdev_pmd_thread *pmd, struct dp_packet **packets, > size_t cnt, struct netdev_flow_key *keys, > struct packet_batch batches[], size_t *n_batches, > - bool md_is_valid, odp_port_t port_no) > + bool md_is_valid, struct dp_netdev_port *port) > { > struct emc_cache *flow_cache = &pmd->flow_cache; > struct netdev_flow_key *key = &keys[0]; > size_t i, n_missed = 0, n_dropped = 0; > + bool rx_cksm_ol_enable = port && (port->netdev->ol_flags & > + NETDEV_RX_CHECKSUM_OFFLOAD); > > for (i = 0; i < cnt; i++) { > struct dp_netdev_flow *flow; > @@ -3425,6 +3443,12 @@ emc_processing(struct dp_netdev_pmd_thread *pmd, > struct dp_packet **packets, > continue; > } > > + if (OVS_UNLIKELY(rx_cksm_ol_enable && !is_checksum_valid(packet))) { Is checking for rx_cksum_ol_enable really required? No other netdev implementation would initialize the packet ckecksum flags. So only DPDK packets should return a invalid checksum here. > + dp_packet_delete(packet); > + n_dropped++; > + continue; > + } > + Calling checksum validation from datapath for all packets is odd. I am not sure about the reasoning. I think we can validate the packet checksum flags in tunnel code. _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev