[ovs-dev] [PATCH v2] Always use generic stats for devices (vports)

Pravin Shelar pshelar at nicira.com
Fri Sep 16 01:17:08 UTC 2011


	This is incremental to previous patch. It is fixed according to
comments from Jesse. It removes dipf_port->stat as aggregate stats are only
available at netdev layer. 

Signed-off-by: Pravin B Shelar <pshelar at nicira.com>

---
 include/openvswitch/datapath-protocol.h |   16 +++---
 lib/dpif-linux.c                        |   11 ----
 lib/dpif.c                              |    1 -
 lib/dpif.h                              |    1 -
 lib/netdev-linux.c                      |   96 ++++++++----------------------
 lib/netdev-linux.h                      |    7 --
 lib/netdev-vport.c                      |   39 +++++++++++++
 utilities/ovs-dpctl.c                   |   47 ++++++++++------
 8 files changed, 103 insertions(+), 115 deletions(-)

diff --git a/include/openvswitch/datapath-protocol.h b/include/openvswitch/datapath-protocol.h
index 5d765b1..3c79c0f 100644
--- a/include/openvswitch/datapath-protocol.h
+++ b/include/openvswitch/datapath-protocol.h
@@ -136,14 +136,14 @@ struct ovs_dp_stats {
 };
 
 struct ovs_vport_stats {
-    uint64_t   rx_packets;             /* total packets received       */
-    uint64_t   tx_packets;             /* total packets transmitted    */
-    uint64_t   rx_bytes;               /* total bytes received         */
-    uint64_t   tx_bytes;               /* total bytes transmitted      */
-    uint64_t   rx_errors;              /* bad packets received         */
-    uint64_t   tx_errors;              /* packet transmit problems     */
-    uint64_t   rx_dropped;             /* no space in linux buffers    */
-    uint64_t   tx_dropped;             /* no space available in linux  */
+    uint64_t   rx_packets;		/* total packets received       */
+    uint64_t   tx_packets;		/* total packets transmitted    */
+    uint64_t   rx_bytes;		/* total bytes received         */
+    uint64_t   tx_bytes;		/* total bytes transmitted      */
+    uint64_t   rx_errors;		/* bad packets received         */
+    uint64_t   tx_errors;		/* packet transmit problems     */
+    uint64_t   rx_dropped;		/* no space in linux buffers    */
+    uint64_t   tx_dropped;		/* no space available in linux  */
 };
 
 /* Logical ports. */
diff --git a/lib/dpif-linux.c b/lib/dpif-linux.c
index 3493f5a..3d081aa 100644
--- a/lib/dpif-linux.c
+++ b/lib/dpif-linux.c
@@ -463,12 +463,6 @@ dpif_linux_port_query__(const struct dpif *dpif, uint32_t port_no,
         dpif_port->name = xstrdup(reply.name);
         dpif_port->type = xstrdup(netdev_vport_get_netdev_type(&reply));
         dpif_port->port_no = reply.port_no;
-        if (reply.stats) {
-            netdev_stats_from_ovs_vport_stats(&dpif_port->stats,
-                                                reply.stats);
-        } else {
-            memset(&dpif_port->stats, 0xff, sizeof dpif_port->stats);
-        }
         ofpbuf_delete(buf);
     }
     return error;
@@ -564,11 +558,6 @@ dpif_linux_port_dump_next(const struct dpif *dpif OVS_UNUSED, void *state_,
     dpif_port->name = (char *) vport.name;
     dpif_port->type = (char *) netdev_vport_get_netdev_type(&vport);
     dpif_port->port_no = vport.port_no;
-    if (vport.stats) {
-        netdev_stats_from_ovs_vport_stats(&dpif_port->stats, vport.stats);
-    } else {
-        memset(&dpif_port->stats, 0xff, sizeof dpif_port->stats);
-    }
     return 0;
 }
 
diff --git a/lib/dpif.c b/lib/dpif.c
index 8cf7cfe..ad143c8 100644
--- a/lib/dpif.c
+++ b/lib/dpif.c
@@ -469,7 +469,6 @@ dpif_port_clone(struct dpif_port *dst, const struct dpif_port *src)
     dst->name = xstrdup(src->name);
     dst->type = xstrdup(src->type);
     dst->port_no = src->port_no;
-    dst->stats = src->stats;
 }
 
 /* Frees memory allocated to members of 'dpif_port'.
diff --git a/lib/dpif.h b/lib/dpif.h
index 1f35206..c01010d 100644
--- a/lib/dpif.h
+++ b/lib/dpif.h
@@ -72,7 +72,6 @@ struct dpif_port {
     char *name;                 /* Network device name, e.g. "eth0". */
     char *type;                 /* Network device type, e.g. "system". */
     uint32_t port_no;           /* Port number within datapath. */
-    struct netdev_stats stats;  /* Port statistics. */
 };
 void dpif_port_clone(struct dpif_port *, const struct dpif_port *);
 void dpif_port_destroy(struct dpif_port *);
diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c
index 70f6829..ee3c5f5 100644
--- a/lib/netdev-linux.c
+++ b/lib/netdev-linux.c
@@ -1252,7 +1252,7 @@ swap_uint64(uint64_t *a, uint64_t *b)
 }
 
 static void
-netdev_vport_stats(const struct netdev *netdev_,
+get_stats_via_vport(const struct netdev *netdev_,
                     struct netdev_stats *stats)
 {
     struct netdev_dev_linux *netdev_dev =
@@ -1264,7 +1264,7 @@ netdev_vport_stats(const struct netdev *netdev_,
 
         error = netdev_vport_get_stats(netdev_, stats);
         if (error) {
-            VLOG_WARN_RL(&rl, "%s: ovs get stats failed %d",
+            VLOG_WARN_RL(&rl, "%s: obtaining netdev stats via vport failed %d",
                          netdev_get_name(netdev_), error);
         }
         netdev_dev->have_vport_stats = !error;
@@ -1312,7 +1312,7 @@ netdev_linux_get_stats(const struct netdev *netdev_,
     struct netdev_stats dev_stats;
     int error;
 
-    netdev_vport_stats(netdev_, stats);
+    get_stats_via_vport(netdev_, stats);
 
     error = netdev_linux_sys_get_stats(netdev_, &dev_stats);
 
@@ -1360,7 +1360,7 @@ netdev_pseudo_get_stats(const struct netdev *netdev_,
     struct netdev_stats dev_stats;
     int error;
 
-    netdev_vport_stats(netdev_, stats);
+    get_stats_via_vport(netdev_, stats);
 
     error = netdev_linux_sys_get_stats(netdev_, &dev_stats);
     if (error) {
@@ -4034,76 +4034,32 @@ tc_calc_buffer(unsigned int Bps, int mtu, uint64_t burst_bytes)
     return tc_bytes_to_ticks(Bps, MAX(burst_bytes, min_burst));
 }
 
-/* Public utility functions. */
-
-#define COPY_NETDEV_STATS                                   \
-    dst->rx_packets = src->rx_packets;                      \
-    dst->tx_packets = src->tx_packets;                      \
-    dst->rx_bytes = src->rx_bytes;                          \
-    dst->tx_bytes = src->tx_bytes;                          \
-    dst->rx_errors = src->rx_errors;                        \
-    dst->tx_errors = src->tx_errors;                        \
-    dst->rx_dropped = src->rx_dropped;                      \
-    dst->tx_dropped = src->tx_dropped;                      \
-    dst->multicast = src->multicast;                        \
-    dst->collisions = src->collisions;                      \
-    dst->rx_length_errors = src->rx_length_errors;          \
-    dst->rx_over_errors = src->rx_over_errors;              \
-    dst->rx_crc_errors = src->rx_crc_errors;                \
-    dst->rx_frame_errors = src->rx_frame_errors;            \
-    dst->rx_fifo_errors = src->rx_fifo_errors;              \
-    dst->rx_missed_errors = src->rx_missed_errors;          \
-    dst->tx_aborted_errors = src->tx_aborted_errors;        \
-    dst->tx_carrier_errors = src->tx_carrier_errors;        \
-    dst->tx_fifo_errors = src->tx_fifo_errors;              \
-    dst->tx_heartbeat_errors = src->tx_heartbeat_errors;    \
-    dst->tx_window_errors = src->tx_window_errors
-
-#define COPY_OVS_STATS                                      \
-    dst->rx_packets = src->rx_packets;                      \
-    dst->tx_packets = src->tx_packets;                      \
-    dst->rx_bytes = src->rx_bytes;                          \
-    dst->tx_bytes = src->tx_bytes;                          \
-    dst->rx_errors = src->rx_errors;                        \
-    dst->tx_errors = src->tx_errors;                        \
-    dst->rx_dropped = src->rx_dropped;                      \
-    dst->tx_dropped = src->tx_dropped;
-
 /* Copies 'src' into 'dst', performing format conversion in the process. */
-void
+static void
 netdev_stats_from_rtnl_link_stats(struct netdev_stats *dst,
                                   const struct rtnl_link_stats *src)
 {
-    COPY_NETDEV_STATS;
-}
-
-/* Copies 'src' into 'dst', performing format conversion in the process. */
-void
-netdev_stats_from_ovs_vport_stats(struct netdev_stats *dst,
-                                  const struct ovs_vport_stats *src)
-{
-    COPY_OVS_STATS
-    dst->multicast = 0;
-    dst->collisions = 0;
-    dst->rx_length_errors = 0;
-    dst->rx_over_errors = 0;
-    dst->rx_crc_errors = 0;
-    dst->rx_frame_errors = 0;
-    dst->rx_fifo_errors = 0;
-    dst->rx_missed_errors = 0;
-    dst->tx_aborted_errors = 0;
-    dst->tx_carrier_errors = 0;
-    dst->tx_fifo_errors = 0;
-    dst->tx_heartbeat_errors = 0;
-    dst->tx_window_errors = 0;
-}
-
-/* Copies 'src' into 'dst', performing format conversion in the process. */
-void
-netdev_stats_to_ovs_vport_stats(struct ovs_vport_stats *dst,
-                                const struct netdev_stats *src)
-{
-    COPY_OVS_STATS
+    dst->rx_packets = src->rx_packets;
+    dst->tx_packets = src->tx_packets;
+    dst->rx_bytes = src->rx_bytes;
+    dst->tx_bytes = src->tx_bytes;
+    dst->rx_errors = src->rx_errors;
+    dst->tx_errors = src->tx_errors;
+    dst->rx_dropped = src->rx_dropped;
+    dst->tx_dropped = src->tx_dropped;
+    dst->multicast = src->multicast;
+    dst->collisions = src->collisions;
+    dst->rx_length_errors = src->rx_length_errors;
+    dst->rx_over_errors = src->rx_over_errors;
+    dst->rx_crc_errors = src->rx_crc_errors;
+    dst->rx_frame_errors = src->rx_frame_errors;
+    dst->rx_fifo_errors = src->rx_fifo_errors;
+    dst->rx_missed_errors = src->rx_missed_errors;
+    dst->tx_aborted_errors = src->tx_aborted_errors;
+    dst->tx_carrier_errors = src->tx_carrier_errors;
+    dst->tx_fifo_errors = src->tx_fifo_errors;
+    dst->tx_heartbeat_errors = src->tx_heartbeat_errors;
+    dst->tx_window_errors = src->tx_window_errors;
 }
 
 
diff --git a/lib/netdev-linux.h b/lib/netdev-linux.h
index 961f5ef..c00a846 100644
--- a/lib/netdev-linux.h
+++ b/lib/netdev-linux.h
@@ -28,13 +28,6 @@ struct netdev;
 struct netdev_stats;
 struct rtnl_link_stats;
 
-void netdev_stats_from_rtnl_link_stats(struct netdev_stats *dst,
-                                       const struct rtnl_link_stats *src);
-void netdev_stats_from_ovs_vport_stats(struct netdev_stats *dst,
-                                       const struct ovs_vport_stats *src);
-void netdev_stats_to_ovs_vport_stats(struct ovs_vport_stats *dst,
-                                     const struct netdev_stats *src);
-
 int netdev_linux_ethtool_set_flag(struct netdev *netdev, uint32_t flag,
                                   const char *flag_name, bool enable);
 
diff --git a/lib/netdev-vport.c b/lib/netdev-vport.c
index c60d490..c7fca55 100644
--- a/lib/netdev-vport.c
+++ b/lib/netdev-vport.c
@@ -375,6 +375,45 @@ netdev_vport_set_mtu(const struct netdev *netdev OVS_UNUSED,
     return EOPNOTSUPP;
 }
 
+#define COPY_OVS_STATS                                      \
+    dst->rx_packets = src->rx_packets;                      \
+    dst->tx_packets = src->tx_packets;                      \
+    dst->rx_bytes = src->rx_bytes;                          \
+    dst->tx_bytes = src->tx_bytes;                          \
+    dst->rx_errors = src->rx_errors;                        \
+    dst->tx_errors = src->tx_errors;                        \
+    dst->rx_dropped = src->rx_dropped;                      \
+    dst->tx_dropped = src->tx_dropped;
+
+/* Copies 'src' into 'dst', performing format conversion in the process. */
+static void
+netdev_stats_from_ovs_vport_stats(struct netdev_stats *dst,
+                                  const struct ovs_vport_stats *src)
+{
+    COPY_OVS_STATS
+    dst->multicast = 0;
+    dst->collisions = 0;
+    dst->rx_length_errors = 0;
+    dst->rx_over_errors = 0;
+    dst->rx_crc_errors = 0;
+    dst->rx_frame_errors = 0;
+    dst->rx_fifo_errors = 0;
+    dst->rx_missed_errors = 0;
+    dst->tx_aborted_errors = 0;
+    dst->tx_carrier_errors = 0;
+    dst->tx_fifo_errors = 0;
+    dst->tx_heartbeat_errors = 0;
+    dst->tx_window_errors = 0;
+}
+
+/* Copies 'src' into 'dst', performing format conversion in the process. */
+static void
+netdev_stats_to_ovs_vport_stats(struct ovs_vport_stats *dst,
+                                const struct netdev_stats *src)
+{
+    COPY_OVS_STATS
+}
+
 int
 netdev_vport_get_stats(const struct netdev *netdev, struct netdev_stats *stats)
 {
diff --git a/utilities/ovs-dpctl.c b/utilities/ovs-dpctl.c
index 0e6c16f..e724e74 100644
--- a/utilities/ovs-dpctl.c
+++ b/utilities/ovs-dpctl.c
@@ -367,6 +367,7 @@ show_dpif(struct dpif *dpif)
     struct dpif_port_dump dump;
     struct dpif_port dpif_port;
     struct ovs_dp_stats stats;
+    struct netdev *netdev;
 
     printf("%s:\n", dpif_name(dpif));
     if (!dpif_get_dp_stats(dpif, &stats)) {
@@ -381,7 +382,6 @@ show_dpif(struct dpif *dpif)
         printf("\tport %u: %s", dpif_port.port_no, dpif_port.name);
 
         if (strcmp(dpif_port.type, "system")) {
-            struct netdev *netdev;
             int error;
 
             printf (" (%s", dpif_port.type);
@@ -418,29 +418,42 @@ show_dpif(struct dpif *dpif)
         putchar('\n');
 
         if (print_statistics) {
-            const struct netdev_stats *s = &dpif_port.stats;
+            struct netdev_stats s;
+            int error;
+
+            error = netdev_open(dpif_port.name, dpif_port.type, &netdev);
+            if (error) {
+                printf(", open failed (%s)", strerror(error));
+                continue;
+            }
+            error = netdev_get_stats(netdev, &s);
+            if (error) {
+                printf(", could not retrieve stats (%s)", strerror(error));
+                continue;
+            }
 
-            print_stat("\t\tRX packets:", s->rx_packets);
-            print_stat(" errors:", s->rx_errors);
-            print_stat(" dropped:", s->rx_dropped);
-            print_stat(" overruns:", s->rx_over_errors);
-            print_stat(" frame:", s->rx_frame_errors);
+            netdev_close(netdev);
+            print_stat("\t\tRX packets:", s.rx_packets);
+            print_stat(" errors:", s.rx_errors);
+            print_stat(" dropped:", s.rx_dropped);
+            print_stat(" overruns:", s.rx_over_errors);
+            print_stat(" frame:", s.rx_frame_errors);
             printf("\n");
 
-            print_stat("\t\tTX packets:", s->tx_packets);
-            print_stat(" errors:", s->tx_errors);
-            print_stat(" dropped:", s->tx_dropped);
-            print_stat(" aborted:", s->tx_aborted_errors);
-            print_stat(" carrier:", s->tx_carrier_errors);
+            print_stat("\t\tTX packets:", s.tx_packets);
+            print_stat(" errors:", s.tx_errors);
+            print_stat(" dropped:", s.tx_dropped);
+            print_stat(" aborted:", s.tx_aborted_errors);
+            print_stat(" carrier:", s.tx_carrier_errors);
             printf("\n");
 
-            print_stat("\t\tcollisions:", s->collisions);
+            print_stat("\t\tcollisions:", s.collisions);
             printf("\n");
 
-            print_stat("\t\tRX bytes:", s->rx_bytes);
-            print_human_size(s->rx_bytes);
-            print_stat("  TX bytes:", s->tx_bytes);
-            print_human_size(s->tx_bytes);
+            print_stat("\t\tRX bytes:", s.rx_bytes);
+            print_human_size(s.rx_bytes);
+            print_stat("  TX bytes:", s.tx_bytes);
+            print_human_size(s.tx_bytes);
             printf("\n");
         }
     }
-- 
1.7.1




More information about the dev mailing list