Skip to content

Commit

Permalink
Merge branch 'ethtool-strings'
Browse files Browse the repository at this point in the history
Alexander Duyck says:

====================
ethtool: Factor out common code related to writing ethtool strings

This patch set is meant to be a cleanup and refactoring of common code bits
from several drivers. Specificlly a number of drivers engage in a pattern
where they will use some variant on an sprintf or memcpy to write a string
into the ethtool string array and then they will increment their pointer by
ETH_GSTRING_LEN.

Instead of having each driver implement this independently I am refactoring
the code so that we have one central function, ethtool_sprintf that does
all this and takes a double pointer to access the data, a formatted string
to print, and the variable arguments that are associated with the string.

Changes from v1:
Fixed usage of char ** vs  unsigned char ** in hisilicon drivers

Changes from RFC:
Renamed ethtool_gsprintf to ethtool_sprintf
Fixed reverse xmas tree issue in patch 2
====================

Reviewed-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
David S. Miller committed Mar 17, 2021
2 parents 0c88eda + acebe5b commit 5c9e418
Show file tree
Hide file tree
Showing 20 changed files with 410 additions and 639 deletions.
25 changes: 11 additions & 14 deletions drivers/net/ethernet/amazon/ena/ena_ethtool.c
Original file line number Diff line number Diff line change
Expand Up @@ -251,10 +251,10 @@ static void ena_queue_strings(struct ena_adapter *adapter, u8 **data)
for (j = 0; j < ENA_STATS_ARRAY_TX; j++) {
ena_stats = &ena_stats_tx_strings[j];

snprintf(*data, ETH_GSTRING_LEN,
"queue_%u_%s_%s", i,
is_xdp ? "xdp_tx" : "tx", ena_stats->name);
(*data) += ETH_GSTRING_LEN;
ethtool_sprintf(data,
"queue_%u_%s_%s", i,
is_xdp ? "xdp_tx" : "tx",
ena_stats->name);
}

if (!is_xdp) {
Expand All @@ -264,9 +264,9 @@ static void ena_queue_strings(struct ena_adapter *adapter, u8 **data)
for (j = 0; j < ENA_STATS_ARRAY_RX; j++) {
ena_stats = &ena_stats_rx_strings[j];

snprintf(*data, ETH_GSTRING_LEN,
"queue_%u_rx_%s", i, ena_stats->name);
(*data) += ETH_GSTRING_LEN;
ethtool_sprintf(data,
"queue_%u_rx_%s", i,
ena_stats->name);
}
}
}
Expand All @@ -280,9 +280,8 @@ static void ena_com_dev_strings(u8 **data)
for (i = 0; i < ENA_STATS_ARRAY_ENA_COM; i++) {
ena_stats = &ena_stats_ena_com_strings[i];

snprintf(*data, ETH_GSTRING_LEN,
"ena_admin_q_%s", ena_stats->name);
(*data) += ETH_GSTRING_LEN;
ethtool_sprintf(data,
"ena_admin_q_%s", ena_stats->name);
}
}

Expand All @@ -295,15 +294,13 @@ static void ena_get_strings(struct ena_adapter *adapter,

for (i = 0; i < ENA_STATS_ARRAY_GLOBAL; i++) {
ena_stats = &ena_stats_global_strings[i];
memcpy(data, ena_stats->name, ETH_GSTRING_LEN);
data += ETH_GSTRING_LEN;
ethtool_sprintf(&data, ena_stats->name);
}

if (eni_stats_needed) {
for (i = 0; i < ENA_STATS_ARRAY_ENI(adapter); i++) {
ena_stats = &ena_stats_eni_strings[i];
memcpy(data, ena_stats->name, ETH_GSTRING_LEN);
data += ETH_GSTRING_LEN;
ethtool_sprintf(&data, ena_stats->name);
}
}

Expand Down
266 changes: 105 additions & 161 deletions drivers/net/ethernet/brocade/bna/bnad_ethtool.c
Original file line number Diff line number Diff line change
Expand Up @@ -524,182 +524,126 @@ bnad_set_pauseparam(struct net_device *netdev,
return 0;
}

static void bnad_get_txf_strings(u8 **string, int f_num)
{
ethtool_sprintf(string, "txf%d_ucast_octets", f_num);
ethtool_sprintf(string, "txf%d_ucast", f_num);
ethtool_sprintf(string, "txf%d_ucast_vlan", f_num);
ethtool_sprintf(string, "txf%d_mcast_octets", f_num);
ethtool_sprintf(string, "txf%d_mcast", f_num);
ethtool_sprintf(string, "txf%d_mcast_vlan", f_num);
ethtool_sprintf(string, "txf%d_bcast_octets", f_num);
ethtool_sprintf(string, "txf%d_bcast", f_num);
ethtool_sprintf(string, "txf%d_bcast_vlan", f_num);
ethtool_sprintf(string, "txf%d_errors", f_num);
ethtool_sprintf(string, "txf%d_filter_vlan", f_num);
ethtool_sprintf(string, "txf%d_filter_mac_sa", f_num);
}

static void bnad_get_rxf_strings(u8 **string, int f_num)
{
ethtool_sprintf(string, "rxf%d_ucast_octets", f_num);
ethtool_sprintf(string, "rxf%d_ucast", f_num);
ethtool_sprintf(string, "rxf%d_ucast_vlan", f_num);
ethtool_sprintf(string, "rxf%d_mcast_octets", f_num);
ethtool_sprintf(string, "rxf%d_mcast", f_num);
ethtool_sprintf(string, "rxf%d_mcast_vlan", f_num);
ethtool_sprintf(string, "rxf%d_bcast_octets", f_num);
ethtool_sprintf(string, "rxf%d_bcast", f_num);
ethtool_sprintf(string, "rxf%d_bcast_vlan", f_num);
ethtool_sprintf(string, "rxf%d_frame_drops", f_num);
}

static void bnad_get_cq_strings(u8 **string, int q_num)
{
ethtool_sprintf(string, "cq%d_producer_index", q_num);
ethtool_sprintf(string, "cq%d_consumer_index", q_num);
ethtool_sprintf(string, "cq%d_hw_producer_index", q_num);
ethtool_sprintf(string, "cq%d_intr", q_num);
ethtool_sprintf(string, "cq%d_poll", q_num);
ethtool_sprintf(string, "cq%d_schedule", q_num);
ethtool_sprintf(string, "cq%d_keep_poll", q_num);
ethtool_sprintf(string, "cq%d_complete", q_num);
}

static void bnad_get_rxq_strings(u8 **string, int q_num)
{
ethtool_sprintf(string, "rxq%d_packets", q_num);
ethtool_sprintf(string, "rxq%d_bytes", q_num);
ethtool_sprintf(string, "rxq%d_packets_with_error", q_num);
ethtool_sprintf(string, "rxq%d_allocbuf_failed", q_num);
ethtool_sprintf(string, "rxq%d_mapbuf_failed", q_num);
ethtool_sprintf(string, "rxq%d_producer_index", q_num);
ethtool_sprintf(string, "rxq%d_consumer_index", q_num);
}

static void bnad_get_txq_strings(u8 **string, int q_num)
{
ethtool_sprintf(string, "txq%d_packets", q_num);
ethtool_sprintf(string, "txq%d_bytes", q_num);
ethtool_sprintf(string, "txq%d_producer_index", q_num);
ethtool_sprintf(string, "txq%d_consumer_index", q_num);
ethtool_sprintf(string, "txq%d_hw_consumer_index", q_num);
}

static void
bnad_get_strings(struct net_device *netdev, u32 stringset, u8 *string)
{
struct bnad *bnad = netdev_priv(netdev);
int i, j, q_num;
u32 bmap;

if (stringset != ETH_SS_STATS)
return;

mutex_lock(&bnad->conf_mutex);

switch (stringset) {
case ETH_SS_STATS:
for (i = 0; i < BNAD_ETHTOOL_STATS_NUM; i++) {
BUG_ON(!(strlen(bnad_net_stats_strings[i]) <
ETH_GSTRING_LEN));
strncpy(string, bnad_net_stats_strings[i],
ETH_GSTRING_LEN);
string += ETH_GSTRING_LEN;
}
bmap = bna_tx_rid_mask(&bnad->bna);
for (i = 0; bmap; i++) {
if (bmap & 1) {
sprintf(string, "txf%d_ucast_octets", i);
string += ETH_GSTRING_LEN;
sprintf(string, "txf%d_ucast", i);
string += ETH_GSTRING_LEN;
sprintf(string, "txf%d_ucast_vlan", i);
string += ETH_GSTRING_LEN;
sprintf(string, "txf%d_mcast_octets", i);
string += ETH_GSTRING_LEN;
sprintf(string, "txf%d_mcast", i);
string += ETH_GSTRING_LEN;
sprintf(string, "txf%d_mcast_vlan", i);
string += ETH_GSTRING_LEN;
sprintf(string, "txf%d_bcast_octets", i);
string += ETH_GSTRING_LEN;
sprintf(string, "txf%d_bcast", i);
string += ETH_GSTRING_LEN;
sprintf(string, "txf%d_bcast_vlan", i);
string += ETH_GSTRING_LEN;
sprintf(string, "txf%d_errors", i);
string += ETH_GSTRING_LEN;
sprintf(string, "txf%d_filter_vlan", i);
string += ETH_GSTRING_LEN;
sprintf(string, "txf%d_filter_mac_sa", i);
string += ETH_GSTRING_LEN;
}
bmap >>= 1;
}
for (i = 0; i < BNAD_ETHTOOL_STATS_NUM; i++) {
BUG_ON(!(strlen(bnad_net_stats_strings[i]) < ETH_GSTRING_LEN));
ethtool_sprintf(&string, bnad_net_stats_strings[i]);
}

bmap = bna_rx_rid_mask(&bnad->bna);
for (i = 0; bmap; i++) {
if (bmap & 1) {
sprintf(string, "rxf%d_ucast_octets", i);
string += ETH_GSTRING_LEN;
sprintf(string, "rxf%d_ucast", i);
string += ETH_GSTRING_LEN;
sprintf(string, "rxf%d_ucast_vlan", i);
string += ETH_GSTRING_LEN;
sprintf(string, "rxf%d_mcast_octets", i);
string += ETH_GSTRING_LEN;
sprintf(string, "rxf%d_mcast", i);
string += ETH_GSTRING_LEN;
sprintf(string, "rxf%d_mcast_vlan", i);
string += ETH_GSTRING_LEN;
sprintf(string, "rxf%d_bcast_octets", i);
string += ETH_GSTRING_LEN;
sprintf(string, "rxf%d_bcast", i);
string += ETH_GSTRING_LEN;
sprintf(string, "rxf%d_bcast_vlan", i);
string += ETH_GSTRING_LEN;
sprintf(string, "rxf%d_frame_drops", i);
string += ETH_GSTRING_LEN;
}
bmap >>= 1;
}
bmap = bna_tx_rid_mask(&bnad->bna);
for (i = 0; bmap; i++) {
if (bmap & 1)
bnad_get_txf_strings(&string, i);
bmap >>= 1;
}

q_num = 0;
for (i = 0; i < bnad->num_rx; i++) {
if (!bnad->rx_info[i].rx)
continue;
for (j = 0; j < bnad->num_rxp_per_rx; j++) {
sprintf(string, "cq%d_producer_index", q_num);
string += ETH_GSTRING_LEN;
sprintf(string, "cq%d_consumer_index", q_num);
string += ETH_GSTRING_LEN;
sprintf(string, "cq%d_hw_producer_index",
q_num);
string += ETH_GSTRING_LEN;
sprintf(string, "cq%d_intr", q_num);
string += ETH_GSTRING_LEN;
sprintf(string, "cq%d_poll", q_num);
string += ETH_GSTRING_LEN;
sprintf(string, "cq%d_schedule", q_num);
string += ETH_GSTRING_LEN;
sprintf(string, "cq%d_keep_poll", q_num);
string += ETH_GSTRING_LEN;
sprintf(string, "cq%d_complete", q_num);
string += ETH_GSTRING_LEN;
q_num++;
}
}
bmap = bna_rx_rid_mask(&bnad->bna);
for (i = 0; bmap; i++, bmap >>= 1) {
if (bmap & 1)
bnad_get_rxf_strings(&string, i);
bmap >>= 1;
}

q_num = 0;
for (i = 0; i < bnad->num_rx; i++) {
if (!bnad->rx_info[i].rx)
continue;
for (j = 0; j < bnad->num_rxp_per_rx; j++) {
sprintf(string, "rxq%d_packets", q_num);
string += ETH_GSTRING_LEN;
sprintf(string, "rxq%d_bytes", q_num);
string += ETH_GSTRING_LEN;
sprintf(string, "rxq%d_packets_with_error",
q_num);
string += ETH_GSTRING_LEN;
sprintf(string, "rxq%d_allocbuf_failed", q_num);
string += ETH_GSTRING_LEN;
sprintf(string, "rxq%d_mapbuf_failed", q_num);
string += ETH_GSTRING_LEN;
sprintf(string, "rxq%d_producer_index", q_num);
string += ETH_GSTRING_LEN;
sprintf(string, "rxq%d_consumer_index", q_num);
string += ETH_GSTRING_LEN;
q_num++;
if (bnad->rx_info[i].rx_ctrl[j].ccb &&
bnad->rx_info[i].rx_ctrl[j].ccb->
rcb[1] &&
bnad->rx_info[i].rx_ctrl[j].ccb->
rcb[1]->rxq) {
sprintf(string, "rxq%d_packets", q_num);
string += ETH_GSTRING_LEN;
sprintf(string, "rxq%d_bytes", q_num);
string += ETH_GSTRING_LEN;
sprintf(string,
"rxq%d_packets_with_error", q_num);
string += ETH_GSTRING_LEN;
sprintf(string, "rxq%d_allocbuf_failed",
q_num);
string += ETH_GSTRING_LEN;
sprintf(string, "rxq%d_mapbuf_failed",
q_num);
string += ETH_GSTRING_LEN;
sprintf(string, "rxq%d_producer_index",
q_num);
string += ETH_GSTRING_LEN;
sprintf(string, "rxq%d_consumer_index",
q_num);
string += ETH_GSTRING_LEN;
q_num++;
}
}
}
q_num = 0;
for (i = 0; i < bnad->num_rx; i++) {
if (!bnad->rx_info[i].rx)
continue;
for (j = 0; j < bnad->num_rxp_per_rx; j++)
bnad_get_cq_strings(&string, q_num++);
}

q_num = 0;
for (i = 0; i < bnad->num_tx; i++) {
if (!bnad->tx_info[i].tx)
continue;
for (j = 0; j < bnad->num_txq_per_tx; j++) {
sprintf(string, "txq%d_packets", q_num);
string += ETH_GSTRING_LEN;
sprintf(string, "txq%d_bytes", q_num);
string += ETH_GSTRING_LEN;
sprintf(string, "txq%d_producer_index", q_num);
string += ETH_GSTRING_LEN;
sprintf(string, "txq%d_consumer_index", q_num);
string += ETH_GSTRING_LEN;
sprintf(string, "txq%d_hw_consumer_index",
q_num);
string += ETH_GSTRING_LEN;
q_num++;
}
q_num = 0;
for (i = 0; i < bnad->num_rx; i++) {
if (!bnad->rx_info[i].rx)
continue;
for (j = 0; j < bnad->num_rxp_per_rx; j++) {
bnad_get_rxq_strings(&string, q_num++);
if (bnad->rx_info[i].rx_ctrl[j].ccb &&
bnad->rx_info[i].rx_ctrl[j].ccb->rcb[1] &&
bnad->rx_info[i].rx_ctrl[j].ccb->rcb[1]->rxq)
bnad_get_rxq_strings(&string, q_num++);
}
}

break;

default:
break;
q_num = 0;
for (i = 0; i < bnad->num_tx; i++) {
if (!bnad->tx_info[i].tx)
continue;
for (j = 0; j < bnad->num_txq_per_tx; j++)
bnad_get_txq_strings(&string, q_num++);
}

mutex_unlock(&bnad->conf_mutex);
Expand Down
9 changes: 3 additions & 6 deletions drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c
Original file line number Diff line number Diff line change
Expand Up @@ -687,17 +687,14 @@ static void hns_gmac_get_stats(void *mac_drv, u64 *data)

static void hns_gmac_get_strings(u32 stringset, u8 *data)
{
char *buff = (char *)data;
u8 *buff = data;
u32 i;

if (stringset != ETH_SS_STATS)
return;

for (i = 0; i < ARRAY_SIZE(g_gmac_stats_string); i++) {
snprintf(buff, ETH_GSTRING_LEN, "%s",
g_gmac_stats_string[i].desc);
buff = buff + ETH_GSTRING_LEN;
}
for (i = 0; i < ARRAY_SIZE(g_gmac_stats_string); i++)
ethtool_sprintf(&buff, g_gmac_stats_string[i].desc);
}

static int hns_gmac_get_sset_count(int stringset)
Expand Down
Loading

0 comments on commit 5c9e418

Please sign in to comment.