[ovs-dev] [PATCH 2/6] ofproto: Make 'importance' immutable.

Ben Pfaff blp at nicira.com
Wed Jun 24 17:57:02 UTC 2015


OpenFlow provides no means to change the importance of a flow after it is
added, so make it immutable so that it is reasonable to read it without
locking.

Signed-off-by: Ben Pfaff <blp at nicira.com>
---
 ofproto/ofproto-provider.h | 2 +-
 ofproto/ofproto.c          | 5 ++---
 2 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/ofproto/ofproto-provider.h b/ofproto/ofproto-provider.h
index 527823a..495f787 100644
--- a/ofproto/ofproto-provider.h
+++ b/ofproto/ofproto-provider.h
@@ -354,7 +354,7 @@ struct rule {
     uint16_t idle_timeout OVS_GUARDED; /* In seconds from ->used. */
 
     /* Eviction precedence. */
-    uint16_t importance OVS_GUARDED;
+    const uint16_t importance;
 
     /* Removal reason for sending flow removed message.
      * Used only if 'flags' has OFPUTIL_FF_SEND_FLOW_REM set and if the
diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c
index 278c97f..d48c31c 100644
--- a/ofproto/ofproto.c
+++ b/ofproto/ofproto.c
@@ -4633,7 +4633,7 @@ replace_rule_create(struct ofproto *ofproto, struct ofputil_flow_mod *fm,
     ovs_mutex_lock(&rule->mutex);
     rule->idle_timeout = fm->idle_timeout;
     rule->hard_timeout = fm->hard_timeout;
-    rule->importance = fm->importance;
+    *CONST_CAST(uint16_t *, &rule->importance) = fm->importance;
     rule->removed_reason = OVS_OFPRR_NONE;
 
     *CONST_CAST(uint8_t *, &rule->table_id) = table_id;
@@ -4649,7 +4649,6 @@ replace_rule_create(struct ofproto *ofproto, struct ofputil_flow_mod *fm,
 
     /* Copy values from old rule for modify semantics. */
     if (old_rule && fm->delete_reason != OFPRR_EVICTION) {
-        /*  'fm' says that  */
         bool change_cookie = (fm->modify_cookie
                               && fm->new_cookie != OVS_BE64_MAX
                               && fm->new_cookie != old_rule->flow_cookie);
@@ -4658,7 +4657,7 @@ replace_rule_create(struct ofproto *ofproto, struct ofputil_flow_mod *fm,
         if (fm->command != OFPFC_ADD) {
             rule->idle_timeout = old_rule->idle_timeout;
             rule->hard_timeout = old_rule->hard_timeout;
-            rule->importance = old_rule->importance;
+            *CONST_CAST(uint16_t *, &rule->importance) = old_rule->importance;
             rule->flags = old_rule->flags;
             rule->created = old_rule->created;
         }
-- 
2.1.3




More information about the dev mailing list