From: Ethan Jackson Date: Tue, 18 Jun 2013 23:48:31 +0000 (-0700) Subject: bond: Reference count 'struct bond'. X-Git-Tag: sliver-openvswitch-1.10.90-3~6^2~34 X-Git-Url: http://git.onelab.eu/?p=sliver-openvswitch.git;a=commitdiff_plain;h=03366a2d585a6917d7d94c79073e1e615d8d8025 bond: Reference count 'struct bond'. Signed-off-by: Ethan Jackson Acked-by: Ben Pfaff --- diff --git a/lib/bond.c b/lib/bond.c index 68ac06889..11363152d 100644 --- a/lib/bond.c +++ b/lib/bond.c @@ -108,6 +108,8 @@ struct bond { * where we can't otherwise provide revalidation feedback to the client. * That's only unixctl commands now; I hope no other cases will arise. */ struct tag_set unixctl_tags; + + int ref_cnt; }; static struct hmap all_bonds = HMAP_INITIALIZER(&all_bonds); @@ -179,6 +181,7 @@ bond_create(const struct bond_settings *s) hmap_init(&bond->slaves); bond->no_slaves_tag = tag_create_random(); bond->next_fake_iface_update = LLONG_MAX; + bond->ref_cnt = 1; bond_reconfigure(bond, s); @@ -187,9 +190,19 @@ bond_create(const struct bond_settings *s) return bond; } +struct bond * +bond_ref(const struct bond *bond_) +{ + struct bond *bond = CONST_CAST(struct bond *, bond_); + + ovs_assert(bond->ref_cnt > 0); + bond->ref_cnt++; + return bond; +} + /* Frees 'bond'. */ void -bond_destroy(struct bond *bond) +bond_unref(struct bond *bond) { struct bond_slave *slave, *next_slave; @@ -197,6 +210,11 @@ bond_destroy(struct bond *bond) return; } + ovs_assert(bond->ref_cnt > 0); + if (--bond->ref_cnt) { + return; + } + hmap_remove(&all_bonds, &bond->hmap_node); HMAP_FOR_EACH_SAFE (slave, next_slave, hmap_node, &bond->slaves) { diff --git a/lib/bond.h b/lib/bond.h index 306cf42b7..719093524 100644 --- a/lib/bond.h +++ b/lib/bond.h @@ -61,7 +61,8 @@ void bond_init(void); /* Basics. */ struct bond *bond_create(const struct bond_settings *); -void bond_destroy(struct bond *); +void bond_unref(struct bond *); +struct bond *bond_ref(const struct bond *); bool bond_reconfigure(struct bond *, const struct bond_settings *); void bond_slave_register(struct bond *, void *slave_, struct netdev *); diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index a48da130c..87b44f25c 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -2246,7 +2246,7 @@ bundle_destroy(struct ofbundle *bundle) free(bundle->name); free(bundle->trunks); lacp_unref(bundle->lacp); - bond_destroy(bundle->bond); + bond_unref(bundle->bond); free(bundle); } @@ -2420,7 +2420,7 @@ bundle_set(struct ofproto *ofproto_, void *aux, bond_slave_register(bundle->bond, port, port->up.netdev); } } else { - bond_destroy(bundle->bond); + bond_unref(bundle->bond); bundle->bond = NULL; } @@ -2444,7 +2444,7 @@ bundle_remove(struct ofport *port_) if (list_is_empty(&bundle->ports)) { bundle_destroy(bundle); } else if (list_is_short(&bundle->ports)) { - bond_destroy(bundle->bond); + bond_unref(bundle->bond); bundle->bond = NULL; } }