Commit d63bb21a authored by Jacob Keller's avatar Jacob Keller Committed by Jeff Kirsher

fm10k: use variadic arguments to fm10k_add_stat_strings

Instead of using a fixed prefix string we setup before each call to
fm10k_add_stat_strings, modify the helper to take variadic arguments and
pass them to vsnprintf. This requires changing the fm10k_stat strings to
take % format specifiers where necessary, but the resulting code is much
simpler.
Signed-off-by: default avatarJacob Keller <jacob.e.keller@intel.com>
Tested-by: default avatarKrishneil Singh <krishneil.k.singh@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 2ead8ae1
...@@ -6,6 +6,11 @@ ...@@ -6,6 +6,11 @@
#include "fm10k.h" #include "fm10k.h"
struct fm10k_stats { struct fm10k_stats {
/* The stat_string is expected to be a format string formatted using
* vsnprintf by fm10k_add_stat_strings. Every member of a stats array
* should use the same format specifiers as they will be formatted
* using the same variadic arguments.
*/
char stat_string[ETH_GSTRING_LEN]; char stat_string[ETH_GSTRING_LEN];
int sizeof_stat; int sizeof_stat;
int stat_offset; int stat_offset;
...@@ -94,15 +99,13 @@ static const struct fm10k_stats fm10k_gstrings_mbx_stats[] = { ...@@ -94,15 +99,13 @@ static const struct fm10k_stats fm10k_gstrings_mbx_stats[] = {
FM10K_MBX_STAT("mbx_rx_mbmem_pushed", rx_mbmem_pushed), FM10K_MBX_STAT("mbx_rx_mbmem_pushed", rx_mbmem_pushed),
}; };
#define FM10K_QUEUE_STAT(_name, _stat) { \ /* per-queue ring statistics */
.stat_string = _name, \ #define FM10K_QUEUE_STAT(_name, _stat) \
.sizeof_stat = FIELD_SIZEOF(struct fm10k_ring, _stat), \ FM10K_STAT_FIELDS(struct fm10k_ring, _name, _stat)
.stat_offset = offsetof(struct fm10k_ring, _stat) \
}
static const struct fm10k_stats fm10k_gstrings_queue_stats[] = { static const struct fm10k_stats fm10k_gstrings_queue_stats[] = {
FM10K_QUEUE_STAT("packets", stats.packets), FM10K_QUEUE_STAT("%s_queue_%u_packets", stats.packets),
FM10K_QUEUE_STAT("bytes", stats.bytes), FM10K_QUEUE_STAT("%s_queue_%u_bytes", stats.bytes),
}; };
#define FM10K_GLOBAL_STATS_LEN ARRAY_SIZE(fm10k_gstrings_global_stats) #define FM10K_GLOBAL_STATS_LEN ARRAY_SIZE(fm10k_gstrings_global_stats)
...@@ -132,16 +135,18 @@ enum { ...@@ -132,16 +135,18 @@ enum {
static const char fm10k_prv_flags[FM10K_PRV_FLAG_LEN][ETH_GSTRING_LEN] = { static const char fm10k_prv_flags[FM10K_PRV_FLAG_LEN][ETH_GSTRING_LEN] = {
}; };
static void fm10k_add_stat_strings(u8 **p, const char *prefix, static void fm10k_add_stat_strings(u8 **p, const struct fm10k_stats stats[],
const struct fm10k_stats stats[], const unsigned int size, ...)
const unsigned int size)
{ {
unsigned int i; unsigned int i;
for (i = 0; i < size; i++) { for (i = 0; i < size; i++) {
snprintf(*p, ETH_GSTRING_LEN, "%s%s", va_list args;
prefix, stats[i].stat_string);
va_start(args, size);
vsnprintf(*p, ETH_GSTRING_LEN, stats[i].stat_string, args);
*p += ETH_GSTRING_LEN; *p += ETH_GSTRING_LEN;
va_end(args);
} }
} }
...@@ -150,31 +155,27 @@ static void fm10k_get_stat_strings(struct net_device *dev, u8 *data) ...@@ -150,31 +155,27 @@ static void fm10k_get_stat_strings(struct net_device *dev, u8 *data)
struct fm10k_intfc *interface = netdev_priv(dev); struct fm10k_intfc *interface = netdev_priv(dev);
unsigned int i; unsigned int i;
fm10k_add_stat_strings(&data, "", fm10k_gstrings_net_stats, fm10k_add_stat_strings(&data, fm10k_gstrings_net_stats,
FM10K_NETDEV_STATS_LEN); FM10K_NETDEV_STATS_LEN);
fm10k_add_stat_strings(&data, "", fm10k_gstrings_global_stats, fm10k_add_stat_strings(&data, fm10k_gstrings_global_stats,
FM10K_GLOBAL_STATS_LEN); FM10K_GLOBAL_STATS_LEN);
fm10k_add_stat_strings(&data, "", fm10k_gstrings_mbx_stats, fm10k_add_stat_strings(&data, fm10k_gstrings_mbx_stats,
FM10K_MBX_STATS_LEN); FM10K_MBX_STATS_LEN);
if (interface->hw.mac.type != fm10k_mac_vf) if (interface->hw.mac.type != fm10k_mac_vf)
fm10k_add_stat_strings(&data, "", fm10k_gstrings_pf_stats, fm10k_add_stat_strings(&data, fm10k_gstrings_pf_stats,
FM10K_PF_STATS_LEN); FM10K_PF_STATS_LEN);
for (i = 0; i < interface->hw.mac.max_queues; i++) { for (i = 0; i < interface->hw.mac.max_queues; i++) {
char prefix[ETH_GSTRING_LEN]; fm10k_add_stat_strings(&data, fm10k_gstrings_queue_stats,
FM10K_QUEUE_STATS_LEN,
snprintf(prefix, ETH_GSTRING_LEN, "tx_queue_%u_", i); "tx", i);
fm10k_add_stat_strings(&data, prefix,
fm10k_gstrings_queue_stats,
FM10K_QUEUE_STATS_LEN);
snprintf(prefix, ETH_GSTRING_LEN, "rx_queue_%u_", i); fm10k_add_stat_strings(&data, fm10k_gstrings_queue_stats,
fm10k_add_stat_strings(&data, prefix, FM10K_QUEUE_STATS_LEN,
fm10k_gstrings_queue_stats, "rx", i);
FM10K_QUEUE_STATS_LEN);
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment