[ovs-dev] [threaded-put 17/21] ofproto-dpif-upcall: Add memory usage stats.
Ethan Jackson
ethan at nicira.com
Mon Dec 9 02:45:23 UTC 2013
Signed-off-by: Ethan Jackson <ethan at nicira.com>
---
ofproto/ofproto-dpif-upcall.c | 17 +++++++++++++++++
ofproto/ofproto-dpif-upcall.h | 2 ++
ofproto/ofproto-dpif.c | 12 ++++++++++++
ofproto/ofproto-provider.h | 6 ++++++
ofproto/ofproto.c | 13 +++++++++++++
ofproto/ofproto.h | 1 +
vswitchd/bridge.c | 9 +++++++++
7 files changed, 60 insertions(+)
diff --git a/ofproto/ofproto-dpif-upcall.c b/ofproto/ofproto-dpif-upcall.c
index 8a32c00..08b4e8e 100644
--- a/ofproto/ofproto-dpif-upcall.c
+++ b/ofproto/ofproto-dpif-upcall.c
@@ -262,6 +262,23 @@ udpif_revalidate(struct udpif *udpif)
udpif_drop_key_clear(udpif);
}
+void
+udpif_get_memory_usage(struct udpif *udpif, struct simap *usage)
+{
+ size_t i;
+
+ simap_increase(usage, "dispatchers", 1);
+ simap_increase(usage, "flow_dumpers", 1);
+
+ simap_increase(usage, "handlers", n_handlers);
+ for (i = 0; i < n_handlers; i++) {
+ struct handler *handler = &udpif->handlers[i];
+ ovs_mutex_lock(&handler->mutex);
+ simap_increase(usage, "handler upcalls", handler->n_upcalls);
+ ovs_mutex_unlock(&handler->mutex);
+ }
+}
+
/* Destroys and deallocates 'upcall'. */
static void
upcall_destroy(struct upcall *upcall)
diff --git a/ofproto/ofproto-dpif-upcall.h b/ofproto/ofproto-dpif-upcall.h
index 3ff3e4b..a4d8228 100644
--- a/ofproto/ofproto-dpif-upcall.h
+++ b/ofproto/ofproto-dpif-upcall.h
@@ -39,6 +39,8 @@ void udpif_destroy(struct udpif *);
void udpif_wait(struct udpif *);
void udpif_revalidate(struct udpif *);
+
+void udpif_get_memory_usage(struct udpif *, struct simap *usage);
/* udpif figures out how to forward packets, and does forward them, but it
* can't set up datapath flows on its own. This interface passes packet
diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
index e3fbbe8..2659a5b 100644
--- a/ofproto/ofproto-dpif.c
+++ b/ofproto/ofproto-dpif.c
@@ -1524,6 +1524,17 @@ get_memory_usage(const struct ofproto *ofproto_, struct simap *usage)
}
static void
+type_get_memory_usage(const char *type, struct simap *usage)
+{
+ struct dpif_backer *backer;
+
+ backer = shash_find_data(&all_dpif_backers, type);
+ if (backer) {
+ udpif_get_memory_usage(backer->udpif, usage);
+ }
+}
+
+static void
flush(struct ofproto *ofproto_)
{
struct ofproto_dpif *ofproto = ofproto_dpif_cast(ofproto_);
@@ -6101,6 +6112,7 @@ const struct ofproto_class ofproto_dpif_class = {
run,
wait,
get_memory_usage,
+ type_get_memory_usage,
flush,
get_features,
get_tables,
diff --git a/ofproto/ofproto-provider.h b/ofproto/ofproto-provider.h
index f0e10cf..bdd6b42 100644
--- a/ofproto/ofproto-provider.h
+++ b/ofproto/ofproto-provider.h
@@ -781,6 +781,12 @@ struct ofproto_class {
void (*get_memory_usage)(const struct ofproto *ofproto,
struct simap *usage);
+ /* Adds some memory usage statistics for the implementation of 'type'
+ * into 'usage', for use with memory_report().
+ *
+ * This function is optional. */
+ void (*type_get_memory_usage)(const char *type, struct simap *usage);
+
/* Every "struct rule" in 'ofproto' is about to be deleted, one by one.
* This function may prepare for that, for example by clearing state in
* advance. It should *not* actually delete any "struct rule"s from
diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c
index 48feff7..ba40406 100644
--- a/ofproto/ofproto.c
+++ b/ofproto/ofproto.c
@@ -1593,6 +1593,19 @@ ofproto_get_memory_usage(const struct ofproto *ofproto, struct simap *usage)
}
void
+ofproto_type_get_memory_usage(const char *datapath_type, struct simap *usage)
+{
+ const struct ofproto_class *class;
+
+ datapath_type = ofproto_normalize_type(datapath_type);
+ class = ofproto_class_find__(datapath_type);
+
+ if (class->type_get_memory_usage) {
+ class->type_get_memory_usage(datapath_type, usage);
+ }
+}
+
+void
ofproto_get_ofproto_controller_info(const struct ofproto *ofproto,
struct shash *info)
{
diff --git a/ofproto/ofproto.h b/ofproto/ofproto.h
index 0b53a5f..8d599f0 100644
--- a/ofproto/ofproto.h
+++ b/ofproto/ofproto.h
@@ -171,6 +171,7 @@ void ofproto_wait(struct ofproto *);
bool ofproto_is_alive(const struct ofproto *);
void ofproto_get_memory_usage(const struct ofproto *, struct simap *);
+void ofproto_type_get_memory_usage(const char *datapath_type, struct simap *);
/* A port within an OpenFlow switch.
*
diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
index 8fec72e..c3f1488 100644
--- a/vswitchd/bridge.c
+++ b/vswitchd/bridge.c
@@ -2522,6 +2522,15 @@ void
bridge_get_memory_usage(struct simap *usage)
{
struct bridge *br;
+ struct sset types;
+ const char *type;
+
+ sset_init(&types);
+ ofproto_enumerate_types(&types);
+ SSET_FOR_EACH (type, &types) {
+ ofproto_type_get_memory_usage(type, usage);
+ }
+ sset_destroy(&types);
HMAP_FOR_EACH (br, node, &all_bridges) {
ofproto_get_memory_usage(br->ofproto, usage);
--
1.8.1.2
More information about the dev
mailing list