Introduce memory accounting for: - binding local_lports map - binding related_lports map
Signed-off-by: Lorenzo Bianconi <[email protected]> --- controller/binding.c | 59 +++++++++++++++++++++++++++++++++++++ controller/binding.h | 5 ++++ controller/ovn-controller.c | 5 ++-- 3 files changed, 67 insertions(+), 2 deletions(-) diff --git a/controller/binding.c b/controller/binding.c index 661b4bb24..ec1e8bec7 100644 --- a/controller/binding.c +++ b/controller/binding.c @@ -39,6 +39,31 @@ VLOG_DEFINE_THIS_MODULE(binding); +static uint64_t local_lports_usage; +static uint64_t related_lports_usage; + +static void +sset_mem_update(uint64_t *usage, struct sset *set, + const char *name, bool erase) +{ + struct sset_node *node = sset_find(set, name); + + if (!node && !erase) { /* add new element */ + *usage += (sizeof *node + strlen(name)); + } else if (node && erase) { /* remove an element */ + *usage -= (sizeof *node + strlen(name)); + } +} + +static void +sset_mem_clear(struct sset *set, uint64_t *usage) +{ + const char *name; + SSET_FOR_EACH (name, set) { + sset_mem_update(usage, set, name, true); + } +} + /* External ID to be set in the OVS.Interface record when the OVS interface * is ready for use, i.e., is bound to an OVN port and its corresponding * flows have been installed. @@ -422,6 +447,8 @@ update_ld_localnet_port(const struct sbrec_port_binding *binding_rec, static void update_local_lports(const char *iface_id, struct binding_ctx_out *b_ctx) { + sset_mem_update(&local_lports_usage, b_ctx->local_lports, + iface_id, false); if (sset_add(b_ctx->local_lports, iface_id) != NULL) { b_ctx->local_lports_changed = true; } @@ -433,11 +460,20 @@ update_local_lports(const char *iface_id, struct binding_ctx_out *b_ctx) static void remove_local_lports(const char *iface_id, struct binding_ctx_out *b_ctx) { + sset_mem_update(&local_lports_usage, b_ctx->local_lports, + iface_id, true); if (sset_find_and_delete(b_ctx->local_lports, iface_id)) { b_ctx->local_lports_changed = true; } } +void +destroy_local_lports(struct sset *set) +{ + sset_mem_clear(set, &local_lports_usage); + sset_destroy(set); +} + /* Add a port binding to the set of locally relevant lports. * Also track if the set has changed. */ @@ -448,6 +484,8 @@ update_related_lport(const struct sbrec_port_binding *pb, char buf[16]; get_unique_lport_key(pb->datapath->tunnel_key, pb->tunnel_key, buf, sizeof(buf)); + sset_mem_update(&related_lports_usage, + &b_ctx->related_lports->lport_ids, buf, false); if (sset_add(&b_ctx->related_lports->lport_ids, buf) != NULL) { b_ctx->related_lports_changed = true; @@ -457,6 +495,9 @@ update_related_lport(const struct sbrec_port_binding *pb, b_ctx->tracked_dp_bindings); } } + sset_mem_update(&related_lports_usage, + &b_ctx->related_lports->lport_names, + pb->logical_port, false); sset_add(&b_ctx->related_lports->lport_names, pb->logical_port); } @@ -470,8 +511,14 @@ remove_related_lport(const struct sbrec_port_binding *pb, char buf[16]; get_unique_lport_key(pb->datapath->tunnel_key, pb->tunnel_key, buf, sizeof(buf)); + sset_mem_update(&related_lports_usage, + &b_ctx->related_lports->lport_names, + pb->logical_port, true); sset_find_and_delete(&b_ctx->related_lports->lport_names, pb->logical_port); + + sset_mem_update(&related_lports_usage, + &b_ctx->related_lports->lport_ids, buf, true); if (sset_find_and_delete(&b_ctx->related_lports->lport_ids, buf)) { b_ctx->related_lports_changed = true; @@ -617,6 +664,9 @@ related_lports_init(struct related_lports *rp) void related_lports_destroy(struct related_lports *rp) { + sset_mem_clear(&rp->lport_names, &related_lports_usage); + sset_mem_clear(&rp->lport_ids, &related_lports_usage); + sset_destroy(&rp->lport_names); sset_destroy(&rp->lport_ids); } @@ -2895,3 +2945,12 @@ ovs_iface_matches_lport_iface_id_ver(const struct ovsrec_interface *iface, return true; } + +void +binding_memory_usage(struct simap *usage) +{ + simap_increase(usage, "local_lports_usage-KB", + ROUND_UP(local_lports_usage, 1024) / 1024); + simap_increase(usage, "related_lports_usage-KB", + ROUND_UP(related_lports_usage, 1024) / 1024); +} diff --git a/controller/binding.h b/controller/binding.h index 70cc37c78..9042f4178 100644 --- a/controller/binding.h +++ b/controller/binding.h @@ -39,6 +39,7 @@ struct sset; struct sbrec_port_binding; struct ds; struct if_status_mgr; +struct simap; struct binding_ctx_in { struct ovsdb_idl_txn *ovnsb_idl_txn; @@ -70,6 +71,8 @@ struct related_lports { void related_lports_init(struct related_lports *); void related_lports_destroy(struct related_lports *); +void destroy_local_lports(struct sset *set); + struct binding_ctx_out { struct hmap *local_datapaths; struct shash *local_active_ports_ipv6_pd; @@ -139,6 +142,8 @@ void binding_tracked_dp_destroy(struct hmap *tracked_datapaths); void binding_dump_local_bindings(struct local_binding_data *, struct ds *); +void binding_memory_usage(struct simap *usage); + /* Corresponds to each Port_Binding.type. */ enum en_lport_type { LP_UNKNOWN, diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c index 184ac7b00..f0191e563 100644 --- a/controller/ovn-controller.c +++ b/controller/ovn-controller.c @@ -1171,7 +1171,7 @@ en_runtime_data_cleanup(void *data) { struct ed_type_runtime_data *rt_data = data; - sset_destroy(&rt_data->local_lports); + destroy_local_lports(&rt_data->local_lports); related_lports_destroy(&rt_data->related_lports); sset_destroy(&rt_data->active_tunnels); sset_destroy(&rt_data->egress_ifaces); @@ -1292,7 +1292,7 @@ en_runtime_data_run(struct engine_node *node, void *data) shash_clear_free_data(local_active_ipv6_pd); shash_clear_free_data(local_active_ras); local_binding_data_destroy(&rt_data->lbinding_data); - sset_destroy(local_lports); + destroy_local_lports(local_lports); related_lports_destroy(&rt_data->related_lports); sset_destroy(active_tunnels); sset_destroy(&rt_data->egress_ifaces); @@ -3464,6 +3464,7 @@ main(int argc, char *argv[]) ofctrl_get_memory_usage(&usage); if_status_mgr_get_memory_usage(if_mgr, &usage); local_datapath_memory_usage(&usage); + binding_memory_usage(&usage); memory_report(&usage); simap_destroy(&usage); } -- 2.31.1 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
