summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2016-08-16 15:55:04 +0200
committerThomas Haller <thaller@redhat.com>2016-08-17 16:08:21 +0200
commitfbbebc21230b707551b0bb7dc920368059644cdc (patch)
tree2f6f87a0b261d9343e7f3dcc1eef16d423eafa9f
parentc16e14c71c8cc34ac9550cb5e45469c42b9c352a (diff)
device: always expose device statistics information
Instead of updating the device-statistic counters only periodically as we refresh the link, update them on every link-changed event from platform. That means, also for devices that have RefreshRateMs at zero, the values will be updated at random times when the link information changes. The difference is, that previously the counters would be zero unless RefreshRateMs was set. Now, they have some (probably stale) values which however are not guaranteed to be kept up-to-date. Also, now we refresh more often then promised by RefreshRateMs. But the API technically doesn't specify that, so if we find there is a problem with this, we may revert it later.
-rw-r--r--introspection/nm-device-statistics.xml8
-rw-r--r--src/devices/nm-device.c55
2 files changed, 31 insertions, 32 deletions
diff --git a/introspection/nm-device-statistics.xml b/introspection/nm-device-statistics.xml
index 5d23bf3062..bdb19c89ce 100644
--- a/introspection/nm-device-statistics.xml
+++ b/introspection/nm-device-statistics.xml
@@ -5,10 +5,10 @@
<!--
RefreshRateMs:
- Rate of change of the rest of properties of this interface. If zero, the
- properties do not change. Otherwise, the properties are refreshed each
- RefreshRateMs milliseconds in case the underlying counter has changed
- too.
+ Refresh rate of the rest of properties of this interface. The properties
+ are guaranteed to be refreshed each RefreshRateMs milliseconds in case
+ the underlying counter has changed too.
+ If zero, there is no guaranteed refresh rate of the properties.
-->
<property name="RefreshRateMs" type="u" access="readwrite"/>
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index de7ec70db4..7e41e9e743 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -803,30 +803,24 @@ _stats_update_counters (NMDevice *self,
}
static void
-_stats_refresh (NMDevice *self)
+_stats_update_counters_from_pllink (NMDevice *self, const NMPlatformLink *pllink)
{
- const NMPlatformLink *pllink;
- int ifindex;
-
- ifindex = nm_device_get_ip_ifindex (self);
- if (ifindex > 0) {
- nm_platform_link_refresh (NM_PLATFORM_GET, ifindex);
- pllink = nm_platform_link_get (NM_PLATFORM_GET, ifindex);
- if (pllink) {
- _stats_update_counters (self, pllink->tx_bytes, pllink->rx_bytes);
- return;
- }
- }
- _stats_update_counters (self, 0, 0);
+ _stats_update_counters (self, pllink->tx_bytes, pllink->rx_bytes);
}
static gboolean
_stats_timeout_cb (gpointer user_data)
{
NMDevice *self = user_data;
+ int ifindex;
+
+ ifindex = nm_device_get_ip_ifindex (self);
+
+ _LOGT (LOGD_DEVICE, "stats: refresh %d", ifindex);
+
+ if (ifindex > 0)
+ nm_platform_link_refresh (NM_PLATFORM_GET, ifindex);
- _LOGT (LOGD_DEVICE, "stats: refresh");
- _stats_refresh (self);
return G_SOURCE_CONTINUE;
}
@@ -851,6 +845,7 @@ static void
_stats_set_refresh_rate (NMDevice *self, guint refresh_rate_ms)
{
NMDevicePrivate *priv;
+ int ifindex;
guint old_rate;
priv = NM_DEVICE_GET_PRIVATE (self);
@@ -871,16 +866,17 @@ _stats_set_refresh_rate (NMDevice *self, guint refresh_rate_ms)
if (_stats_refresh_rate_real (old_rate) == refresh_rate_ms)
return;
- if (!refresh_rate_ms) {
- nm_clear_g_source (&priv->stats.timeout_id);
- _stats_update_counters (self, 0, 0);
- return;
- }
-
nm_clear_g_source (&priv->stats.timeout_id);
- /* trigger an inital refresh of the data when the refresh-rate changes */
- _stats_refresh (self);
+ if (!refresh_rate_ms)
+ return;
+
+ /* trigger an inital refresh of the data whenever the refresh-rate changes.
+ * As we process the result in an idle handler with device_link_changed(),
+ * we don't get the result right away. */
+ ifindex = nm_device_get_ip_ifindex (self);
+ if (ifindex > 0)
+ nm_platform_link_refresh (NM_PLATFORM_GET, ifindex);
priv->stats.timeout_id = g_timeout_add (refresh_rate_ms, _stats_timeout_cb, self);
}
@@ -1830,6 +1826,9 @@ device_link_changed (NMDevice *self)
_notify (self, PROP_DRIVER);
}
+ if (ifindex == nm_device_get_ip_ifindex (self))
+ _stats_update_counters_from_pllink (self, &info);
+
had_hw_addr = (priv->hw_addr != NULL);
nm_device_update_hw_address (self);
got_hw_addr = (!had_hw_addr && priv->hw_addr);
@@ -1958,6 +1957,8 @@ device_ip_link_changed (NMDevice *self)
if (!pllink)
return G_SOURCE_REMOVE;
+ _stats_update_counters_from_pllink (self, pllink);
+
if (pllink->name[0] && g_strcmp0 (priv->ip_iface, pllink->name)) {
_LOGI (LOGD_DEVICE, "interface index %d renamed ip_iface (%d) from '%s' to '%s'",
priv->ifindex, nm_device_get_ip_ifindex (self),
@@ -2251,6 +2252,7 @@ realize_start_setup (NMDevice *self, const NMPlatformLink *plink)
if (plink) {
g_return_if_fail (link_type_compatible (self, plink->type, NULL, NULL));
update_device_from_platform_link (self, plink);
+ _stats_update_counters_from_pllink (self, plink);
}
if (priv->ifindex > 0) {
@@ -2321,11 +2323,8 @@ realize_start_setup (NMDevice *self, const NMPlatformLink *plink)
nm_assert (!priv->stats.timeout_id);
real_rate = _stats_refresh_rate_real (priv->stats.refresh_rate_ms);
- if (real_rate) {
- if (plink)
- _stats_update_counters (self, plink->tx_bytes, plink->rx_bytes);
+ if (real_rate)
priv->stats.timeout_id = g_timeout_add (real_rate, _stats_timeout_cb, self);
- }
klass->realize_start_notify (self, plink);