Use ovs_refcount_unref_relaxed.
authorJarno Rajahalme <jrajahalme@nicira.com>
Mon, 7 Jul 2014 20:18:46 +0000 (13:18 -0700)
committerJarno Rajahalme <jrajahalme@nicira.com>
Mon, 7 Jul 2014 20:22:57 +0000 (13:22 -0700)
After a quick analysis, in most cases the access to refcounted objects
is clearly protected either with an explicit lock/mutex, or RCU. there
are only a few places where I left a call to ovs_refcount_unref().
Upon closer analysis it may well be that those could also use the
relaxed form.

Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
lib/bfd.c
lib/cfm.c
lib/dpif-netdev.c
lib/lacp.c
lib/mcast-snooping.c
lib/stp.c
ofproto/bond.c
ofproto/netflow.c
ofproto/ofproto-dpif-ipfix.c
ofproto/ofproto-dpif-sflow.c
ofproto/ofproto.c

index 4cbe999..892dfe8 100644 (file)
--- a/lib/bfd.c
+++ b/lib/bfd.c
@@ -493,7 +493,7 @@ bfd_ref(const struct bfd *bfd_)
 void
 bfd_unref(struct bfd *bfd) OVS_EXCLUDED(mutex)
 {
-    if (bfd && ovs_refcount_unref(&bfd->ref_cnt) == 1) {
+    if (bfd && ovs_refcount_unref_relaxed(&bfd->ref_cnt) == 1) {
         ovs_mutex_lock(&mutex);
         bfd_status_changed(bfd);
         hmap_remove(all_bfds, &bfd->node);
index 447a095..7784369 100644 (file)
--- a/lib/cfm.c
+++ b/lib/cfm.c
@@ -374,7 +374,7 @@ cfm_unref(struct cfm *cfm) OVS_EXCLUDED(mutex)
         return;
     }
 
-    if (ovs_refcount_unref(&cfm->ref_cnt) != 1) {
+    if (ovs_refcount_unref_relaxed(&cfm->ref_cnt) != 1) {
         return;
     }
 
index 0b5a808..b6d6b2e 100644 (file)
@@ -605,7 +605,7 @@ dp_netdev_unref(struct dp_netdev *dp)
         /* Take dp_netdev_mutex so that, if dp->ref_cnt falls to zero, we can't
          * get a new reference to 'dp' through the 'dp_netdevs' shash. */
         ovs_mutex_lock(&dp_netdev_mutex);
-        if (ovs_refcount_unref(&dp->ref_cnt) == 1) {
+        if (ovs_refcount_unref_relaxed(&dp->ref_cnt) == 1) {
             dp_netdev_free(dp);
         }
         ovs_mutex_unlock(&dp_netdev_mutex);
@@ -627,7 +627,7 @@ dpif_netdev_destroy(struct dpif *dpif)
     struct dp_netdev *dp = get_dp_netdev(dpif);
 
     if (!atomic_flag_test_and_set(&dp->destroyed)) {
-        if (ovs_refcount_unref(&dp->ref_cnt) == 1) {
+        if (ovs_refcount_unref_relaxed(&dp->ref_cnt) == 1) {
             /* Can't happen: 'dpif' still owns a reference to 'dp'. */
             OVS_NOT_REACHED();
         }
@@ -859,7 +859,7 @@ port_destroy__(struct dp_netdev_port *port)
 static void
 port_unref(struct dp_netdev_port *port)
 {
-    if (port && ovs_refcount_unref(&port->ref_cnt) == 1) {
+    if (port && ovs_refcount_unref_relaxed(&port->ref_cnt) == 1) {
         ovsrcu_postpone(port_destroy__, port);
     }
 }
index 0d30e51..3b50d46 100644 (file)
@@ -251,7 +251,7 @@ lacp_ref(const struct lacp *lacp_)
 void
 lacp_unref(struct lacp *lacp) OVS_EXCLUDED(mutex)
 {
-    if (lacp && ovs_refcount_unref(&lacp->ref_cnt) == 1) {
+    if (lacp && ovs_refcount_unref_relaxed(&lacp->ref_cnt) == 1) {
         struct slave *slave, *next;
 
         lacp_lock();
index 96639fe..8651445 100644 (file)
@@ -186,7 +186,7 @@ mcast_snooping_unref(struct mcast_snooping *ms)
         return;
     }
 
-    if (ovs_refcount_unref(&ms->ref_cnt) == 1) {
+    if (ovs_refcount_unref_relaxed(&ms->ref_cnt) == 1) {
         mcast_snooping_flush(ms);
         hmap_destroy(&ms->table);
         ovs_rwlock_destroy(&ms->rwlock);
index dbe48e8..218eb9a 100644 (file)
--- a/lib/stp.c
+++ b/lib/stp.c
@@ -327,7 +327,7 @@ stp_ref(const struct stp *stp_)
 void
 stp_unref(struct stp *stp)
 {
-    if (stp && ovs_refcount_unref(&stp->ref_cnt) == 1) {
+    if (stp && ovs_refcount_unref_relaxed(&stp->ref_cnt) == 1) {
         ovs_mutex_lock(&mutex);
         list_remove(&stp->node);
         ovs_mutex_unlock(&mutex);
index d2b0e73..2d04b43 100644 (file)
@@ -256,7 +256,7 @@ bond_unref(struct bond *bond)
     struct bond_slave *slave, *next_slave;
     struct bond_pr_rule_op *pr_op, *next_op;
 
-    if (!bond || ovs_refcount_unref(&bond->ref_cnt) != 1) {
+    if (!bond || ovs_refcount_unref_relaxed(&bond->ref_cnt) != 1) {
         return;
     }
 
index c0859ea..b3678ca 100644 (file)
@@ -409,7 +409,7 @@ netflow_ref(const struct netflow *nf_)
 void
 netflow_unref(struct netflow *nf)
 {
-    if (nf && ovs_refcount_unref(&nf->ref_cnt) == 1) {
+    if (nf && ovs_refcount_unref_relaxed(&nf->ref_cnt) == 1) {
         int orig;
 
         atomic_sub(&netflow_count, 1, &orig);
index 08a3fca..1584c25 100644 (file)
@@ -694,7 +694,7 @@ dpif_ipfix_clear(struct dpif_ipfix *di) OVS_REQUIRES(mutex)
 void
 dpif_ipfix_unref(struct dpif_ipfix *di) OVS_EXCLUDED(mutex)
 {
-    if (di && ovs_refcount_unref(&di->ref_cnt) == 1) {
+    if (di && ovs_refcount_unref_relaxed(&di->ref_cnt) == 1) {
         ovs_mutex_lock(&mutex);
         dpif_ipfix_clear(di);
         dpif_ipfix_bridge_exporter_destroy(&di->bridge_exporter);
index cb1f830..c7e092a 100644 (file)
@@ -361,7 +361,7 @@ dpif_sflow_get_probability(const struct dpif_sflow *ds) OVS_EXCLUDED(mutex)
 void
 dpif_sflow_unref(struct dpif_sflow *ds) OVS_EXCLUDED(mutex)
 {
-    if (ds && ovs_refcount_unref(&ds->ref_cnt) == 1) {
+    if (ds && ovs_refcount_unref_relaxed(&ds->ref_cnt) == 1) {
         struct dpif_sflow_port *dsp, *next;
 
         route_table_unregister();
index 5399c9f..d18f739 100644 (file)
@@ -2545,7 +2545,7 @@ ofproto_rule_ref(struct rule *rule)
 void
 ofproto_rule_unref(struct rule *rule)
 {
-    if (rule && ovs_refcount_unref(&rule->ref_count) == 1) {
+    if (rule && ovs_refcount_unref_relaxed(&rule->ref_count) == 1) {
         ovsrcu_postpone(rule_destroy_cb, rule);
     }
 }