[ovs-dev] [PATCHv2 3/3] revalidator: Use xcache when revalidation is required.

Joe Stringer joestringer at nicira.com
Wed Jun 4 01:59:25 UTC 2014


One of the reasons that xlate_cache was introduced was to ensure that
statistics were attributed to the correct rules and interfaces according
to the flow that was installed into the datapath, rather than according
to the current state of the flow table.

This patch makes the revalidators use the xlate_cache to attribute stats
when full revalidation is required. Furthermore, rather than deleting
the xcache when revalidating, keep it around.

Signed-off-by: Joe Stringer <joestringer at nicira.com>
---
v2: Don't delete the old xcache when revalidating.
    Removed extraneous "ukey->xcache = NULL".
---
 ofproto/ofproto-dpif-upcall.c |   23 ++++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/ofproto/ofproto-dpif-upcall.c b/ofproto/ofproto-dpif-upcall.c
index 90e18e3..b4aa48b 100644
--- a/ofproto/ofproto-dpif-upcall.c
+++ b/ofproto/ofproto-dpif-upcall.c
@@ -1148,10 +1148,16 @@ revalidate_ukey(struct udpif *udpif, struct udpif_key *ukey,
     }
 
     may_learn = push.n_packets > 0;
-    if (ukey->xcache && !udpif->need_revalidate) {
+    if (ukey->xcache) {
         xlate_push_stats(ukey->xcache, may_learn, &push);
-        ok = true;
-        goto exit;
+        if (udpif->need_revalidate) {
+            push.n_packets = 0;
+            push.n_bytes = 0;
+            may_learn = false;
+        } else {
+            ok = true;
+            goto exit;
+        }
     }
 
     error = xlate_receive(udpif->backer, NULL, ukey->key, ukey->key_len, &flow,
@@ -1160,16 +1166,11 @@ revalidate_ukey(struct udpif *udpif, struct udpif_key *ukey,
         goto exit;
     }
 
-    if (udpif->need_revalidate) {
-        xlate_cache_clear(ukey->xcache);
-    }
-    if (!ukey->xcache) {
-        ukey->xcache = xlate_cache_new();
-    }
-
     xlate_in_init(&xin, ofproto, &flow, NULL, push.tcp_flags, NULL);
     xin.resubmit_stats = push.n_packets ? &push : NULL;
-    xin.xcache = ukey->xcache;
+    if (!ukey->xcache) {
+        ukey->xcache = xin.xcache = xlate_cache_new();
+    }
     xin.may_learn = may_learn;
     xin.skip_wildcards = !udpif->need_revalidate;
     xlate_actions(&xin, &xout);
-- 
1.7.10.4




More information about the dev mailing list