ofproto-dpif-upcall: Add memory usage stats.
authorEthan Jackson <ethan@nicira.com>
Thu, 21 Nov 2013 01:41:02 +0000 (17:41 -0800)
committerEthan Jackson <ethan@nicira.com>
Fri, 13 Dec 2013 04:21:11 +0000 (20:21 -0800)
Signed-off-by: Ethan Jackson <ethan@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
ofproto/ofproto-dpif-upcall.c
ofproto/ofproto-dpif-upcall.h
ofproto/ofproto-dpif.c
ofproto/ofproto-provider.h
ofproto/ofproto.c
ofproto/ofproto.h
vswitchd/bridge.c

index 65fb236..ca39f1f 100644 (file)
@@ -265,6 +265,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", udpif->n_handlers);
+    for (i = 0; i < udpif->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)
index da75719..805530b 100644 (file)
@@ -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);
 \f
 /* 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
index 6af4974..11484cb 100644 (file)
@@ -1545,6 +1545,17 @@ get_memory_usage(const struct ofproto *ofproto_, struct simap *usage)
     simap_increase(usage, "subfacets", n_subfacets);
 }
 
+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_)
 {
@@ -6146,6 +6157,7 @@ const struct ofproto_class ofproto_dpif_class = {
     run,
     wait,
     get_memory_usage,
+    type_get_memory_usage,
     flush,
     get_features,
     get_tables,
index 713af87..cc1967f 100644 (file)
@@ -783,6 +783,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
index 8fc9916..6d25dab 100644 (file)
@@ -1619,6 +1619,19 @@ ofproto_get_memory_usage(const struct ofproto *ofproto, struct simap *usage)
     connmgr_get_memory_usage(ofproto->connmgr, 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 && 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)
index 63ae793..219940a 100644 (file)
@@ -177,6 +177,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.
  *
index e337ab5..3e16134 100644 (file)
@@ -2453,6 +2453,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);