When EMC is disabled the reading of RSS hash is skipped.
Also, for packets that are not recirculated it retrieves
the hash value without considering the recirc id.

Signed-off-by: Antonio Fischetti <[email protected]>
---

 V4
  - reworked to remove dependencies from other patches in
    patchset "Skip EMC for recirc pkts and other optimizations."
    https://mail.openvswitch.org/pipermail/ovs-dev/2017-August/337320.html

  - measurements were repeated with the latest head of master.

 Port-to-Port Test
 =================
        Software built with "-O2 -march=native -g".

        I measured the Rx rate regardless of pkt loss by sending 1 UDP flow,
        64B packets, at the line-rate.

        2 PMDs with 3 Tx queues.

        Flows setup:
          in_port=dpdk0 actions=output:dpdk1
          in_port=dpdk1 actions=output:dpdk0

        Results
        -------
        Values are for the Rx rate in Mpps, regardless of packet loss.

        RSS column:
           Yes: RSS hash is provided by the NIC
           No: RSS is disabled and the 5-tuple hash must be
               computed in software.

               Note: to simulate RSS disabled I added the line
               dp_packet_rss_valid(struct dp_packet *p)
               {
               +return false;
               #ifdef DPDK_NETDEV

        EMC column:
           Yes: default probability insertion,
           No: EMC disabled.

        Orig means Commit ID:
          75f9e007e7f7eb91461e238f882d1c539c56bb8d

                    +--------------+----------------+
        +-----+-----+    Orig      | Orig + this    |
        | RSS | EMC |              |    patch       |
        +-----+-----+--------------+----------------+
        | Yes | Yes | 12.02, 11.38 | 12.18, 11.32   |
        | Yes |  No |  8.35,  8.36 |  8.36,  8.38   |
        +-----+-----+--------------+----------------+
        |  No | Yes |  9.91, 11.15 |  9.84, 11.08   |
        |  No |  No |  7.83,  7.87 |  8.33,  8.35   |
        +-----+-----+--------------+----------------+
---
 lib/dpif-netdev.c | 32 ++++++++++++++++++++++++++++----
 1 file changed, 28 insertions(+), 4 deletions(-)

diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index e2cd931..1157998 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -4567,6 +4567,22 @@ dp_netdev_upcall(struct dp_netdev_pmd_thread *pmd, 
struct dp_packet *packet_,
 }
 
 static inline uint32_t
+dpif_netdev_packet_get_rss_hash_orig_pkt(struct dp_packet *packet,
+                                const struct miniflow *mf)
+{
+    uint32_t hash;
+
+    if (OVS_LIKELY(dp_packet_rss_valid(packet))) {
+        hash = dp_packet_get_rss_hash(packet);
+    } else {
+        hash = miniflow_hash_5tuple(mf, 0);
+        dp_packet_set_rss_hash(packet, hash);
+    }
+
+    return hash;
+}
+
+static inline uint32_t
 dpif_netdev_packet_get_rss_hash(struct dp_packet *packet,
                                 const struct miniflow *mf)
 {
@@ -4701,10 +4717,18 @@ emc_processing(struct dp_netdev_pmd_thread *pmd,
         }
         miniflow_extract(packet, &key->mf);
         key->len = 0; /* Not computed yet. */
-        key->hash = dpif_netdev_packet_get_rss_hash(packet, &key->mf);
-
-        /* If EMC is disabled skip emc_lookup */
-        flow = (cur_min == 0) ? NULL: emc_lookup(flow_cache, key);
+        /* If EMC is disabled skip hash computation and emc_lookup */
+        if (OVS_LIKELY(cur_min)) {
+            if (!md_is_valid) {
+                key->hash = dpif_netdev_packet_get_rss_hash_orig_pkt(packet,
+                        &key->mf);
+            } else {
+                key->hash = dpif_netdev_packet_get_rss_hash(packet, &key->mf);
+            }
+            flow = emc_lookup(flow_cache, key);
+        } else {
+            flow = NULL;
+        }
         if (OVS_LIKELY(flow)) {
             dp_netdev_queue_batches(packet, flow, &key->mf, batches,
                                     n_batches);
-- 
2.4.11

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to