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

Reply via email to