net/iface: Add PM suspend state statistics
Counting how many times it went suspended, for how long on the last one and on overage. Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
This commit is contained in:
parent
e5912b074a
commit
00926e3899
5 changed files with 82 additions and 0 deletions
|
@ -237,6 +237,18 @@ struct net_stats_tc {
|
|||
} recv[NET_TC_RX_COUNT];
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @brief Power management statistics
|
||||
*/
|
||||
struct net_stats_pm {
|
||||
u64_t overall_suspend_time;
|
||||
net_stats_t suspend_count;
|
||||
u32_t last_suspend_time;
|
||||
u32_t start_time;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @brief All network statistics in one struct.
|
||||
*/
|
||||
|
@ -308,6 +320,10 @@ struct net_stats {
|
|||
/** Network packet RX time statistics */
|
||||
struct net_stats_rx_time rx_time;
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_NET_STATISTICS_POWER_MANAGEMENT)
|
||||
struct net_stats_pm pm;
|
||||
#endif
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -432,6 +448,7 @@ enum net_request_stats_cmd {
|
|||
NET_REQUEST_STATS_CMD_GET_TCP,
|
||||
NET_REQUEST_STATS_CMD_GET_ETHERNET,
|
||||
NET_REQUEST_STATS_CMD_GET_PPP,
|
||||
NET_REQUEST_STATS_CMD_GET_PM
|
||||
};
|
||||
|
||||
#define NET_REQUEST_STATS_GET_ALL \
|
||||
|
@ -512,6 +529,13 @@ NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_STATS_GET_PPP);
|
|||
|
||||
#endif /* CONFIG_NET_STATISTICS_USER_API */
|
||||
|
||||
#if defined(CONFIG_NET_STATISTICS_POWER_MANAGEMENT)
|
||||
#define NET_REQUEST_STATS_GET_PM \
|
||||
(_NET_STATS_BASE | NET_REQUEST_STATS_CMD_GET_PM)
|
||||
|
||||
NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_STATS_GET_PM);
|
||||
#endif /* CONFIG_NET_STATISTICS_POWER_MANAGEMENT */
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
|
|
@ -111,4 +111,11 @@ config NET_STATISTICS_ETHERNET_VENDOR
|
|||
key-value pairs. Deciphering the information may require
|
||||
vendor documentation.
|
||||
|
||||
config NET_STATISTICS_POWER_MANAGEMENT
|
||||
bool "Power management statistics"
|
||||
depends on NET_POWER_MANAGEMENT
|
||||
help
|
||||
This will provide how many time a network interface went
|
||||
suspended, for how long the last time and on average.
|
||||
|
||||
endif # NET_STATISTICS
|
||||
|
|
|
@ -3636,6 +3636,8 @@ int net_if_suspend(struct net_if *iface)
|
|||
return -EALREADY;
|
||||
}
|
||||
|
||||
net_stats_add_suspend_start_time(iface, k_cycle_get_32());
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -3647,6 +3649,8 @@ int net_if_resume(struct net_if *iface)
|
|||
|
||||
net_if_flag_clear(iface, NET_IF_SUSPENDED);
|
||||
|
||||
net_stats_add_suspend_end_time(iface, k_cycle_get_32());
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -191,6 +191,18 @@ static inline void stats(struct net_if *iface)
|
|||
ARG_UNUSED(i);
|
||||
#endif /* NET_TC_COUNT > 1 */
|
||||
|
||||
#if defined(CONFIG_NET_STATISTICS_POWER_MANAGEMENT)
|
||||
NET_INFO("Power management statistics:");
|
||||
NET_INFO("Last suspend time: %u ms",
|
||||
GET_STAT(iface, pm.last_suspend_time));
|
||||
NET_INFO("Got suspended %d times",
|
||||
GET_STAT(iface, pm.suspend_count));
|
||||
NET_INFO("Average suspend time: %u ms",
|
||||
(u32_t)(GET_STAT(iface, pm.overall_suspend_time) /
|
||||
GET_STAT(iface, pm.suspend_count)));
|
||||
NET_INFO("Total suspended time: %llu ms",
|
||||
GET_STAT(iface, pm.overall_suspend_time));
|
||||
#endif
|
||||
next_print = curr + PRINT_STATISTICS_INTERVAL;
|
||||
}
|
||||
}
|
||||
|
@ -284,6 +296,12 @@ static int net_stats_get(u32_t mgmt_request, struct net_if *iface,
|
|||
len_chk = sizeof(struct net_stats_tcp);
|
||||
src = GET_STAT_ADDR(iface, tcp);
|
||||
break;
|
||||
#endif
|
||||
#if defined(CONFIG_NET_STATISTICS_POWER_MANAGEMENT)
|
||||
case NET_REQUEST_STATS_GET_PM:
|
||||
len_chk = sizeof(struct net_stats_pm);
|
||||
src = GET_STAT_ADDR(iface, pm);
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -338,6 +356,11 @@ NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_STATS_GET_TCP,
|
|||
net_stats_get);
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_NET_STATISTICS_POWER_MANAGEMENT)
|
||||
NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_STATS_GET_PM,
|
||||
net_stats_get);
|
||||
#endif
|
||||
|
||||
#endif /* CONFIG_NET_STATISTICS_USER_API */
|
||||
|
||||
void net_stats_reset(struct net_if *iface)
|
||||
|
|
|
@ -463,6 +463,30 @@ static inline void net_stats_update_tc_rx_time(struct net_if *iface,
|
|||
#endif /* NET_PKT_RXTIME_STATS && NET_STATISTICS */
|
||||
#endif /* NET_TC_COUNT > 1 */
|
||||
|
||||
#if defined(CONFIG_NET_STATISTICS_POWER_MANAGEMENT) \
|
||||
&& defined(CONFIG_NET_STATISTICS) && defined(CONFIG_NET_NATIVE)
|
||||
static inline void net_stats_add_suspend_start_time(struct net_if *iface,
|
||||
u32_t time)
|
||||
{
|
||||
UPDATE_STAT(iface, stats.pm.start_time = time);
|
||||
}
|
||||
|
||||
static inline void net_stats_add_suspend_end_time(struct net_if *iface,
|
||||
u32_t time)
|
||||
{
|
||||
u32_t diff_time =
|
||||
k_cyc_to_ms_floor32(time - GET_STAT(iface, pm.start_time));
|
||||
|
||||
UPDATE_STAT(iface, stats.pm.start_time = 0);
|
||||
UPDATE_STAT(iface, stats.pm.last_suspend_time = diff_time);
|
||||
UPDATE_STAT(iface, stats.pm.suspend_count++);
|
||||
UPDATE_STAT(iface, stats.pm.overall_suspend_time += diff_time);
|
||||
}
|
||||
#else
|
||||
#define net_stats_add_suspend_start_time(iface, time)
|
||||
#define net_stats_add_suspend_end_time(iface, time)
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_NET_STATISTICS_PERIODIC_OUTPUT) \
|
||||
&& defined(CONFIG_NET_NATIVE)
|
||||
/* A simple periodic statistic printer, used only in net core */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue