Similar to if-status-mgr, track memory allocated for local_datapath.

Signed-off-by: Lorenzo Bianconi <[email protected]>
---
Changes since v4:
- local_datapath_peer_port_add routine and remove duplicated code
- get rid of local_datapath_ext_port_mem_update and use open-coding instead
---
 controller/binding.c        |  6 +--
 controller/local_data.c     | 92 ++++++++++++++++++++++++++-----------
 controller/local_data.h     |  7 +++
 controller/ovn-controller.c |  1 +
 4 files changed, 76 insertions(+), 30 deletions(-)

diff --git a/controller/binding.c b/controller/binding.c
index 2fde7629c..fcd319e6d 100644
--- a/controller/binding.c
+++ b/controller/binding.c
@@ -374,8 +374,8 @@ update_ld_external_ports(const struct sbrec_port_binding 
*binding_rec,
     struct local_datapath *ld = get_local_datapath(
         local_datapaths, binding_rec->datapath->tunnel_key);
     if (ld) {
-        shash_replace(&ld->external_ports, binding_rec->logical_port,
-                      binding_rec);
+        add_local_datapath_external_port(ld, binding_rec->logical_port,
+                                         binding_rec);
     }
 }
 
@@ -1713,7 +1713,7 @@ remove_pb_from_local_datapath(const struct 
sbrec_port_binding *pb,
             ld->localnet_port = NULL;
         }
     } else if (!strcmp(pb->type, "external")) {
-        shash_find_and_delete(&ld->external_ports, pb->logical_port);
+        remove_local_datapath_external_port(ld, pb->logical_port);
     }
 }
 
diff --git a/controller/local_data.c b/controller/local_data.c
index 6efed2de0..251ed294f 100644
--- a/controller/local_data.c
+++ b/controller/local_data.c
@@ -47,6 +47,8 @@ static struct tracked_datapath *tracked_datapath_create(
     enum en_tracked_resource_type tracked_type,
     struct hmap *tracked_datapaths);
 
+static uint64_t local_datapath_usage;
+
 struct local_datapath *
 get_local_datapath(const struct hmap *local_datapaths, uint32_t tunnel_key)
 {
@@ -63,6 +65,9 @@ local_datapath_alloc(const struct sbrec_datapath_binding *dp)
     ld->datapath = dp;
     ld->is_switch = datapath_is_switch(dp);
     shash_init(&ld->external_ports);
+    /* memory accounting - common part. */
+    local_datapath_usage += sizeof *ld;
+
     return ld;
 }
 
@@ -80,6 +85,16 @@ local_datapaths_destroy(struct hmap *local_datapaths)
 void
 local_datapath_destroy(struct local_datapath *ld)
 {
+    /* memory accounting. */
+    struct shash_node *node;
+    SHASH_FOR_EACH (node, &ld->external_ports) {
+        local_datapath_usage -= strlen(node->name);
+    }
+    local_datapath_usage -= shash_count(&ld->external_ports) * sizeof *node;
+    local_datapath_usage -= sizeof *ld;
+    local_datapath_usage -=
+        ld->n_allocated_peer_ports * sizeof *ld->peer_ports;
+
     free(ld->peer_ports);
     shash_destroy(&ld->external_ports);
     free(ld);
@@ -146,6 +161,26 @@ add_local_datapath(struct ovsdb_idl_index 
*sbrec_datapath_binding_by_key,
                          tracked_datapaths);
 }
 
+static void
+local_datapath_peer_port_add(struct local_datapath *ld,
+                             const struct sbrec_port_binding *local,
+                             const struct sbrec_port_binding *remote)
+{
+    ld->n_peer_ports++;
+    if (ld->n_peer_ports > ld->n_allocated_peer_ports) {
+        size_t old_n_ports = ld->n_allocated_peer_ports;
+        ld->peer_ports =
+            x2nrealloc(ld->peer_ports,
+                       &ld->n_allocated_peer_ports,
+                       sizeof *ld->peer_ports);
+        local_datapath_usage +=
+            (ld->n_allocated_peer_ports - old_n_ports) *
+            sizeof *ld->peer_ports;
+    }
+    ld->peer_ports[ld->n_peer_ports - 1].local = local;
+    ld->peer_ports[ld->n_peer_ports - 1].remote = remote;
+}
+
 void
 add_local_datapath_peer_port(
     const struct sbrec_port_binding *pb,
@@ -173,15 +208,7 @@ add_local_datapath_peer_port(
     }
 
     if (!present) {
-        ld->n_peer_ports++;
-        if (ld->n_peer_ports > ld->n_allocated_peer_ports) {
-            ld->peer_ports =
-                x2nrealloc(ld->peer_ports,
-                           &ld->n_allocated_peer_ports,
-                           sizeof *ld->peer_ports);
-        }
-        ld->peer_ports[ld->n_peer_ports - 1].local = pb;
-        ld->peer_ports[ld->n_peer_ports - 1].remote = peer;
+        local_datapath_peer_port_add(ld, pb, peer);
     }
 
     struct local_datapath *peer_ld =
@@ -202,15 +229,7 @@ add_local_datapath_peer_port(
         }
     }
 
-    peer_ld->n_peer_ports++;
-    if (peer_ld->n_peer_ports > peer_ld->n_allocated_peer_ports) {
-        peer_ld->peer_ports =
-            x2nrealloc(peer_ld->peer_ports,
-                        &peer_ld->n_allocated_peer_ports,
-                        sizeof *peer_ld->peer_ports);
-    }
-    peer_ld->peer_ports[peer_ld->n_peer_ports - 1].local = peer;
-    peer_ld->peer_ports[peer_ld->n_peer_ports - 1].remote = pb;
+    local_datapath_peer_port_add(peer_ld, peer, pb);
 }
 
 void
@@ -248,6 +267,26 @@ remove_local_datapath_peer_port(const struct 
sbrec_port_binding *pb,
     }
 }
 
+void
+add_local_datapath_external_port(struct local_datapath *ld,
+                                 char *logical_port, const void *data)
+{
+    if (!shash_replace(&ld->external_ports, logical_port, data)) {
+        local_datapath_usage += sizeof(struct shash_node) +
+                                strlen(logical_port);
+    }
+}
+
+void
+remove_local_datapath_external_port(struct local_datapath *ld,
+                                    char *logical_port)
+{
+    if (shash_find_and_delete(&ld->external_ports, logical_port)) {
+        local_datapath_usage -= sizeof(struct shash_node) +
+                                strlen(logical_port);
+    }
+}
+
 /* track datapath functions. */
 struct tracked_datapath *
 tracked_datapath_add(const struct sbrec_datapath_binding *dp,
@@ -535,15 +574,7 @@ add_local_datapath__(struct ovsdb_idl_index 
*sbrec_datapath_binding_by_key,
                                              chassis, local_datapaths,
                                              tracked_datapaths);
                     }
-                    ld->n_peer_ports++;
-                    if (ld->n_peer_ports > ld->n_allocated_peer_ports) {
-                        ld->peer_ports =
-                            x2nrealloc(ld->peer_ports,
-                                       &ld->n_allocated_peer_ports,
-                                       sizeof *ld->peer_ports);
-                    }
-                    ld->peer_ports[ld->n_peer_ports - 1].local = pb;
-                    ld->peer_ports[ld->n_peer_ports - 1].remote = peer;
+                    local_datapath_peer_port_add(ld, pb, peer);
                 }
             }
         }
@@ -563,3 +594,10 @@ tracked_datapath_create(const struct 
sbrec_datapath_binding *dp,
     hmap_insert(tracked_datapaths, &t_dp->node, uuid_hash(&dp->header_.uuid));
     return t_dp;
 }
+
+void
+local_datapath_memory_usage(struct simap *usage)
+{
+    simap_increase(usage, "local_datapath_usage-KB",
+                   ROUND_UP(local_datapath_usage, 1024) / 1024);
+}
diff --git a/controller/local_data.h b/controller/local_data.h
index c790bc722..6e7253738 100644
--- a/controller/local_data.h
+++ b/controller/local_data.h
@@ -149,5 +149,12 @@ bool get_chassis_tunnel_ofport(const struct hmap 
*chassis_tunnels,
                                ofp_port_t *ofport);
 
 void chassis_tunnels_destroy(struct hmap *chassis_tunnels);
+void local_datapath_memory_usage(struct simap *usage);
+void
+add_local_datapath_external_port(struct local_datapath *ld,
+                                 char *logical_port, const void *data);
+void
+remove_local_datapath_external_port(struct local_datapath *ld,
+                                    char *logical_port);
 
 #endif /* controller/local_data.h */
diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c
index 92ba50d65..423d93555 100644
--- a/controller/ovn-controller.c
+++ b/controller/ovn-controller.c
@@ -3441,6 +3441,7 @@ main(int argc, char *argv[])
             lflow_cache_get_memory_usage(ctrl_engine_ctx.lflow_cache, &usage);
             ofctrl_get_memory_usage(&usage);
             if_status_mgr_get_memory_usage(if_mgr, &usage);
+            local_datapath_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