Similar to if-status-mgr, track memory allocated for local_datapath.
Signed-off-by: Lorenzo Bianconi <[email protected]>
---
controller/binding.c | 3 +++
controller/local_data.c | 50 +++++++++++++++++++++++++++++++++++++
controller/local_data.h | 3 +++
controller/ovn-controller.c | 1 +
4 files changed, 57 insertions(+)
diff --git a/controller/binding.c b/controller/binding.c
index c037b2352..661b4bb24 100644
--- a/controller/binding.c
+++ b/controller/binding.c
@@ -374,6 +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) {
+ local_datapath_ext_port_mem_update(ld, binding_rec->logical_port,
+ false);
shash_replace(&ld->external_ports, binding_rec->logical_port,
binding_rec);
}
@@ -1756,6 +1758,7 @@ remove_pb_from_local_datapath(const struct
sbrec_port_binding *pb,
ld->localnet_port = NULL;
}
} else if (!strcmp(pb->type, "external")) {
+ local_datapath_ext_port_mem_update(ld, pb->logical_port, true);
shash_find_and_delete(&ld->external_ports, pb->logical_port);
}
}
diff --git a/controller/local_data.c b/controller/local_data.c
index 6efed2de0..33e418b8f 100644
--- a/controller/local_data.c
+++ b/controller/local_data.c
@@ -47,6 +47,30 @@ static struct tracked_datapath *tracked_datapath_create(
enum en_tracked_resource_type tracked_type,
struct hmap *tracked_datapaths);
+static uint64_t local_datapath_usage;
+
+static void
+local_datapath_peer_ports_mem_add(struct local_datapath *ld,
+ size_t n_peer_ports)
+{
+ /* memory accounting - peer_ports. */
+ local_datapath_usage +=
+ (ld->n_allocated_peer_ports - n_peer_ports) * sizeof *ld->peer_ports;
+}
+
+void
+local_datapath_ext_port_mem_update(struct local_datapath *ld, const char *name,
+ bool erase)
+{
+ struct shash_node *node = shash_find(&ld->external_ports, name);
+
+ if (!node && !erase) { /* add a new element */
+ local_datapath_usage += (sizeof *node + strlen(name));
+ } else if (node && erase) { /* remove an element */
+ local_datapath_usage -= (sizeof *node + strlen(name));
+ }
+}
+
struct local_datapath *
get_local_datapath(const struct hmap *local_datapaths, uint32_t tunnel_key)
{
@@ -63,6 +87,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 +107,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);
@@ -175,10 +212,12 @@ add_local_datapath_peer_port(
if (!present) {
ld->n_peer_ports++;
if (ld->n_peer_ports > ld->n_allocated_peer_ports) {
+ size_t n_peer_ports = ld->n_allocated_peer_ports;
ld->peer_ports =
x2nrealloc(ld->peer_ports,
&ld->n_allocated_peer_ports,
sizeof *ld->peer_ports);
+ local_datapath_peer_ports_mem_add(ld, n_peer_ports);
}
ld->peer_ports[ld->n_peer_ports - 1].local = pb;
ld->peer_ports[ld->n_peer_ports - 1].remote = peer;
@@ -204,10 +243,12 @@ add_local_datapath_peer_port(
peer_ld->n_peer_ports++;
if (peer_ld->n_peer_ports > peer_ld->n_allocated_peer_ports) {
+ size_t 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);
+ local_datapath_peer_ports_mem_add(peer_ld, n_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;
@@ -537,10 +578,12 @@ add_local_datapath__(struct ovsdb_idl_index
*sbrec_datapath_binding_by_key,
}
ld->n_peer_ports++;
if (ld->n_peer_ports > ld->n_allocated_peer_ports) {
+ size_t n_peer_ports = ld->n_allocated_peer_ports;
ld->peer_ports =
x2nrealloc(ld->peer_ports,
&ld->n_allocated_peer_ports,
sizeof *ld->peer_ports);
+ local_datapath_peer_ports_mem_add(ld, n_peer_ports);
}
ld->peer_ports[ld->n_peer_ports - 1].local = pb;
ld->peer_ports[ld->n_peer_ports - 1].remote = peer;
@@ -563,3 +606,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 f6317e9ca..e990b3659 100644
--- a/controller/local_data.h
+++ b/controller/local_data.h
@@ -154,5 +154,8 @@ 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 local_datapath_ext_port_mem_update(struct local_datapath *ld,
+ const char *name, bool erase);
#endif /* controller/local_data.h */
diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c
index e80e17ed7..184ac7b00 100644
--- a/controller/ovn-controller.c
+++ b/controller/ovn-controller.c
@@ -3463,6 +3463,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