Commit 13f30b0f authored by Aharon Landau's avatar Aharon Landau Committed by Jason Gunthorpe
Browse files

RDMA/counter: Add a descriptor in struct rdma_hw_stats

Add a counter statistic descriptor structure in rdma_hw_stats. In addition
to the counter name, more meta-information will be added.  This code
extension is needed for optional-counter support in the following patches.

Link: https://lore.kernel.org/r/20211008122439.166063-4-markzhang@nvidia.com


Signed-off-by: default avatarAharon Landau <aharonl@nvidia.com>
Signed-off-by: default avatarLeon Romanovsky <leonro@nvidia.com>
Signed-off-by: default avatarMark Zhang <markzhang@nvidia.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
parent 3eea40d4
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -969,7 +969,8 @@ static int fill_stat_counter_hwcounters(struct sk_buff *msg,
		return -EMSGSIZE;

	for (i = 0; i < st->num_counters; i++)
		if (rdma_nl_stat_hwcounter_entry(msg, st->names[i], st->value[i]))
		if (rdma_nl_stat_hwcounter_entry(msg, st->descs[i].name,
						 st->value[i]))
			goto err;

	nla_nest_end(msg, table_attr);
@@ -2105,7 +2106,8 @@ static int stat_get_doit_default_counter(struct sk_buff *skb,
	for (i = 0; i < num_cnts; i++) {
		v = stats->value[i] +
			rdma_counter_get_hwstat_value(device, port, i);
		if (rdma_nl_stat_hwcounter_entry(msg, stats->names[i], v)) {
		if (rdma_nl_stat_hwcounter_entry(msg,
						 stats->descs[i].name, v)) {
			ret = -EMSGSIZE;
			goto err_table;
		}
+4 −4
Original line number Diff line number Diff line
@@ -895,7 +895,7 @@ alloc_hw_stats_device(struct ib_device *ibdev)
	stats = ibdev->ops.alloc_hw_device_stats(ibdev);
	if (!stats)
		return ERR_PTR(-ENOMEM);
	if (!stats->names || stats->num_counters <= 0)
	if (!stats->descs || stats->num_counters <= 0)
		goto err_free_stats;

	/*
@@ -957,7 +957,7 @@ int ib_setup_device_attrs(struct ib_device *ibdev)
	for (i = 0; i < data->stats->num_counters; i++) {
		attr = &data->attrs[i];
		sysfs_attr_init(&attr->attr.attr);
		attr->attr.attr.name = data->stats->names[i];
		attr->attr.attr.name = data->stats->descs[i].name;
		attr->attr.attr.mode = 0444;
		attr->attr.show = hw_stat_device_show;
		attr->show = show_hw_stats;
@@ -994,7 +994,7 @@ alloc_hw_stats_port(struct ib_port *port, struct attribute_group *group)
	stats = ibdev->ops.alloc_hw_port_stats(port->ibdev, port->port_num);
	if (!stats)
		return ERR_PTR(-ENOMEM);
	if (!stats->names || stats->num_counters <= 0)
	if (!stats->descs || stats->num_counters <= 0)
		goto err_free_stats;

	/*
@@ -1047,7 +1047,7 @@ static int setup_hw_port_stats(struct ib_port *port,
	for (i = 0; i < data->stats->num_counters; i++) {
		attr = &data->attrs[i];
		sysfs_attr_init(&attr->attr.attr);
		attr->attr.attr.name = data->stats->names[i];
		attr->attr.attr.name = data->stats->descs[i].name;
		attr->attr.attr.mode = 0444;
		attr->attr.show = hw_stat_port_show;
		attr->show = show_hw_stats;
+67 −70
Original line number Diff line number Diff line
@@ -57,74 +57,72 @@
#include "bnxt_re.h"
#include "hw_counters.h"

static const char * const bnxt_re_stat_name[] = {
	[BNXT_RE_ACTIVE_PD]		=  "active_pds",
	[BNXT_RE_ACTIVE_AH]		=  "active_ahs",
	[BNXT_RE_ACTIVE_QP]		=  "active_qps",
	[BNXT_RE_ACTIVE_SRQ]		=  "active_srqs",
	[BNXT_RE_ACTIVE_CQ]		=  "active_cqs",
	[BNXT_RE_ACTIVE_MR]		=  "active_mrs",
	[BNXT_RE_ACTIVE_MW]		=  "active_mws",
	[BNXT_RE_RX_PKTS]		=  "rx_pkts",
	[BNXT_RE_RX_BYTES]		=  "rx_bytes",
	[BNXT_RE_TX_PKTS]		=  "tx_pkts",
	[BNXT_RE_TX_BYTES]		=  "tx_bytes",
	[BNXT_RE_RECOVERABLE_ERRORS]	=  "recoverable_errors",
	[BNXT_RE_RX_ERRORS]		=  "rx_roce_errors",
	[BNXT_RE_RX_DISCARDS]		=  "rx_roce_discards",
	[BNXT_RE_TO_RETRANSMITS]        = "to_retransmits",
	[BNXT_RE_SEQ_ERR_NAKS_RCVD]     = "seq_err_naks_rcvd",
	[BNXT_RE_MAX_RETRY_EXCEEDED]    = "max_retry_exceeded",
	[BNXT_RE_RNR_NAKS_RCVD]         = "rnr_naks_rcvd",
	[BNXT_RE_MISSING_RESP]          = "missing_resp",
	[BNXT_RE_UNRECOVERABLE_ERR]     = "unrecoverable_err",
	[BNXT_RE_BAD_RESP_ERR]          = "bad_resp_err",
	[BNXT_RE_LOCAL_QP_OP_ERR]       = "local_qp_op_err",
	[BNXT_RE_LOCAL_PROTECTION_ERR]  = "local_protection_err",
	[BNXT_RE_MEM_MGMT_OP_ERR]       = "mem_mgmt_op_err",
	[BNXT_RE_REMOTE_INVALID_REQ_ERR] = "remote_invalid_req_err",
	[BNXT_RE_REMOTE_ACCESS_ERR]     = "remote_access_err",
	[BNXT_RE_REMOTE_OP_ERR]         = "remote_op_err",
	[BNXT_RE_DUP_REQ]               = "dup_req",
	[BNXT_RE_RES_EXCEED_MAX]        = "res_exceed_max",
	[BNXT_RE_RES_LENGTH_MISMATCH]   = "res_length_mismatch",
	[BNXT_RE_RES_EXCEEDS_WQE]       = "res_exceeds_wqe",
	[BNXT_RE_RES_OPCODE_ERR]        = "res_opcode_err",
	[BNXT_RE_RES_RX_INVALID_RKEY]   = "res_rx_invalid_rkey",
	[BNXT_RE_RES_RX_DOMAIN_ERR]     = "res_rx_domain_err",
	[BNXT_RE_RES_RX_NO_PERM]        = "res_rx_no_perm",
	[BNXT_RE_RES_RX_RANGE_ERR]      = "res_rx_range_err",
	[BNXT_RE_RES_TX_INVALID_RKEY]   = "res_tx_invalid_rkey",
	[BNXT_RE_RES_TX_DOMAIN_ERR]     = "res_tx_domain_err",
	[BNXT_RE_RES_TX_NO_PERM]        = "res_tx_no_perm",
	[BNXT_RE_RES_TX_RANGE_ERR]      = "res_tx_range_err",
	[BNXT_RE_RES_IRRQ_OFLOW]        = "res_irrq_oflow",
	[BNXT_RE_RES_UNSUP_OPCODE]      = "res_unsup_opcode",
	[BNXT_RE_RES_UNALIGNED_ATOMIC]  = "res_unaligned_atomic",
	[BNXT_RE_RES_REM_INV_ERR]       = "res_rem_inv_err",
	[BNXT_RE_RES_MEM_ERROR]         = "res_mem_err",
	[BNXT_RE_RES_SRQ_ERR]           = "res_srq_err",
	[BNXT_RE_RES_CMP_ERR]           = "res_cmp_err",
	[BNXT_RE_RES_INVALID_DUP_RKEY]  = "res_invalid_dup_rkey",
	[BNXT_RE_RES_WQE_FORMAT_ERR]    = "res_wqe_format_err",
	[BNXT_RE_RES_CQ_LOAD_ERR]       = "res_cq_load_err",
	[BNXT_RE_RES_SRQ_LOAD_ERR]      = "res_srq_load_err",
	[BNXT_RE_RES_TX_PCI_ERR]        = "res_tx_pci_err",
	[BNXT_RE_RES_RX_PCI_ERR]        = "res_rx_pci_err",
	[BNXT_RE_OUT_OF_SEQ_ERR]        = "oos_drop_count",
	[BNXT_RE_TX_ATOMIC_REQ]		= "tx_atomic_req",
	[BNXT_RE_TX_READ_REQ]		= "tx_read_req",
	[BNXT_RE_TX_READ_RES]		= "tx_read_resp",
	[BNXT_RE_TX_WRITE_REQ]		= "tx_write_req",
	[BNXT_RE_TX_SEND_REQ]		= "tx_send_req",
	[BNXT_RE_RX_ATOMIC_REQ]		= "rx_atomic_req",
	[BNXT_RE_RX_READ_REQ]		= "rx_read_req",
	[BNXT_RE_RX_READ_RESP]		= "rx_read_resp",
	[BNXT_RE_RX_WRITE_REQ]		= "rx_write_req",
	[BNXT_RE_RX_SEND_REQ]		= "rx_send_req",
	[BNXT_RE_RX_ROCE_GOOD_PKTS]	= "rx_roce_good_pkts",
	[BNXT_RE_RX_ROCE_GOOD_BYTES]	= "rx_roce_good_bytes",
	[BNXT_RE_OOB]			= "rx_out_of_buffer"
static const struct rdma_stat_desc bnxt_re_stat_descs[] = {
	[BNXT_RE_ACTIVE_QP].name		=  "active_qps",
	[BNXT_RE_ACTIVE_SRQ].name		=  "active_srqs",
	[BNXT_RE_ACTIVE_CQ].name		=  "active_cqs",
	[BNXT_RE_ACTIVE_MR].name		=  "active_mrs",
	[BNXT_RE_ACTIVE_MW].name		=  "active_mws",
	[BNXT_RE_RX_PKTS].name		=  "rx_pkts",
	[BNXT_RE_RX_BYTES].name		=  "rx_bytes",
	[BNXT_RE_TX_PKTS].name		=  "tx_pkts",
	[BNXT_RE_TX_BYTES].name		=  "tx_bytes",
	[BNXT_RE_RECOVERABLE_ERRORS].name	=  "recoverable_errors",
	[BNXT_RE_RX_ERRORS].name		=  "rx_roce_errors",
	[BNXT_RE_RX_DISCARDS].name		=  "rx_roce_discards",
	[BNXT_RE_TO_RETRANSMITS].name        = "to_retransmits",
	[BNXT_RE_SEQ_ERR_NAKS_RCVD].name     = "seq_err_naks_rcvd",
	[BNXT_RE_MAX_RETRY_EXCEEDED].name    = "max_retry_exceeded",
	[BNXT_RE_RNR_NAKS_RCVD].name         = "rnr_naks_rcvd",
	[BNXT_RE_MISSING_RESP].name          = "missing_resp",
	[BNXT_RE_UNRECOVERABLE_ERR].name     = "unrecoverable_err",
	[BNXT_RE_BAD_RESP_ERR].name          = "bad_resp_err",
	[BNXT_RE_LOCAL_QP_OP_ERR].name       = "local_qp_op_err",
	[BNXT_RE_LOCAL_PROTECTION_ERR].name  = "local_protection_err",
	[BNXT_RE_MEM_MGMT_OP_ERR].name       = "mem_mgmt_op_err",
	[BNXT_RE_REMOTE_INVALID_REQ_ERR].name = "remote_invalid_req_err",
	[BNXT_RE_REMOTE_ACCESS_ERR].name     = "remote_access_err",
	[BNXT_RE_REMOTE_OP_ERR].name         = "remote_op_err",
	[BNXT_RE_DUP_REQ].name               = "dup_req",
	[BNXT_RE_RES_EXCEED_MAX].name        = "res_exceed_max",
	[BNXT_RE_RES_LENGTH_MISMATCH].name   = "res_length_mismatch",
	[BNXT_RE_RES_EXCEEDS_WQE].name       = "res_exceeds_wqe",
	[BNXT_RE_RES_OPCODE_ERR].name        = "res_opcode_err",
	[BNXT_RE_RES_RX_INVALID_RKEY].name   = "res_rx_invalid_rkey",
	[BNXT_RE_RES_RX_DOMAIN_ERR].name     = "res_rx_domain_err",
	[BNXT_RE_RES_RX_NO_PERM].name        = "res_rx_no_perm",
	[BNXT_RE_RES_RX_RANGE_ERR].name      = "res_rx_range_err",
	[BNXT_RE_RES_TX_INVALID_RKEY].name   = "res_tx_invalid_rkey",
	[BNXT_RE_RES_TX_DOMAIN_ERR].name     = "res_tx_domain_err",
	[BNXT_RE_RES_TX_NO_PERM].name        = "res_tx_no_perm",
	[BNXT_RE_RES_TX_RANGE_ERR].name      = "res_tx_range_err",
	[BNXT_RE_RES_IRRQ_OFLOW].name        = "res_irrq_oflow",
	[BNXT_RE_RES_UNSUP_OPCODE].name      = "res_unsup_opcode",
	[BNXT_RE_RES_UNALIGNED_ATOMIC].name  = "res_unaligned_atomic",
	[BNXT_RE_RES_REM_INV_ERR].name       = "res_rem_inv_err",
	[BNXT_RE_RES_MEM_ERROR].name         = "res_mem_err",
	[BNXT_RE_RES_SRQ_ERR].name           = "res_srq_err",
	[BNXT_RE_RES_CMP_ERR].name           = "res_cmp_err",
	[BNXT_RE_RES_INVALID_DUP_RKEY].name  = "res_invalid_dup_rkey",
	[BNXT_RE_RES_WQE_FORMAT_ERR].name    = "res_wqe_format_err",
	[BNXT_RE_RES_CQ_LOAD_ERR].name       = "res_cq_load_err",
	[BNXT_RE_RES_SRQ_LOAD_ERR].name      = "res_srq_load_err",
	[BNXT_RE_RES_TX_PCI_ERR].name        = "res_tx_pci_err",
	[BNXT_RE_RES_RX_PCI_ERR].name        = "res_rx_pci_err",
	[BNXT_RE_OUT_OF_SEQ_ERR].name        = "oos_drop_count",
	[BNXT_RE_TX_ATOMIC_REQ].name	     = "tx_atomic_req",
	[BNXT_RE_TX_READ_REQ].name	     = "tx_read_req",
	[BNXT_RE_TX_READ_RES].name	     = "tx_read_resp",
	[BNXT_RE_TX_WRITE_REQ].name	     = "tx_write_req",
	[BNXT_RE_TX_SEND_REQ].name	     = "tx_send_req",
	[BNXT_RE_RX_ATOMIC_REQ].name	     = "rx_atomic_req",
	[BNXT_RE_RX_READ_REQ].name	     = "rx_read_req",
	[BNXT_RE_RX_READ_RESP].name	     = "rx_read_resp",
	[BNXT_RE_RX_WRITE_REQ].name	     = "rx_write_req",
	[BNXT_RE_RX_SEND_REQ].name	     = "rx_send_req",
	[BNXT_RE_RX_ROCE_GOOD_PKTS].name     = "rx_roce_good_pkts",
	[BNXT_RE_RX_ROCE_GOOD_BYTES].name    = "rx_roce_good_bytes",
	[BNXT_RE_OOB].name		     = "rx_out_of_buffer"
};

static void bnxt_re_copy_ext_stats(struct bnxt_re_dev *rdev,
@@ -322,7 +320,6 @@ struct rdma_hw_stats *bnxt_re_ib_alloc_hw_port_stats(struct ib_device *ibdev,
	else
		num_counters = BNXT_RE_NUM_STD_COUNTERS;

	return rdma_alloc_hw_stats_struct(bnxt_re_stat_name,
					  num_counters,
	return rdma_alloc_hw_stats_struct(bnxt_re_stat_descs, num_counters,
					  RDMA_HW_STATS_DEFAULT_LIFESPAN);
}
+11 −11
Original line number Diff line number Diff line
@@ -366,23 +366,23 @@ enum counters {
	NR_COUNTERS
};

static const char * const names[] = {
	[IP4INSEGS] = "ip4InSegs",
	[IP4OUTSEGS] = "ip4OutSegs",
	[IP4RETRANSSEGS] = "ip4RetransSegs",
	[IP4OUTRSTS] = "ip4OutRsts",
	[IP6INSEGS] = "ip6InSegs",
	[IP6OUTSEGS] = "ip6OutSegs",
	[IP6RETRANSSEGS] = "ip6RetransSegs",
	[IP6OUTRSTS] = "ip6OutRsts"
static const struct rdma_stat_desc cxgb4_descs[] = {
	[IP4INSEGS].name = "ip4InSegs",
	[IP4OUTSEGS].name = "ip4OutSegs",
	[IP4RETRANSSEGS].name = "ip4RetransSegs",
	[IP4OUTRSTS].name = "ip4OutRsts",
	[IP6INSEGS].name = "ip6InSegs",
	[IP6OUTSEGS].name = "ip6OutSegs",
	[IP6RETRANSSEGS].name = "ip6RetransSegs",
	[IP6OUTRSTS].name = "ip6OutRsts"
};

static struct rdma_hw_stats *c4iw_alloc_device_stats(struct ib_device *ibdev)
{
	BUILD_BUG_ON(ARRAY_SIZE(names) != NR_COUNTERS);
	BUILD_BUG_ON(ARRAY_SIZE(cxgb4_descs) != NR_COUNTERS);

	/* FIXME: these look like port stats */
	return rdma_alloc_hw_stats_struct(names, NR_COUNTERS,
	return rdma_alloc_hw_stats_struct(cxgb4_descs, NR_COUNTERS,
					  RDMA_HW_STATS_DEFAULT_LIFESPAN);
}

+10 −9
Original line number Diff line number Diff line
@@ -60,13 +60,14 @@ struct efa_user_mmap_entry {
	op(EFA_RDMA_READ_RESP_BYTES, "rdma_read_resp_bytes") \

#define EFA_STATS_ENUM(ename, name) ename,
#define EFA_STATS_STR(ename, name) [ename] = name,
#define EFA_STATS_STR(ename, nam) \
	[ename].name = nam,

enum efa_hw_device_stats {
	EFA_DEFINE_DEVICE_STATS(EFA_STATS_ENUM)
};

static const char *const efa_device_stats_names[] = {
static const struct rdma_stat_desc efa_device_stats_descs[] = {
	EFA_DEFINE_DEVICE_STATS(EFA_STATS_STR)
};

@@ -74,7 +75,7 @@ enum efa_hw_port_stats {
	EFA_DEFINE_PORT_STATS(EFA_STATS_ENUM)
};

static const char *const efa_port_stats_names[] = {
static const struct rdma_stat_desc efa_port_stats_descs[] = {
	EFA_DEFINE_PORT_STATS(EFA_STATS_STR)
};

@@ -1959,15 +1960,15 @@ int efa_destroy_ah(struct ib_ah *ibah, u32 flags)
struct rdma_hw_stats *efa_alloc_hw_port_stats(struct ib_device *ibdev,
					      u32 port_num)
{
	return rdma_alloc_hw_stats_struct(efa_port_stats_names,
					  ARRAY_SIZE(efa_port_stats_names),
	return rdma_alloc_hw_stats_struct(efa_port_stats_descs,
					  ARRAY_SIZE(efa_port_stats_descs),
					  RDMA_HW_STATS_DEFAULT_LIFESPAN);
}

struct rdma_hw_stats *efa_alloc_hw_device_stats(struct ib_device *ibdev)
{
	return rdma_alloc_hw_stats_struct(efa_device_stats_names,
					  ARRAY_SIZE(efa_device_stats_names),
	return rdma_alloc_hw_stats_struct(efa_device_stats_descs,
					  ARRAY_SIZE(efa_device_stats_descs),
					  RDMA_HW_STATS_DEFAULT_LIFESPAN);
}

@@ -1992,7 +1993,7 @@ static int efa_fill_device_stats(struct efa_dev *dev,
	stats->value[EFA_CREATE_AH_ERR] = atomic64_read(&s->create_ah_err);
	stats->value[EFA_MMAP_ERR] = atomic64_read(&s->mmap_err);

	return ARRAY_SIZE(efa_device_stats_names);
	return ARRAY_SIZE(efa_device_stats_descs);
}

static int efa_fill_port_stats(struct efa_dev *dev, struct rdma_hw_stats *stats,
@@ -2041,7 +2042,7 @@ static int efa_fill_port_stats(struct efa_dev *dev, struct rdma_hw_stats *stats,
	stats->value[EFA_RDMA_READ_WR_ERR] = rrs->read_wr_err;
	stats->value[EFA_RDMA_READ_RESP_BYTES] = rrs->read_resp_bytes;

	return ARRAY_SIZE(efa_port_stats_names);
	return ARRAY_SIZE(efa_port_stats_descs);
}

int efa_get_hw_stats(struct ib_device *ibdev, struct rdma_hw_stats *stats,
Loading