diff options
author | Ben Pfaff <blp@nicira.com> | 2011-04-05 15:58:06 -0700 |
---|---|---|
committer | Ben Pfaff <blp@nicira.com> | 2011-04-29 14:31:59 -0700 |
commit | 7126d93814da306e4f1a7ce7ff3e91eb3fb3a64c (patch) | |
tree | 366732f04192db36d389ca18250d33a195bf4656 | |
parent | 101c55a1af7998a009a5c88c20e30837bc1a9765 (diff) | |
download | openvswitch-7126d93814da306e4f1a7ce7ff3e91eb3fb3a64c.tar.gz |
ofproto: Avoid memory leak in classifier on destruction.
ofproto_flush_flows() flushes the flow table but then it reintroduces flows
required by fail-open or in-band. These are then leaked when the
classifier is destroyed a little later.
This fixes the problem by not reintroducing these flows when ofproto is
being destroyed.
-rw-r--r-- | ofproto/ofproto.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c index ebdbc682f..652ded056 100644 --- a/ofproto/ofproto.c +++ b/ofproto/ofproto.c @@ -325,6 +325,7 @@ static const struct ofhooks default_ofhooks; static uint64_t pick_datapath_id(const struct ofproto *); static uint64_t pick_fallback_dpid(void); +static void ofproto_flush_flows__(struct ofproto *); static int ofproto_expire(struct ofproto *); static void flow_push_stats(struct ofproto *, const struct rule *, struct flow *, uint64_t packets, uint64_t bytes, @@ -690,7 +691,7 @@ ofproto_destroy(struct ofproto *p) shash_find_and_delete(&all_ofprotos, dpif_name(p->dpif)); - ofproto_flush_flows(p); + ofproto_flush_flows__(p); connmgr_destroy(p->connmgr); classifier_destroy(&p->cls); hmap_destroy(&p->facets); @@ -999,8 +1000,8 @@ ofproto_delete_flow(struct ofproto *ofproto, const struct cls_rule *target) } } -void -ofproto_flush_flows(struct ofproto *ofproto) +static void +ofproto_flush_flows__(struct ofproto *ofproto) { struct facet *facet, *next_facet; struct rule *rule, *next_rule; @@ -1025,6 +1026,12 @@ ofproto_flush_flows(struct ofproto *ofproto) } dpif_flow_flush(ofproto->dpif); +} + +void +ofproto_flush_flows(struct ofproto *ofproto) +{ + ofproto_flush_flows__(ofproto); connmgr_flushed(ofproto->connmgr); } |