net/cxgbe: support xstats for VF
Add support to fetch port and queue stats via xstats API. Also remove queue stats from basic stats because they're now available via xstats API for the VF. Signed-off-by: Nikhil Vasoya <nikhil.vasoya@chelsio.com> Signed-off-by: Rahul Lakkireddy <rahul.lakkireddy@chelsio.com>
This commit is contained in:
parent
18627cede7
commit
5ec659a76a
@ -24,6 +24,7 @@ L3 checksum offload = Y
|
|||||||
L4 checksum offload = Y
|
L4 checksum offload = Y
|
||||||
Packet type parsing = Y
|
Packet type parsing = Y
|
||||||
Basic stats = Y
|
Basic stats = Y
|
||||||
|
Extended stats = Y
|
||||||
Stats per queue = Y
|
Stats per queue = Y
|
||||||
EEPROM dump = Y
|
EEPROM dump = Y
|
||||||
Registers dump = Y
|
Registers dump = Y
|
||||||
|
@ -20,6 +20,7 @@ L3 checksum offload = Y
|
|||||||
L4 checksum offload = Y
|
L4 checksum offload = Y
|
||||||
Packet type parsing = Y
|
Packet type parsing = Y
|
||||||
Basic stats = Y
|
Basic stats = Y
|
||||||
|
Extended stats = Y
|
||||||
Stats per queue = Y
|
Stats per queue = Y
|
||||||
Multiprocess aware = Y
|
Multiprocess aware = Y
|
||||||
Linux = Y
|
Linux = Y
|
||||||
|
@ -881,15 +881,37 @@ static const struct cxgbe_dev_xstats_name_off cxgbe_dev_port_stats_strings[] = {
|
|||||||
{"rx_bg3_truncated_packets", offsetof(struct port_stats, rx_trunc3)},
|
{"rx_bg3_truncated_packets", offsetof(struct port_stats, rx_trunc3)},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct cxgbe_dev_xstats_name_off
|
||||||
|
cxgbevf_dev_port_stats_strings[] = {
|
||||||
|
{"tx_bytes", offsetof(struct port_stats, tx_octets)},
|
||||||
|
{"tx_broadcast_packets", offsetof(struct port_stats, tx_bcast_frames)},
|
||||||
|
{"tx_multicast_packets", offsetof(struct port_stats, tx_mcast_frames)},
|
||||||
|
{"tx_unicast_packets", offsetof(struct port_stats, tx_ucast_frames)},
|
||||||
|
{"tx_drop_packets", offsetof(struct port_stats, tx_drop)},
|
||||||
|
{"rx_broadcast_packets", offsetof(struct port_stats, rx_bcast_frames)},
|
||||||
|
{"rx_multicast_packets", offsetof(struct port_stats, rx_mcast_frames)},
|
||||||
|
{"rx_unicast_packets", offsetof(struct port_stats, rx_ucast_frames)},
|
||||||
|
{"rx_length_error_packets", offsetof(struct port_stats, rx_len_err)},
|
||||||
|
};
|
||||||
|
|
||||||
#define CXGBE_NB_RXQ_STATS RTE_DIM(cxgbe_dev_rxq_stats_strings)
|
#define CXGBE_NB_RXQ_STATS RTE_DIM(cxgbe_dev_rxq_stats_strings)
|
||||||
#define CXGBE_NB_TXQ_STATS RTE_DIM(cxgbe_dev_txq_stats_strings)
|
#define CXGBE_NB_TXQ_STATS RTE_DIM(cxgbe_dev_txq_stats_strings)
|
||||||
#define CXGBE_NB_PORT_STATS RTE_DIM(cxgbe_dev_port_stats_strings)
|
#define CXGBE_NB_PORT_STATS RTE_DIM(cxgbe_dev_port_stats_strings)
|
||||||
|
#define CXGBEVF_NB_PORT_STATS RTE_DIM(cxgbevf_dev_port_stats_strings)
|
||||||
|
|
||||||
static u16 cxgbe_dev_xstats_count(struct port_info *pi)
|
static u16 cxgbe_dev_xstats_count(struct port_info *pi)
|
||||||
{
|
{
|
||||||
return CXGBE_NB_PORT_STATS +
|
u16 count;
|
||||||
(pi->n_tx_qsets * CXGBE_NB_TXQ_STATS) +
|
|
||||||
(pi->n_rx_qsets * CXGBE_NB_RXQ_STATS);
|
count = (pi->n_tx_qsets * CXGBE_NB_TXQ_STATS) +
|
||||||
|
(pi->n_rx_qsets * CXGBE_NB_RXQ_STATS);
|
||||||
|
|
||||||
|
if (is_pf4(pi->adapter) != 0)
|
||||||
|
count += CXGBE_NB_PORT_STATS;
|
||||||
|
else
|
||||||
|
count += CXGBEVF_NB_PORT_STATS;
|
||||||
|
|
||||||
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cxgbe_dev_xstats(struct rte_eth_dev *dev,
|
static int cxgbe_dev_xstats(struct rte_eth_dev *dev,
|
||||||
@ -900,20 +922,28 @@ static int cxgbe_dev_xstats(struct rte_eth_dev *dev,
|
|||||||
struct port_info *pi = dev->data->dev_private;
|
struct port_info *pi = dev->data->dev_private;
|
||||||
struct adapter *adap = pi->adapter;
|
struct adapter *adap = pi->adapter;
|
||||||
struct sge *s = &adap->sge;
|
struct sge *s = &adap->sge;
|
||||||
|
u16 count, i, qid, nstats;
|
||||||
struct port_stats ps;
|
struct port_stats ps;
|
||||||
u16 count, i, qid;
|
|
||||||
u64 *stats_ptr;
|
u64 *stats_ptr;
|
||||||
|
|
||||||
count = cxgbe_dev_xstats_count(pi);
|
count = cxgbe_dev_xstats_count(pi);
|
||||||
if (size < count)
|
if (size < count)
|
||||||
return count;
|
return count;
|
||||||
|
|
||||||
/* port stats */
|
if (is_pf4(adap) != 0) {
|
||||||
cxgbe_stats_get(pi, &ps);
|
/* port stats for PF*/
|
||||||
|
cxgbe_stats_get(pi, &ps);
|
||||||
|
xstats_str = cxgbe_dev_port_stats_strings;
|
||||||
|
nstats = CXGBE_NB_PORT_STATS;
|
||||||
|
} else {
|
||||||
|
/* port stats for VF*/
|
||||||
|
cxgbevf_stats_get(pi, &ps);
|
||||||
|
xstats_str = cxgbevf_dev_port_stats_strings;
|
||||||
|
nstats = CXGBEVF_NB_PORT_STATS;
|
||||||
|
}
|
||||||
|
|
||||||
count = 0;
|
count = 0;
|
||||||
xstats_str = cxgbe_dev_port_stats_strings;
|
for (i = 0; i < nstats; i++, count++) {
|
||||||
for (i = 0; i < CXGBE_NB_PORT_STATS; i++, count++) {
|
|
||||||
if (xstats_names != NULL)
|
if (xstats_names != NULL)
|
||||||
snprintf(xstats_names[count].name,
|
snprintf(xstats_names[count].name,
|
||||||
sizeof(xstats_names[count].name),
|
sizeof(xstats_names[count].name),
|
||||||
@ -970,9 +1000,9 @@ static int cxgbe_dev_xstats(struct rte_eth_dev *dev,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Get port extended statistics by ID. */
|
/* Get port extended statistics by ID. */
|
||||||
static int cxgbe_dev_xstats_get_by_id(struct rte_eth_dev *dev,
|
int cxgbe_dev_xstats_get_by_id(struct rte_eth_dev *dev,
|
||||||
const uint64_t *ids, uint64_t *values,
|
const uint64_t *ids, uint64_t *values,
|
||||||
unsigned int n)
|
unsigned int n)
|
||||||
{
|
{
|
||||||
struct port_info *pi = dev->data->dev_private;
|
struct port_info *pi = dev->data->dev_private;
|
||||||
struct rte_eth_xstat *xstats_copy;
|
struct rte_eth_xstat *xstats_copy;
|
||||||
@ -1005,9 +1035,9 @@ out_err:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Get names of port extended statistics by ID. */
|
/* Get names of port extended statistics by ID. */
|
||||||
static int cxgbe_dev_xstats_get_names_by_id(struct rte_eth_dev *dev,
|
int cxgbe_dev_xstats_get_names_by_id(struct rte_eth_dev *dev,
|
||||||
struct rte_eth_xstat_name *xnames,
|
struct rte_eth_xstat_name *xnames,
|
||||||
const uint64_t *ids, unsigned int n)
|
const uint64_t *ids, unsigned int n)
|
||||||
{
|
{
|
||||||
struct port_info *pi = dev->data->dev_private;
|
struct port_info *pi = dev->data->dev_private;
|
||||||
struct rte_eth_xstat_name *xnames_copy;
|
struct rte_eth_xstat_name *xnames_copy;
|
||||||
@ -1041,16 +1071,16 @@ out_err:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Get port extended statistics. */
|
/* Get port extended statistics. */
|
||||||
static int cxgbe_dev_xstats_get(struct rte_eth_dev *dev,
|
int cxgbe_dev_xstats_get(struct rte_eth_dev *dev,
|
||||||
struct rte_eth_xstat *xstats, unsigned int n)
|
struct rte_eth_xstat *xstats, unsigned int n)
|
||||||
{
|
{
|
||||||
return cxgbe_dev_xstats(dev, NULL, xstats, n);
|
return cxgbe_dev_xstats(dev, NULL, xstats, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get names of port extended statistics. */
|
/* Get names of port extended statistics. */
|
||||||
static int cxgbe_dev_xstats_get_names(struct rte_eth_dev *dev,
|
int cxgbe_dev_xstats_get_names(struct rte_eth_dev *dev,
|
||||||
struct rte_eth_xstat_name *xstats_names,
|
struct rte_eth_xstat_name *xstats_names,
|
||||||
unsigned int n)
|
unsigned int n)
|
||||||
{
|
{
|
||||||
return cxgbe_dev_xstats(dev, xstats_names, NULL, n);
|
return cxgbe_dev_xstats(dev, xstats_names, NULL, n);
|
||||||
}
|
}
|
||||||
|
@ -52,4 +52,15 @@ uint16_t cxgbe_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
|
|||||||
uint16_t cxgbe_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
|
uint16_t cxgbe_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
|
||||||
uint16_t nb_pkts);
|
uint16_t nb_pkts);
|
||||||
const uint32_t *cxgbe_dev_supported_ptypes_get(struct rte_eth_dev *eth_dev);
|
const uint32_t *cxgbe_dev_supported_ptypes_get(struct rte_eth_dev *eth_dev);
|
||||||
|
int cxgbe_dev_xstats_get_by_id(struct rte_eth_dev *dev,
|
||||||
|
const uint64_t *ids, uint64_t *values,
|
||||||
|
unsigned int n);
|
||||||
|
int cxgbe_dev_xstats_get_names_by_id(struct rte_eth_dev *dev,
|
||||||
|
struct rte_eth_xstat_name *xnames,
|
||||||
|
const uint64_t *ids, unsigned int n);
|
||||||
|
int cxgbe_dev_xstats_get_names(struct rte_eth_dev *dev,
|
||||||
|
struct rte_eth_xstat_name *xstats_names,
|
||||||
|
unsigned int n);
|
||||||
|
int cxgbe_dev_xstats_get(struct rte_eth_dev *dev,
|
||||||
|
struct rte_eth_xstat *xstats, unsigned int n);
|
||||||
#endif /* _CXGBE_PFVF_H_ */
|
#endif /* _CXGBE_PFVF_H_ */
|
||||||
|
@ -54,22 +54,12 @@ static int cxgbevf_dev_stats_get(struct rte_eth_dev *eth_dev,
|
|||||||
eth_stats->oerrors = ps.tx_drop;
|
eth_stats->oerrors = ps.tx_drop;
|
||||||
|
|
||||||
for (i = 0; i < pi->n_rx_qsets; i++) {
|
for (i = 0; i < pi->n_rx_qsets; i++) {
|
||||||
struct sge_eth_rxq *rxq =
|
struct sge_eth_rxq *rxq = &s->ethrxq[pi->first_rxqset + i];
|
||||||
&s->ethrxq[pi->first_rxqset + i];
|
|
||||||
|
|
||||||
eth_stats->q_ipackets[i] = rxq->stats.pkts;
|
eth_stats->ipackets += rxq->stats.pkts;
|
||||||
eth_stats->q_ibytes[i] = rxq->stats.rx_bytes;
|
eth_stats->ibytes += rxq->stats.rx_bytes;
|
||||||
eth_stats->ipackets += eth_stats->q_ipackets[i];
|
|
||||||
eth_stats->ibytes += eth_stats->q_ibytes[i];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < pi->n_tx_qsets; i++) {
|
|
||||||
struct sge_eth_txq *txq =
|
|
||||||
&s->ethtxq[pi->first_txqset + i];
|
|
||||||
|
|
||||||
eth_stats->q_opackets[i] = txq->stats.pkts;
|
|
||||||
eth_stats->q_obytes[i] = txq->stats.tx_bytes;
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -97,6 +87,10 @@ static const struct eth_dev_ops cxgbevf_eth_dev_ops = {
|
|||||||
.rx_queue_stop = cxgbe_dev_rx_queue_stop,
|
.rx_queue_stop = cxgbe_dev_rx_queue_stop,
|
||||||
.rx_queue_release = cxgbe_dev_rx_queue_release,
|
.rx_queue_release = cxgbe_dev_rx_queue_release,
|
||||||
.stats_get = cxgbevf_dev_stats_get,
|
.stats_get = cxgbevf_dev_stats_get,
|
||||||
|
.xstats_get = cxgbe_dev_xstats_get,
|
||||||
|
.xstats_get_by_id = cxgbe_dev_xstats_get_by_id,
|
||||||
|
.xstats_get_names = cxgbe_dev_xstats_get_names,
|
||||||
|
.xstats_get_names_by_id = cxgbe_dev_xstats_get_names_by_id,
|
||||||
.mac_addr_set = cxgbe_mac_addr_set,
|
.mac_addr_set = cxgbe_mac_addr_set,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user