Skip to content

Commit

Permalink
net/sfc: fix xstats query by unsorted list of IDs
Browse files Browse the repository at this point in the history
[ upstream commit 7d466e5 ]

Device may support only some MAC stats. Add mapping from ids to subset
of supported MAC stats for each port.

Fixes: 73280c1 ("net/sfc: support xstats retrieval by ID")

Signed-off-by: Ivan Ilchenko <ivan.ilchenko@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
  • Loading branch information
ol-vanyaio authored and bluca committed Jul 26, 2021
1 parent e4ebfde commit b84a0eb
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 29 deletions.
2 changes: 2 additions & 0 deletions drivers/net/sfc/sfc.h
Expand Up @@ -139,6 +139,8 @@ struct sfc_port {

uint32_t mac_stats_mask[EFX_MAC_STATS_MASK_NPAGES];

unsigned int mac_stats_by_id[EFX_MAC_NSTATS];

uint64_t ipackets;
};

Expand Down
44 changes: 22 additions & 22 deletions drivers/net/sfc/sfc_ethdev.c
Expand Up @@ -779,8 +779,6 @@ sfc_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids,
struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
struct sfc_port *port = &sa->port;
uint64_t *mac_stats;
unsigned int nb_supported = 0;
unsigned int nb_written = 0;
unsigned int i;
int ret;
int rc;
Expand All @@ -799,17 +797,19 @@ sfc_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids,

mac_stats = port->mac_stats_buf;

for (i = 0; (i < EFX_MAC_NSTATS) && (nb_written < n); ++i) {
if (!EFX_MAC_STAT_SUPPORTED(port->mac_stats_mask, i))
continue;

if (ids[nb_written] == nb_supported)
values[nb_written++] = mac_stats[i];
SFC_ASSERT(port->mac_stats_nb_supported <=
RTE_DIM(port->mac_stats_by_id));

++nb_supported;
for (i = 0; i < n; i++) {
if (ids[i] < port->mac_stats_nb_supported) {
values[i] = mac_stats[port->mac_stats_by_id[ids[i]]];
} else {
ret = i;
goto unlock;
}
}

ret = nb_written;
ret = n;

unlock:
sfc_adapter_unlock(sa);
Expand All @@ -824,8 +824,7 @@ sfc_xstats_get_names_by_id(struct rte_eth_dev *dev,
{
struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
struct sfc_port *port = &sa->port;
unsigned int nb_supported = 0;
unsigned int nb_written = 0;
unsigned int nb_supported;
unsigned int i;

if (unlikely(xstats_names == NULL && ids != NULL) ||
Expand All @@ -840,23 +839,24 @@ sfc_xstats_get_names_by_id(struct rte_eth_dev *dev,
return nb_supported;
}

for (i = 0; (i < EFX_MAC_NSTATS) && (nb_written < size); ++i) {
if (!EFX_MAC_STAT_SUPPORTED(port->mac_stats_mask, i))
continue;

if (ids[nb_written] == nb_supported) {
char *name = xstats_names[nb_written++].name;
SFC_ASSERT(port->mac_stats_nb_supported <=
RTE_DIM(port->mac_stats_by_id));

strlcpy(name, efx_mac_stat_name(sa->nic, i),
for (i = 0; i < size; i++) {
if (ids[i] < port->mac_stats_nb_supported) {
strlcpy(xstats_names[i].name,
efx_mac_stat_name(sa->nic,
port->mac_stats_by_id[ids[i]]),
sizeof(xstats_names[0].name));
} else {
sfc_adapter_unlock(sa);
return i;
}

++nb_supported;
}

sfc_adapter_unlock(sa);

return nb_written;
return size;
}

static int
Expand Down
29 changes: 22 additions & 7 deletions drivers/net/sfc/sfc_port.c
Expand Up @@ -157,6 +157,27 @@ sfc_port_phy_caps_to_max_link_speed(uint32_t phy_caps)

#endif

static void
sfc_port_fill_mac_stats_info(struct sfc_adapter *sa)
{
unsigned int mac_stats_nb_supported = 0;
struct sfc_port *port = &sa->port;
unsigned int stat_idx;

efx_mac_stats_get_mask(sa->nic, port->mac_stats_mask,
sizeof(port->mac_stats_mask));

for (stat_idx = 0; stat_idx < EFX_MAC_NSTATS; ++stat_idx) {
if (!EFX_MAC_STAT_SUPPORTED(port->mac_stats_mask, stat_idx))
continue;

port->mac_stats_by_id[mac_stats_nb_supported] = stat_idx;
mac_stats_nb_supported++;
}

port->mac_stats_nb_supported = mac_stats_nb_supported;
}

int
sfc_port_start(struct sfc_adapter *sa)
{
Expand All @@ -165,7 +186,6 @@ sfc_port_start(struct sfc_adapter *sa)
uint32_t phy_adv_cap;
const uint32_t phy_pause_caps =
((1u << EFX_PHY_CAP_PAUSE) | (1u << EFX_PHY_CAP_ASYM));
unsigned int i;

sfc_log_init(sa, "entry");

Expand Down Expand Up @@ -259,12 +279,7 @@ sfc_port_start(struct sfc_adapter *sa)
port->mac_stats_reset_pending = B_FALSE;
}

efx_mac_stats_get_mask(sa->nic, port->mac_stats_mask,
sizeof(port->mac_stats_mask));

for (i = 0, port->mac_stats_nb_supported = 0; i < EFX_MAC_NSTATS; ++i)
if (EFX_MAC_STAT_SUPPORTED(port->mac_stats_mask, i))
port->mac_stats_nb_supported++;
sfc_port_fill_mac_stats_info(sa);

port->mac_stats_update_generation = 0;

Expand Down

0 comments on commit b84a0eb

Please sign in to comment.