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