net/igb: support xstats by ID
To achieve functionality of retrieving only specific statistics given by application there are two new functions added: eth_igb_xstats_get_by_id() which retrieve values of statistics specified by ids array and eth_igb_xstats_get_names_by_id() which retrieve names of statistics specified by ids array. Signed-off-by: Kuba Kozak <kubax.kozak@intel.com>
This commit is contained in:
parent
7ac16a3660
commit
484f8e407a
@ -116,9 +116,15 @@ static void eth_igb_stats_get(struct rte_eth_dev *dev,
|
||||
struct rte_eth_stats *rte_stats);
|
||||
static int eth_igb_xstats_get(struct rte_eth_dev *dev,
|
||||
struct rte_eth_xstat *xstats, unsigned n);
|
||||
static int eth_igb_xstats_get_by_id(struct rte_eth_dev *dev,
|
||||
const uint64_t *ids,
|
||||
uint64_t *values, unsigned int n);
|
||||
static int eth_igb_xstats_get_names(struct rte_eth_dev *dev,
|
||||
struct rte_eth_xstat_name *xstats_names,
|
||||
unsigned int limit);
|
||||
unsigned int size);
|
||||
static int eth_igb_xstats_get_names_by_id(struct rte_eth_dev *dev,
|
||||
struct rte_eth_xstat_name *xstats_names, const uint64_t *ids,
|
||||
unsigned int limit);
|
||||
static void eth_igb_stats_reset(struct rte_eth_dev *dev);
|
||||
static void eth_igb_xstats_reset(struct rte_eth_dev *dev);
|
||||
static int eth_igb_fw_version_get(struct rte_eth_dev *dev,
|
||||
@ -389,6 +395,8 @@ static const struct eth_dev_ops eth_igb_ops = {
|
||||
.link_update = eth_igb_link_update,
|
||||
.stats_get = eth_igb_stats_get,
|
||||
.xstats_get = eth_igb_xstats_get,
|
||||
.xstats_get_by_id = eth_igb_xstats_get_by_id,
|
||||
.xstats_get_names_by_id = eth_igb_xstats_get_names_by_id,
|
||||
.xstats_get_names = eth_igb_xstats_get_names,
|
||||
.stats_reset = eth_igb_stats_reset,
|
||||
.xstats_reset = eth_igb_xstats_reset,
|
||||
@ -1845,7 +1853,7 @@ eth_igb_xstats_reset(struct rte_eth_dev *dev)
|
||||
|
||||
static int eth_igb_xstats_get_names(__rte_unused struct rte_eth_dev *dev,
|
||||
struct rte_eth_xstat_name *xstats_names,
|
||||
__rte_unused unsigned limit)
|
||||
__rte_unused unsigned int size)
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
@ -1862,6 +1870,41 @@ static int eth_igb_xstats_get_names(__rte_unused struct rte_eth_dev *dev,
|
||||
return IGB_NB_XSTATS;
|
||||
}
|
||||
|
||||
static int eth_igb_xstats_get_names_by_id(struct rte_eth_dev *dev,
|
||||
struct rte_eth_xstat_name *xstats_names, const uint64_t *ids,
|
||||
unsigned int limit)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
if (!ids) {
|
||||
if (xstats_names == NULL)
|
||||
return IGB_NB_XSTATS;
|
||||
|
||||
for (i = 0; i < IGB_NB_XSTATS; i++)
|
||||
snprintf(xstats_names[i].name,
|
||||
sizeof(xstats_names[i].name),
|
||||
"%s", rte_igb_stats_strings[i].name);
|
||||
|
||||
return IGB_NB_XSTATS;
|
||||
|
||||
} else {
|
||||
struct rte_eth_xstat_name xstats_names_copy[IGB_NB_XSTATS];
|
||||
|
||||
eth_igb_xstats_get_names_by_id(dev, xstats_names_copy, NULL,
|
||||
IGB_NB_XSTATS);
|
||||
|
||||
for (i = 0; i < limit; i++) {
|
||||
if (ids[i] >= IGB_NB_XSTATS) {
|
||||
PMD_INIT_LOG(ERR, "id value isn't valid");
|
||||
return -1;
|
||||
}
|
||||
strcpy(xstats_names[i].name,
|
||||
xstats_names_copy[ids[i]].name);
|
||||
}
|
||||
return limit;
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
eth_igb_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
|
||||
unsigned n)
|
||||
@ -1892,6 +1935,53 @@ eth_igb_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
|
||||
return IGB_NB_XSTATS;
|
||||
}
|
||||
|
||||
static int
|
||||
eth_igb_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids,
|
||||
uint64_t *values, unsigned int n)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
if (!ids) {
|
||||
struct e1000_hw *hw =
|
||||
E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
|
||||
struct e1000_hw_stats *hw_stats =
|
||||
E1000_DEV_PRIVATE_TO_STATS(dev->data->dev_private);
|
||||
|
||||
if (n < IGB_NB_XSTATS)
|
||||
return IGB_NB_XSTATS;
|
||||
|
||||
igb_read_stats_registers(hw, hw_stats);
|
||||
|
||||
/* If this is a reset xstats is NULL, and we have cleared the
|
||||
* registers by reading them.
|
||||
*/
|
||||
if (!values)
|
||||
return 0;
|
||||
|
||||
/* Extended stats */
|
||||
for (i = 0; i < IGB_NB_XSTATS; i++)
|
||||
values[i] = *(uint64_t *)(((char *)hw_stats) +
|
||||
rte_igb_stats_strings[i].offset);
|
||||
|
||||
return IGB_NB_XSTATS;
|
||||
|
||||
} else {
|
||||
uint64_t values_copy[IGB_NB_XSTATS];
|
||||
|
||||
eth_igb_xstats_get_by_id(dev, NULL, values_copy,
|
||||
IGB_NB_XSTATS);
|
||||
|
||||
for (i = 0; i < n; i++) {
|
||||
if (ids[i] >= IGB_NB_XSTATS) {
|
||||
PMD_INIT_LOG(ERR, "id value isn't valid");
|
||||
return -1;
|
||||
}
|
||||
values[i] = values_copy[ids[i]];
|
||||
}
|
||||
return n;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
igbvf_read_stats_registers(struct e1000_hw *hw, struct e1000_vf_stats *hw_stats)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user