[ovs-dev] [PATCH 3/4] ofproto-dpif-xlate: Do not take references in xlate_receive().

Jarno Rajahalme jrajahalme at nicira.com
Fri Aug 15 23:38:48 UTC 2014


xlate configuration (via xcfg) is already holding the references, so
the callers of xlate_receive() can safely use the returned pointers
upto the point when they quiesce.  If the objects are needed for
longer term, the callers can take additional references themselves.

Signed-off-by: Jarno Rajahalme <jrajahalme at nicira.com>
---
 ofproto/ofproto-dpif-upcall.c |   17 +++++++----------
 ofproto/ofproto-dpif-xlate.c  |   11 ++++++-----
 2 files changed, 13 insertions(+), 15 deletions(-)

diff --git a/ofproto/ofproto-dpif-upcall.c b/ofproto/ofproto-dpif-upcall.c
index a7c845e..418597c 100644
--- a/ofproto/ofproto-dpif-upcall.c
+++ b/ofproto/ofproto-dpif-upcall.c
@@ -162,8 +162,8 @@ struct upcall {
     struct xlate_out xout;         /* Result of xlate_actions(). */
     struct ofpbuf put_actions;     /* Actions 'put' in the fastapath. */
 
-    struct dpif_ipfix *ipfix;      /* IPFIX reference or NULL. */
-    struct dpif_sflow *sflow;      /* SFlow reference or NULL. */
+    struct dpif_ipfix *ipfix;      /* IPFIX pointer or NULL. */
+    struct dpif_sflow *sflow;      /* SFlow pointer or NULL. */
 
     bool vsp_adjusted;             /* 'packet' and 'flow' were adjusted for
                                       VLAN splinters if true. */
@@ -813,6 +813,9 @@ compose_slow_path(struct udpif *udpif, struct xlate_out *xout,
     odp_put_userspace_action(pid, &cookie, sizeof cookie.slow_path, buf);
 }
 
+/* The upcall must be destroyed with upcall_uninit() before quiescing,
+ * as the referred objects are guaranteed to exist only until the calling
+ * thread quiesces. */
 static int
 upcall_receive(struct upcall *upcall, const struct dpif_backer *backer,
                const struct ofpbuf *packet, enum dpif_upcall_type type,
@@ -913,8 +916,6 @@ upcall_uninit(struct upcall *upcall)
             xlate_out_uninit(&upcall->xout);
         }
         ofpbuf_uninit(&upcall->put_actions);
-        dpif_ipfix_unref(upcall->ipfix);
-        dpif_sflow_unref(upcall->sflow);
     }
 }
 
@@ -1361,11 +1362,8 @@ revalidate_ukey(struct udpif *udpif, struct udpif_key *ukey,
     ok = true;
 
 exit:
-    if (netflow) {
-        if (!ok) {
-            netflow_flow_clear(netflow, &flow);
-        }
-        netflow_unref(netflow);
+    if (netflow && !ok) {
+        netflow_flow_clear(netflow, &flow);
     }
     xlate_out_uninit(xoutp);
     return ok;
@@ -1451,7 +1449,6 @@ push_dump_ops__(struct udpif *udpif, struct dump_op *ops, size_t n_ops)
 
                 if (netflow) {
                     netflow_flow_clear(netflow, &flow);
-                    netflow_unref(netflow);
                 }
             }
         }
diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
index b3a8183..ffb2580 100644
--- a/ofproto/ofproto-dpif-xlate.c
+++ b/ofproto/ofproto-dpif-xlate.c
@@ -969,8 +969,9 @@ xlate_lookup_ofproto(const struct dpif_backer *backer, const struct flow *flow,
 /* Given a datapath and flow metadata ('backer', and 'flow' respectively),
  * optionally populates 'ofproto' with the ofproto_dpif, 'ofp_in_port' with the
  * openflow in_port, and 'ipfix', 'sflow', and 'netflow' with the appropriate
- * handles for those protocols if they're enabled.  Caller is responsible for
- * unrefing them.
+ * handles for those protocols if they're enabled.  Caller may use the returned
+ * pointers until quiescing, for longer term use additional references must
+ * be taken.
  *
  * '*fp_in_port' is set to OFPP_NONE if 'flow''s in_port does not exist.
  *
@@ -999,15 +1000,15 @@ xlate_receive(const struct dpif_backer *backer, const struct flow *flow,
     }
 
     if (ipfix) {
-        *ipfix = dpif_ipfix_ref(xport->xbridge->ipfix);
+        *ipfix = xport->xbridge->ipfix;
     }
 
     if (sflow) {
-        *sflow = dpif_sflow_ref(xport->xbridge->sflow);
+        *sflow = xport->xbridge->sflow;
     }
 
     if (netflow) {
-        *netflow = netflow_ref(xport->xbridge->netflow);
+        *netflow = xport->xbridge->netflow;
     }
     return 0;
 }
-- 
1.7.10.4




More information about the dev mailing list