Skip to content

Commit d2e0721

Browse files
jacob-kellerJeff Kirsher
authored andcommitted
fm10k: add helper functions to set strings and data for ethtool stats
Reduce duplicate code and the amount of indentation by adding fm10k_add_stat_strings and fm10k_add_ethtool_stats functions which help add fm10k_stat structures to the ethtool stats callbacks. This helps increase ease of use for future stat additions, and increases code readability. Skip handling of the per-queue stats as these will be reworked in a following patch. Signed-off-by: Jacob Keller <[email protected]> Tested-by: Krishneil Singh <[email protected]> Signed-off-by: Jeff Kirsher <[email protected]>
1 parent c8ed563 commit d2e0721

File tree

1 file changed

+83
-81
lines changed

1 file changed

+83
-81
lines changed

drivers/net/ethernet/intel/fm10k/fm10k_ethtool.c

Lines changed: 83 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -153,57 +153,51 @@ static const char fm10k_prv_flags[FM10K_PRV_FLAG_LEN][ETH_GSTRING_LEN] = {
153153
"debug-statistics",
154154
};
155155

156+
static void fm10k_add_stat_strings(char **p, const char *prefix,
157+
const struct fm10k_stats stats[],
158+
const unsigned int size)
159+
{
160+
unsigned int i;
161+
162+
for (i = 0; i < size; i++) {
163+
snprintf(*p, ETH_GSTRING_LEN, "%s%s",
164+
prefix, stats[i].stat_string);
165+
*p += ETH_GSTRING_LEN;
166+
}
167+
}
168+
156169
static void fm10k_get_stat_strings(struct net_device *dev, u8 *data)
157170
{
158171
struct fm10k_intfc *interface = netdev_priv(dev);
159172
struct fm10k_iov_data *iov_data = interface->iov_data;
160173
char *p = (char *)data;
161174
unsigned int i;
162-
unsigned int j;
163175

164-
for (i = 0; i < FM10K_NETDEV_STATS_LEN; i++) {
165-
memcpy(p, fm10k_gstrings_net_stats[i].stat_string,
166-
ETH_GSTRING_LEN);
167-
p += ETH_GSTRING_LEN;
168-
}
176+
fm10k_add_stat_strings(&p, "", fm10k_gstrings_net_stats,
177+
FM10K_NETDEV_STATS_LEN);
169178

170-
for (i = 0; i < FM10K_GLOBAL_STATS_LEN; i++) {
171-
memcpy(p, fm10k_gstrings_global_stats[i].stat_string,
172-
ETH_GSTRING_LEN);
173-
p += ETH_GSTRING_LEN;
174-
}
179+
fm10k_add_stat_strings(&p, "", fm10k_gstrings_global_stats,
180+
FM10K_GLOBAL_STATS_LEN);
175181

176-
if (interface->flags & FM10K_FLAG_DEBUG_STATS) {
177-
for (i = 0; i < FM10K_DEBUG_STATS_LEN; i++) {
178-
memcpy(p, fm10k_gstrings_debug_stats[i].stat_string,
179-
ETH_GSTRING_LEN);
180-
p += ETH_GSTRING_LEN;
181-
}
182-
}
182+
if (interface->flags & FM10K_FLAG_DEBUG_STATS)
183+
fm10k_add_stat_strings(&p, "", fm10k_gstrings_debug_stats,
184+
FM10K_DEBUG_STATS_LEN);
183185

184-
for (i = 0; i < FM10K_MBX_STATS_LEN; i++) {
185-
memcpy(p, fm10k_gstrings_mbx_stats[i].stat_string,
186-
ETH_GSTRING_LEN);
187-
p += ETH_GSTRING_LEN;
188-
}
186+
fm10k_add_stat_strings(&p, "", fm10k_gstrings_mbx_stats,
187+
FM10K_MBX_STATS_LEN);
189188

190-
if (interface->hw.mac.type != fm10k_mac_vf) {
191-
for (i = 0; i < FM10K_PF_STATS_LEN; i++) {
192-
memcpy(p, fm10k_gstrings_pf_stats[i].stat_string,
193-
ETH_GSTRING_LEN);
194-
p += ETH_GSTRING_LEN;
195-
}
196-
}
189+
if (interface->hw.mac.type != fm10k_mac_vf)
190+
fm10k_add_stat_strings(&p, "", fm10k_gstrings_pf_stats,
191+
FM10K_PF_STATS_LEN);
197192

198193
if ((interface->flags & FM10K_FLAG_DEBUG_STATS) && iov_data) {
199194
for (i = 0; i < iov_data->num_vfs; i++) {
200-
for (j = 0; j < FM10K_MBX_STATS_LEN; j++) {
201-
snprintf(p,
202-
ETH_GSTRING_LEN,
203-
"vf_%u_%s", i,
204-
fm10k_gstrings_mbx_stats[j].stat_string);
205-
p += ETH_GSTRING_LEN;
206-
}
195+
char prefix[ETH_GSTRING_LEN];
196+
197+
snprintf(prefix, ETH_GSTRING_LEN, "vf_%u_", i);
198+
fm10k_add_stat_strings(&p, prefix,
199+
fm10k_gstrings_mbx_stats,
200+
FM10K_MBX_STATS_LEN);
207201
}
208202
}
209203

@@ -271,6 +265,41 @@ static int fm10k_get_sset_count(struct net_device *dev, int sset)
271265
}
272266
}
273267

268+
static void fm10k_add_ethtool_stats(u64 **data, void *pointer,
269+
const struct fm10k_stats stats[],
270+
const unsigned int size)
271+
{
272+
unsigned int i;
273+
char *p;
274+
275+
/* simply skip forward if we were not given a valid pointer */
276+
if (!pointer) {
277+
*data += size;
278+
return;
279+
}
280+
281+
for (i = 0; i < size; i++) {
282+
p = (char *)pointer + stats[i].stat_offset;
283+
284+
switch (stats[i].sizeof_stat) {
285+
case sizeof(u64):
286+
*((*data)++) = *(u64 *)p;
287+
break;
288+
case sizeof(u32):
289+
*((*data)++) = *(u32 *)p;
290+
break;
291+
case sizeof(u16):
292+
*((*data)++) = *(u16 *)p;
293+
break;
294+
case sizeof(u8):
295+
*((*data)++) = *(u8 *)p;
296+
break;
297+
default:
298+
*((*data)++) = 0;
299+
}
300+
}
301+
}
302+
274303
static void fm10k_get_ethtool_stats(struct net_device *netdev,
275304
struct ethtool_stats __always_unused *stats,
276305
u64 *data)
@@ -279,47 +308,29 @@ static void fm10k_get_ethtool_stats(struct net_device *netdev,
279308
struct fm10k_intfc *interface = netdev_priv(netdev);
280309
struct fm10k_iov_data *iov_data = interface->iov_data;
281310
struct net_device_stats *net_stats = &netdev->stats;
282-
char *p;
283311
int i, j;
284312

285313
fm10k_update_stats(interface);
286314

287-
for (i = 0; i < FM10K_NETDEV_STATS_LEN; i++) {
288-
p = (char *)net_stats + fm10k_gstrings_net_stats[i].stat_offset;
289-
*(data++) = (fm10k_gstrings_net_stats[i].sizeof_stat ==
290-
sizeof(u64)) ? *(u64 *)p : *(u32 *)p;
291-
}
315+
fm10k_add_ethtool_stats(&data, net_stats, fm10k_gstrings_net_stats,
316+
FM10K_NETDEV_STATS_LEN);
292317

293-
for (i = 0; i < FM10K_GLOBAL_STATS_LEN; i++) {
294-
p = (char *)interface +
295-
fm10k_gstrings_global_stats[i].stat_offset;
296-
*(data++) = (fm10k_gstrings_global_stats[i].sizeof_stat ==
297-
sizeof(u64)) ? *(u64 *)p : *(u32 *)p;
298-
}
318+
fm10k_add_ethtool_stats(&data, interface, fm10k_gstrings_global_stats,
319+
FM10K_GLOBAL_STATS_LEN);
299320

300-
if (interface->flags & FM10K_FLAG_DEBUG_STATS) {
301-
for (i = 0; i < FM10K_DEBUG_STATS_LEN; i++) {
302-
p = (char *)interface +
303-
fm10k_gstrings_debug_stats[i].stat_offset;
304-
*(data++) = (fm10k_gstrings_debug_stats[i].sizeof_stat ==
305-
sizeof(u64)) ? *(u64 *)p : *(u32 *)p;
306-
}
307-
}
321+
if (interface->flags & FM10K_FLAG_DEBUG_STATS)
322+
fm10k_add_ethtool_stats(&data, interface,
323+
fm10k_gstrings_debug_stats,
324+
FM10K_DEBUG_STATS_LEN);
308325

309-
for (i = 0; i < FM10K_MBX_STATS_LEN; i++) {
310-
p = (char *)&interface->hw.mbx +
311-
fm10k_gstrings_mbx_stats[i].stat_offset;
312-
*(data++) = (fm10k_gstrings_mbx_stats[i].sizeof_stat ==
313-
sizeof(u64)) ? *(u64 *)p : *(u32 *)p;
314-
}
326+
fm10k_add_ethtool_stats(&data, &interface->hw.mbx,
327+
fm10k_gstrings_mbx_stats,
328+
FM10K_MBX_STATS_LEN);
315329

316330
if (interface->hw.mac.type != fm10k_mac_vf) {
317-
for (i = 0; i < FM10K_PF_STATS_LEN; i++) {
318-
p = (char *)interface +
319-
fm10k_gstrings_pf_stats[i].stat_offset;
320-
*(data++) = (fm10k_gstrings_pf_stats[i].sizeof_stat ==
321-
sizeof(u64)) ? *(u64 *)p : *(u32 *)p;
322-
}
331+
fm10k_add_ethtool_stats(&data, interface,
332+
fm10k_gstrings_pf_stats,
333+
FM10K_PF_STATS_LEN);
323334
}
324335

325336
if ((interface->flags & FM10K_FLAG_DEBUG_STATS) && iov_data) {
@@ -328,18 +339,9 @@ static void fm10k_get_ethtool_stats(struct net_device *netdev,
328339

329340
vf_info = &iov_data->vf_info[i];
330341

331-
/* skip stats if we don't have a vf info */
332-
if (!vf_info) {
333-
data += FM10K_MBX_STATS_LEN;
334-
continue;
335-
}
336-
337-
for (j = 0; j < FM10K_MBX_STATS_LEN; j++) {
338-
p = (char *)&vf_info->mbx +
339-
fm10k_gstrings_mbx_stats[j].stat_offset;
340-
*(data++) = (fm10k_gstrings_mbx_stats[j].sizeof_stat ==
341-
sizeof(u64)) ? *(u64 *)p : *(u32 *)p;
342-
}
342+
fm10k_add_ethtool_stats(&data, &vf_info->mbx,
343+
fm10k_gstrings_mbx_stats,
344+
FM10K_MBX_STATS_LEN);
343345
}
344346
}
345347

0 commit comments

Comments
 (0)