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

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.comSigned-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
...@@ -969,7 +969,8 @@ static int fill_stat_counter_hwcounters(struct sk_buff *msg, ...@@ -969,7 +969,8 @@ static int fill_stat_counter_hwcounters(struct sk_buff *msg,
return -EMSGSIZE; return -EMSGSIZE;
for (i = 0; i < st->num_counters; i++) 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; goto err;
nla_nest_end(msg, table_attr); nla_nest_end(msg, table_attr);
...@@ -2105,7 +2106,8 @@ static int stat_get_doit_default_counter(struct sk_buff *skb, ...@@ -2105,7 +2106,8 @@ static int stat_get_doit_default_counter(struct sk_buff *skb,
for (i = 0; i < num_cnts; i++) { for (i = 0; i < num_cnts; i++) {
v = stats->value[i] + v = stats->value[i] +
rdma_counter_get_hwstat_value(device, port, 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; ret = -EMSGSIZE;
goto err_table; goto err_table;
} }
......
...@@ -895,7 +895,7 @@ alloc_hw_stats_device(struct ib_device *ibdev) ...@@ -895,7 +895,7 @@ alloc_hw_stats_device(struct ib_device *ibdev)
stats = ibdev->ops.alloc_hw_device_stats(ibdev); stats = ibdev->ops.alloc_hw_device_stats(ibdev);
if (!stats) if (!stats)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
if (!stats->names || stats->num_counters <= 0) if (!stats->descs || stats->num_counters <= 0)
goto err_free_stats; goto err_free_stats;
/* /*
...@@ -957,7 +957,7 @@ int ib_setup_device_attrs(struct ib_device *ibdev) ...@@ -957,7 +957,7 @@ int ib_setup_device_attrs(struct ib_device *ibdev)
for (i = 0; i < data->stats->num_counters; i++) { for (i = 0; i < data->stats->num_counters; i++) {
attr = &data->attrs[i]; attr = &data->attrs[i];
sysfs_attr_init(&attr->attr.attr); 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.attr.mode = 0444;
attr->attr.show = hw_stat_device_show; attr->attr.show = hw_stat_device_show;
attr->show = show_hw_stats; attr->show = show_hw_stats;
...@@ -994,7 +994,7 @@ alloc_hw_stats_port(struct ib_port *port, struct attribute_group *group) ...@@ -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); stats = ibdev->ops.alloc_hw_port_stats(port->ibdev, port->port_num);
if (!stats) if (!stats)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
if (!stats->names || stats->num_counters <= 0) if (!stats->descs || stats->num_counters <= 0)
goto err_free_stats; goto err_free_stats;
/* /*
...@@ -1047,7 +1047,7 @@ static int setup_hw_port_stats(struct ib_port *port, ...@@ -1047,7 +1047,7 @@ static int setup_hw_port_stats(struct ib_port *port,
for (i = 0; i < data->stats->num_counters; i++) { for (i = 0; i < data->stats->num_counters; i++) {
attr = &data->attrs[i]; attr = &data->attrs[i];
sysfs_attr_init(&attr->attr.attr); 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.attr.mode = 0444;
attr->attr.show = hw_stat_port_show; attr->attr.show = hw_stat_port_show;
attr->show = show_hw_stats; attr->show = show_hw_stats;
......
...@@ -57,74 +57,72 @@ ...@@ -57,74 +57,72 @@
#include "bnxt_re.h" #include "bnxt_re.h"
#include "hw_counters.h" #include "hw_counters.h"
static const char * const bnxt_re_stat_name[] = { static const struct rdma_stat_desc bnxt_re_stat_descs[] = {
[BNXT_RE_ACTIVE_PD] = "active_pds", [BNXT_RE_ACTIVE_QP].name = "active_qps",
[BNXT_RE_ACTIVE_AH] = "active_ahs", [BNXT_RE_ACTIVE_SRQ].name = "active_srqs",
[BNXT_RE_ACTIVE_QP] = "active_qps", [BNXT_RE_ACTIVE_CQ].name = "active_cqs",
[BNXT_RE_ACTIVE_SRQ] = "active_srqs", [BNXT_RE_ACTIVE_MR].name = "active_mrs",
[BNXT_RE_ACTIVE_CQ] = "active_cqs", [BNXT_RE_ACTIVE_MW].name = "active_mws",
[BNXT_RE_ACTIVE_MR] = "active_mrs", [BNXT_RE_RX_PKTS].name = "rx_pkts",
[BNXT_RE_ACTIVE_MW] = "active_mws", [BNXT_RE_RX_BYTES].name = "rx_bytes",
[BNXT_RE_RX_PKTS] = "rx_pkts", [BNXT_RE_TX_PKTS].name = "tx_pkts",
[BNXT_RE_RX_BYTES] = "rx_bytes", [BNXT_RE_TX_BYTES].name = "tx_bytes",
[BNXT_RE_TX_PKTS] = "tx_pkts", [BNXT_RE_RECOVERABLE_ERRORS].name = "recoverable_errors",
[BNXT_RE_TX_BYTES] = "tx_bytes", [BNXT_RE_RX_ERRORS].name = "rx_roce_errors",
[BNXT_RE_RECOVERABLE_ERRORS] = "recoverable_errors", [BNXT_RE_RX_DISCARDS].name = "rx_roce_discards",
[BNXT_RE_RX_ERRORS] = "rx_roce_errors", [BNXT_RE_TO_RETRANSMITS].name = "to_retransmits",
[BNXT_RE_RX_DISCARDS] = "rx_roce_discards", [BNXT_RE_SEQ_ERR_NAKS_RCVD].name = "seq_err_naks_rcvd",
[BNXT_RE_TO_RETRANSMITS] = "to_retransmits", [BNXT_RE_MAX_RETRY_EXCEEDED].name = "max_retry_exceeded",
[BNXT_RE_SEQ_ERR_NAKS_RCVD] = "seq_err_naks_rcvd", [BNXT_RE_RNR_NAKS_RCVD].name = "rnr_naks_rcvd",
[BNXT_RE_MAX_RETRY_EXCEEDED] = "max_retry_exceeded", [BNXT_RE_MISSING_RESP].name = "missing_resp",
[BNXT_RE_RNR_NAKS_RCVD] = "rnr_naks_rcvd", [BNXT_RE_UNRECOVERABLE_ERR].name = "unrecoverable_err",
[BNXT_RE_MISSING_RESP] = "missing_resp", [BNXT_RE_BAD_RESP_ERR].name = "bad_resp_err",
[BNXT_RE_UNRECOVERABLE_ERR] = "unrecoverable_err", [BNXT_RE_LOCAL_QP_OP_ERR].name = "local_qp_op_err",
[BNXT_RE_BAD_RESP_ERR] = "bad_resp_err", [BNXT_RE_LOCAL_PROTECTION_ERR].name = "local_protection_err",
[BNXT_RE_LOCAL_QP_OP_ERR] = "local_qp_op_err", [BNXT_RE_MEM_MGMT_OP_ERR].name = "mem_mgmt_op_err",
[BNXT_RE_LOCAL_PROTECTION_ERR] = "local_protection_err", [BNXT_RE_REMOTE_INVALID_REQ_ERR].name = "remote_invalid_req_err",
[BNXT_RE_MEM_MGMT_OP_ERR] = "mem_mgmt_op_err", [BNXT_RE_REMOTE_ACCESS_ERR].name = "remote_access_err",
[BNXT_RE_REMOTE_INVALID_REQ_ERR] = "remote_invalid_req_err", [BNXT_RE_REMOTE_OP_ERR].name = "remote_op_err",
[BNXT_RE_REMOTE_ACCESS_ERR] = "remote_access_err", [BNXT_RE_DUP_REQ].name = "dup_req",
[BNXT_RE_REMOTE_OP_ERR] = "remote_op_err", [BNXT_RE_RES_EXCEED_MAX].name = "res_exceed_max",
[BNXT_RE_DUP_REQ] = "dup_req", [BNXT_RE_RES_LENGTH_MISMATCH].name = "res_length_mismatch",
[BNXT_RE_RES_EXCEED_MAX] = "res_exceed_max", [BNXT_RE_RES_EXCEEDS_WQE].name = "res_exceeds_wqe",
[BNXT_RE_RES_LENGTH_MISMATCH] = "res_length_mismatch", [BNXT_RE_RES_OPCODE_ERR].name = "res_opcode_err",
[BNXT_RE_RES_EXCEEDS_WQE] = "res_exceeds_wqe", [BNXT_RE_RES_RX_INVALID_RKEY].name = "res_rx_invalid_rkey",
[BNXT_RE_RES_OPCODE_ERR] = "res_opcode_err", [BNXT_RE_RES_RX_DOMAIN_ERR].name = "res_rx_domain_err",
[BNXT_RE_RES_RX_INVALID_RKEY] = "res_rx_invalid_rkey", [BNXT_RE_RES_RX_NO_PERM].name = "res_rx_no_perm",
[BNXT_RE_RES_RX_DOMAIN_ERR] = "res_rx_domain_err", [BNXT_RE_RES_RX_RANGE_ERR].name = "res_rx_range_err",
[BNXT_RE_RES_RX_NO_PERM] = "res_rx_no_perm", [BNXT_RE_RES_TX_INVALID_RKEY].name = "res_tx_invalid_rkey",
[BNXT_RE_RES_RX_RANGE_ERR] = "res_rx_range_err", [BNXT_RE_RES_TX_DOMAIN_ERR].name = "res_tx_domain_err",
[BNXT_RE_RES_TX_INVALID_RKEY] = "res_tx_invalid_rkey", [BNXT_RE_RES_TX_NO_PERM].name = "res_tx_no_perm",
[BNXT_RE_RES_TX_DOMAIN_ERR] = "res_tx_domain_err", [BNXT_RE_RES_TX_RANGE_ERR].name = "res_tx_range_err",
[BNXT_RE_RES_TX_NO_PERM] = "res_tx_no_perm", [BNXT_RE_RES_IRRQ_OFLOW].name = "res_irrq_oflow",
[BNXT_RE_RES_TX_RANGE_ERR] = "res_tx_range_err", [BNXT_RE_RES_UNSUP_OPCODE].name = "res_unsup_opcode",
[BNXT_RE_RES_IRRQ_OFLOW] = "res_irrq_oflow", [BNXT_RE_RES_UNALIGNED_ATOMIC].name = "res_unaligned_atomic",
[BNXT_RE_RES_UNSUP_OPCODE] = "res_unsup_opcode", [BNXT_RE_RES_REM_INV_ERR].name = "res_rem_inv_err",
[BNXT_RE_RES_UNALIGNED_ATOMIC] = "res_unaligned_atomic", [BNXT_RE_RES_MEM_ERROR].name = "res_mem_err",
[BNXT_RE_RES_REM_INV_ERR] = "res_rem_inv_err", [BNXT_RE_RES_SRQ_ERR].name = "res_srq_err",
[BNXT_RE_RES_MEM_ERROR] = "res_mem_err", [BNXT_RE_RES_CMP_ERR].name = "res_cmp_err",
[BNXT_RE_RES_SRQ_ERR] = "res_srq_err", [BNXT_RE_RES_INVALID_DUP_RKEY].name = "res_invalid_dup_rkey",
[BNXT_RE_RES_CMP_ERR] = "res_cmp_err", [BNXT_RE_RES_WQE_FORMAT_ERR].name = "res_wqe_format_err",
[BNXT_RE_RES_INVALID_DUP_RKEY] = "res_invalid_dup_rkey", [BNXT_RE_RES_CQ_LOAD_ERR].name = "res_cq_load_err",
[BNXT_RE_RES_WQE_FORMAT_ERR] = "res_wqe_format_err", [BNXT_RE_RES_SRQ_LOAD_ERR].name = "res_srq_load_err",
[BNXT_RE_RES_CQ_LOAD_ERR] = "res_cq_load_err", [BNXT_RE_RES_TX_PCI_ERR].name = "res_tx_pci_err",
[BNXT_RE_RES_SRQ_LOAD_ERR] = "res_srq_load_err", [BNXT_RE_RES_RX_PCI_ERR].name = "res_rx_pci_err",
[BNXT_RE_RES_TX_PCI_ERR] = "res_tx_pci_err", [BNXT_RE_OUT_OF_SEQ_ERR].name = "oos_drop_count",
[BNXT_RE_RES_RX_PCI_ERR] = "res_rx_pci_err", [BNXT_RE_TX_ATOMIC_REQ].name = "tx_atomic_req",
[BNXT_RE_OUT_OF_SEQ_ERR] = "oos_drop_count", [BNXT_RE_TX_READ_REQ].name = "tx_read_req",
[BNXT_RE_TX_ATOMIC_REQ] = "tx_atomic_req", [BNXT_RE_TX_READ_RES].name = "tx_read_resp",
[BNXT_RE_TX_READ_REQ] = "tx_read_req", [BNXT_RE_TX_WRITE_REQ].name = "tx_write_req",
[BNXT_RE_TX_READ_RES] = "tx_read_resp", [BNXT_RE_TX_SEND_REQ].name = "tx_send_req",
[BNXT_RE_TX_WRITE_REQ] = "tx_write_req", [BNXT_RE_RX_ATOMIC_REQ].name = "rx_atomic_req",
[BNXT_RE_TX_SEND_REQ] = "tx_send_req", [BNXT_RE_RX_READ_REQ].name = "rx_read_req",
[BNXT_RE_RX_ATOMIC_REQ] = "rx_atomic_req", [BNXT_RE_RX_READ_RESP].name = "rx_read_resp",
[BNXT_RE_RX_READ_REQ] = "rx_read_req", [BNXT_RE_RX_WRITE_REQ].name = "rx_write_req",
[BNXT_RE_RX_READ_RESP] = "rx_read_resp", [BNXT_RE_RX_SEND_REQ].name = "rx_send_req",
[BNXT_RE_RX_WRITE_REQ] = "rx_write_req", [BNXT_RE_RX_ROCE_GOOD_PKTS].name = "rx_roce_good_pkts",
[BNXT_RE_RX_SEND_REQ] = "rx_send_req", [BNXT_RE_RX_ROCE_GOOD_BYTES].name = "rx_roce_good_bytes",
[BNXT_RE_RX_ROCE_GOOD_PKTS] = "rx_roce_good_pkts", [BNXT_RE_OOB].name = "rx_out_of_buffer"
[BNXT_RE_RX_ROCE_GOOD_BYTES] = "rx_roce_good_bytes",
[BNXT_RE_OOB] = "rx_out_of_buffer"
}; };
static void bnxt_re_copy_ext_stats(struct bnxt_re_dev *rdev, 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, ...@@ -322,7 +320,6 @@ struct rdma_hw_stats *bnxt_re_ib_alloc_hw_port_stats(struct ib_device *ibdev,
else else
num_counters = BNXT_RE_NUM_STD_COUNTERS; num_counters = BNXT_RE_NUM_STD_COUNTERS;
return rdma_alloc_hw_stats_struct(bnxt_re_stat_name, return rdma_alloc_hw_stats_struct(bnxt_re_stat_descs, num_counters,
num_counters,
RDMA_HW_STATS_DEFAULT_LIFESPAN); RDMA_HW_STATS_DEFAULT_LIFESPAN);
} }
...@@ -366,23 +366,23 @@ enum counters { ...@@ -366,23 +366,23 @@ enum counters {
NR_COUNTERS NR_COUNTERS
}; };
static const char * const names[] = { static const struct rdma_stat_desc cxgb4_descs[] = {
[IP4INSEGS] = "ip4InSegs", [IP4INSEGS].name = "ip4InSegs",
[IP4OUTSEGS] = "ip4OutSegs", [IP4OUTSEGS].name = "ip4OutSegs",
[IP4RETRANSSEGS] = "ip4RetransSegs", [IP4RETRANSSEGS].name = "ip4RetransSegs",
[IP4OUTRSTS] = "ip4OutRsts", [IP4OUTRSTS].name = "ip4OutRsts",
[IP6INSEGS] = "ip6InSegs", [IP6INSEGS].name = "ip6InSegs",
[IP6OUTSEGS] = "ip6OutSegs", [IP6OUTSEGS].name = "ip6OutSegs",
[IP6RETRANSSEGS] = "ip6RetransSegs", [IP6RETRANSSEGS].name = "ip6RetransSegs",
[IP6OUTRSTS] = "ip6OutRsts" [IP6OUTRSTS].name = "ip6OutRsts"
}; };
static struct rdma_hw_stats *c4iw_alloc_device_stats(struct ib_device *ibdev) 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 */ /* 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); RDMA_HW_STATS_DEFAULT_LIFESPAN);
} }
......
...@@ -60,13 +60,14 @@ struct efa_user_mmap_entry { ...@@ -60,13 +60,14 @@ struct efa_user_mmap_entry {
op(EFA_RDMA_READ_RESP_BYTES, "rdma_read_resp_bytes") \ op(EFA_RDMA_READ_RESP_BYTES, "rdma_read_resp_bytes") \
#define EFA_STATS_ENUM(ename, name) ename, #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 { enum efa_hw_device_stats {
EFA_DEFINE_DEVICE_STATS(EFA_STATS_ENUM) 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) EFA_DEFINE_DEVICE_STATS(EFA_STATS_STR)
}; };
...@@ -74,7 +75,7 @@ enum efa_hw_port_stats { ...@@ -74,7 +75,7 @@ enum efa_hw_port_stats {
EFA_DEFINE_PORT_STATS(EFA_STATS_ENUM) 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) EFA_DEFINE_PORT_STATS(EFA_STATS_STR)
}; };
...@@ -1959,15 +1960,15 @@ int efa_destroy_ah(struct ib_ah *ibah, u32 flags) ...@@ -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, struct rdma_hw_stats *efa_alloc_hw_port_stats(struct ib_device *ibdev,
u32 port_num) u32 port_num)
{ {
return rdma_alloc_hw_stats_struct(efa_port_stats_names, return rdma_alloc_hw_stats_struct(efa_port_stats_descs,
ARRAY_SIZE(efa_port_stats_names), ARRAY_SIZE(efa_port_stats_descs),
RDMA_HW_STATS_DEFAULT_LIFESPAN); RDMA_HW_STATS_DEFAULT_LIFESPAN);
} }
struct rdma_hw_stats *efa_alloc_hw_device_stats(struct ib_device *ibdev) struct rdma_hw_stats *efa_alloc_hw_device_stats(struct ib_device *ibdev)
{ {
return rdma_alloc_hw_stats_struct(efa_device_stats_names, return rdma_alloc_hw_stats_struct(efa_device_stats_descs,
ARRAY_SIZE(efa_device_stats_names), ARRAY_SIZE(efa_device_stats_descs),
RDMA_HW_STATS_DEFAULT_LIFESPAN); RDMA_HW_STATS_DEFAULT_LIFESPAN);
} }
...@@ -1992,7 +1993,7 @@ static int efa_fill_device_stats(struct efa_dev *dev, ...@@ -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_CREATE_AH_ERR] = atomic64_read(&s->create_ah_err);
stats->value[EFA_MMAP_ERR] = atomic64_read(&s->mmap_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, 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, ...@@ -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_WR_ERR] = rrs->read_wr_err;
stats->value[EFA_RDMA_READ_RESP_BYTES] = rrs->read_resp_bytes; 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, int efa_get_hw_stats(struct ib_device *ibdev, struct rdma_hw_stats *stats,
......
...@@ -1602,8 +1602,8 @@ static const char * const driver_cntr_names[] = { ...@@ -1602,8 +1602,8 @@ static const char * const driver_cntr_names[] = {
}; };
static DEFINE_MUTEX(cntr_names_lock); /* protects the *_cntr_names bufers */ static DEFINE_MUTEX(cntr_names_lock); /* protects the *_cntr_names bufers */
static const char **dev_cntr_names; static struct rdma_stat_desc *dev_cntr_descs;
static const char **port_cntr_names; static struct rdma_stat_desc *port_cntr_descs;
int num_driver_cntrs = ARRAY_SIZE(driver_cntr_names); int num_driver_cntrs = ARRAY_SIZE(driver_cntr_names);
static int num_dev_cntrs; static int num_dev_cntrs;
static int num_port_cntrs; static int num_port_cntrs;
...@@ -1614,13 +1614,12 @@ static int cntr_names_initialized; ...@@ -1614,13 +1614,12 @@ static int cntr_names_initialized;
* strings. Optionally some entries can be reserved in the array to hold extra * strings. Optionally some entries can be reserved in the array to hold extra
* external strings. * external strings.
*/ */
static int init_cntr_names(const char *names_in, static int init_cntr_names(const char *names_in, const size_t names_len,
const size_t names_len, int num_extra_names, int *num_cntrs,
int num_extra_names, struct rdma_stat_desc **cntr_descs)
int *num_cntrs,
const char ***cntr_names)
{ {
char *names_out, *p, **q; struct rdma_stat_desc *q;
char *names_out, *p;
int i, n; int i, n;
n = 0; n = 0;
...@@ -1628,26 +1627,28 @@ static int init_cntr_names(const char *names_in, ...@@ -1628,26 +1627,28 @@ static int init_cntr_names(const char *names_in,
if (names_in[i] == '\n') if (names_in[i] == '\n')
n++; n++;
names_out = kmalloc((n + num_extra_names) * sizeof(char *) + names_len, names_out =
GFP_KERNEL); kmalloc((n + num_extra_names) * sizeof(struct rdma_stat_desc) +
names_len,
GFP_KERNEL);
if (!names_out) { if (!names_out) {
*num_cntrs = 0; *num_cntrs = 0;
*cntr_names = NULL; *cntr_descs = NULL;
return -ENOMEM; return -ENOMEM;
} }
p = names_out + (n + num_extra_names) * sizeof(char *); p = names_out + (n + num_extra_names) * sizeof(struct rdma_stat_desc);
memcpy(p, names_in, names_len); memcpy(p, names_in, names_len);
q = (char **)names_out; q = (struct rdma_stat_desc *)names_out;
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
q[i] = p; q[i].name = p;
p = strchr(p, '\n'); p = strchr(p, '\n');
*p++ = '\0'; *p++ = '\0';
} }
*num_cntrs = n; *num_cntrs = n;
*cntr_names = (const char **)names_out; *cntr_descs = (struct rdma_stat_desc *)names_out;
return 0; return 0;
} }
...@@ -1661,18 +1662,18 @@ static int init_counters(struct ib_device *ibdev) ...@@ -1661,18 +1662,18 @@ static int init_counters(struct ib_device *ibdev)
goto out_unlock; goto out_unlock;
err = init_cntr_names(dd->cntrnames, dd->cntrnameslen, num_driver_cntrs, err = init_cntr_names(dd->cntrnames, dd->cntrnameslen, num_driver_cntrs,
&num_dev_cntrs, &dev_cntr_names); &num_dev_cntrs, &dev_cntr_descs);
if (err) if (err)
goto out_unlock; goto out_unlock;
for (i = 0; i < num_driver_cntrs; i++) for (i = 0; i < num_driver_cntrs; i++)
dev_cntr_names[num_dev_cntrs + i] = driver_cntr_names[i]; dev_cntr_descs[num_dev_cntrs + i].name = driver_cntr_names[i];
err = init_cntr_names(dd->portcntrnames, dd->portcntrnameslen, 0, err = init_cntr_names(dd->portcntrnames, dd->portcntrnameslen, 0,
&num_port_cntrs, &port_cntr_names); &num_port_cntrs, &port_cntr_descs);
if (err) { if (err) {
kfree(dev_cntr_names); kfree(dev_cntr_descs);
dev_cntr_names = NULL; dev_cntr_descs = NULL;
goto out_unlock; goto out_unlock;
} }
cntr_names_initialized = 1; cntr_names_initialized = 1;
...@@ -1686,7 +1687,7 @@ static struct rdma_hw_stats *hfi1_alloc_hw_device_stats(struct ib_device *ibdev) ...@@ -1686,7 +1687,7 @@ static struct rdma_hw_stats *hfi1_alloc_hw_device_stats(struct ib_device *ibdev)
{ {
if (init_counters(ibdev)) if (init_counters(ibdev))
return NULL; return NULL;
return rdma_alloc_hw_stats_struct(dev_cntr_names, return rdma_alloc_hw_stats_struct(dev_cntr_descs,
num_dev_cntrs + num_driver_cntrs, num_dev_cntrs + num_driver_cntrs,
RDMA_HW_STATS_DEFAULT_LIFESPAN); RDMA_HW_STATS_DEFAULT_LIFESPAN);
} }
...@@ -1696,7 +1697,7 @@ static struct rdma_hw_stats *hfi_alloc_hw_port_stats(struct ib_device *ibdev, ...@@ -1696,7 +1697,7 @@ static struct rdma_hw_stats *hfi_alloc_hw_port_stats(struct ib_device *ibdev,
{ {
if (init_counters(ibdev)) if (init_counters(ibdev))
return NULL; return NULL;
return rdma_alloc_hw_stats_struct(port_cntr_names, num_port_cntrs, return rdma_alloc_hw_stats_struct(port_cntr_descs, num_port_cntrs,
RDMA_HW_STATS_DEFAULT_LIFESPAN); RDMA_HW_STATS_DEFAULT_LIFESPAN);
} }
...@@ -1921,10 +1922,10 @@ void hfi1_unregister_ib_device(struct hfi1_devdata *dd) ...@@ -1921,10 +1922,10 @@ void hfi1_unregister_ib_device(struct hfi1_devdata *dd)
verbs_txreq_exit(dev); verbs_txreq_exit(dev);
mutex_lock(&cntr_names_lock); mutex_lock(&cntr_names_lock);
kfree(dev_cntr_names); kfree(dev_cntr_descs);
kfree(port_cntr_names); kfree(port_cntr_descs);
dev_cntr_names = NULL; dev_cntr_descs = NULL;
port_cntr_names = NULL; port_cntr_descs = NULL;
cntr_names_initialized = 0; cntr_names_initialized = 0;
mutex_unlock(&cntr_names_lock); mutex_unlock(&cntr_names_lock);
} }
......
...@@ -3647,89 +3647,89 @@ static int irdma_iw_port_immutable(struct ib_device *ibdev, u32 port_num, ...@@ -3647,89 +3647,89 @@ static int irdma_iw_port_immutable(struct ib_device *ibdev, u32 port_num,
return 0; return 0;
} }
static const char *const irdma_hw_stat_names[] = { static const struct rdma_stat_desc irdma_hw_stat_descs[] = {
/* 32bit names */ /* 32bit names */
[IRDMA_HW_STAT_INDEX_RXVLANERR] = "rxVlanErrors", [IRDMA_HW_STAT_INDEX_RXVLANERR].name = "rxVlanErrors",
[IRDMA_HW_STAT_INDEX_IP4RXDISCARD] = "ip4InDiscards", [IRDMA_HW_STAT_INDEX_IP4RXDISCARD].name = "ip4InDiscards",
[IRDMA_HW_STAT_INDEX_IP4RXTRUNC] = "ip4InTruncatedPkts", [IRDMA_HW_STAT_INDEX_IP4RXTRUNC].name = "ip4InTruncatedPkts",
[IRDMA_HW_STAT_INDEX_IP4TXNOROUTE] = "ip4OutNoRoutes", [IRDMA_HW_STAT_INDEX_IP4TXNOROUTE].name = "ip4OutNoRoutes",
[IRDMA_HW_STAT_INDEX_IP6RXDISCARD] = "ip6InDiscards", [IRDMA_HW_STAT_INDEX_IP6RXDISCARD].name = "ip6InDiscards",
[IRDMA_HW_STAT_INDEX_IP6RXTRUNC] = "ip6InTruncatedPkts", [IRDMA_HW_STAT_INDEX_IP6RXTRUNC].name = "ip6InTruncatedPkts",
[IRDMA_HW_STAT_INDEX_IP6TXNOROUTE] = "ip6OutNoRoutes", [IRDMA_HW_STAT_INDEX_IP6TXNOROUTE].name = "ip6OutNoRoutes",
[IRDMA_HW_STAT_INDEX_TCPRTXSEG] = "tcpRetransSegs", [IRDMA_HW_STAT_INDEX_TCPRTXSEG].name = "tcpRetransSegs",
[IRDMA_HW_STAT_INDEX_TCPRXOPTERR] = "tcpInOptErrors", [IRDMA_HW_STAT_INDEX_TCPRXOPTERR].name = "tcpInOptErrors",
[IRDMA_HW_STAT_INDEX_TCPRXPROTOERR] = "tcpInProtoErrors", [IRDMA_HW_STAT_INDEX_TCPRXPROTOERR].name = "tcpInProtoErrors",
[IRDMA_HW_STAT_INDEX_RXRPCNPHANDLED] = "cnpHandled", [IRDMA_HW_STAT_INDEX_RXRPCNPHANDLED].name = "cnpHandled",
[IRDMA_HW_STAT_INDEX_RXRPCNPIGNORED] = "cnpIgnored", [IRDMA_HW_STAT_INDEX_RXRPCNPIGNORED].name = "cnpIgnored",
[IRDMA_HW_STAT_INDEX_TXNPCNPSENT] = "cnpSent", [IRDMA_HW_STAT_INDEX_TXNPCNPSENT].name = "cnpSent",
/* 64bit names */ /* 64bit names */
[IRDMA_HW_STAT_INDEX_IP4RXOCTS + IRDMA_HW_STAT_INDEX_MAX_32] = [IRDMA_HW_STAT_INDEX_IP4RXOCTS + IRDMA_HW_STAT_INDEX_MAX_32].name =
"ip4InOctets", "ip4InOctets",
[IRDMA_HW_STAT_INDEX_IP4RXPKTS + IRDMA_HW_STAT_INDEX_MAX_32] = [IRDMA_HW_STAT_INDEX_IP4RXPKTS + IRDMA_HW_STAT_INDEX_MAX_32].name =
"ip4InPkts", "ip4InPkts",
[IRDMA_HW_STAT_INDEX_IP4RXFRAGS + IRDMA_HW_STAT_INDEX_MAX_32] = [IRDMA_HW_STAT_INDEX_IP4RXFRAGS + IRDMA_HW_STAT_INDEX_MAX_32].name =
"ip4InReasmRqd", "ip4InReasmRqd",
[IRDMA_HW_STAT_INDEX_IP4RXMCOCTS + IRDMA_HW_STAT_INDEX_MAX_32] = [IRDMA_HW_STAT_INDEX_IP4RXMCOCTS + IRDMA_HW_STAT_INDEX_MAX_32].name =
"ip4InMcastOctets", "ip4InMcastOctets",
[IRDMA_HW_STAT_INDEX_IP4RXMCPKTS + IRDMA_HW_STAT_INDEX_MAX_32] = [IRDMA_HW_STAT_INDEX_IP4RXMCPKTS + IRDMA_HW_STAT_INDEX_MAX_32].name =
"ip4InMcastPkts", "ip4InMcastPkts",
[IRDMA_HW_STAT_INDEX_IP4TXOCTS + IRDMA_HW_STAT_INDEX_MAX_32] = [IRDMA_HW_STAT_INDEX_IP4TXOCTS + IRDMA_HW_STAT_INDEX_MAX_32].name =
"ip4OutOctets", "ip4OutOctets",
[IRDMA_HW_STAT_INDEX_IP4TXPKTS + IRDMA_HW_STAT_INDEX_MAX_32] = [IRDMA_HW_STAT_INDEX_IP4TXPKTS + IRDMA_HW_STAT_INDEX_MAX_32].name =
"ip4OutPkts", "ip4OutPkts",
[IRDMA_HW_STAT_INDEX_IP4TXFRAGS + IRDMA_HW_STAT_INDEX_MAX_32] = [IRDMA_HW_STAT_INDEX_IP4TXFRAGS + IRDMA_HW_STAT_INDEX_MAX_32].name =
"ip4OutSegRqd", "ip4OutSegRqd",
[IRDMA_HW_STAT_INDEX_IP4TXMCOCTS + IRDMA_HW_STAT_INDEX_MAX_32] = [IRDMA_HW_STAT_INDEX_IP4TXMCOCTS + IRDMA_HW_STAT_INDEX_MAX_32].name =
"ip4OutMcastOctets", "ip4OutMcastOctets",
[IRDMA_HW_STAT_INDEX_IP4TXMCPKTS + IRDMA_HW_STAT_INDEX_MAX_32] = [IRDMA_HW_STAT_INDEX_IP4TXMCPKTS + IRDMA_HW_STAT_INDEX_MAX_32].name =
"ip4OutMcastPkts", "ip4OutMcastPkts",
[IRDMA_HW_STAT_INDEX_IP6RXOCTS + IRDMA_HW_STAT_INDEX_MAX_32] = [IRDMA_HW_STAT_INDEX_IP6RXOCTS + IRDMA_HW_STAT_INDEX_MAX_32].name =
"ip6InOctets", "ip6InOctets",
[IRDMA_HW_STAT_INDEX_IP6RXPKTS + IRDMA_HW_STAT_INDEX_MAX_32] = [IRDMA_HW_STAT_INDEX_IP6RXPKTS + IRDMA_HW_STAT_INDEX_MAX_32].name =
"ip6InPkts", "ip6InPkts",
[IRDMA_HW_STAT_INDEX_IP6RXFRAGS + IRDMA_HW_STAT_INDEX_MAX_32] = [IRDMA_HW_STAT_INDEX_IP6RXFRAGS + IRDMA_HW_STAT_INDEX_MAX_32].name =
"ip6InReasmRqd", "ip6InReasmRqd",
[IRDMA_HW_STAT_INDEX_IP6RXMCOCTS + IRDMA_HW_STAT_INDEX_MAX_32] = [IRDMA_HW_STAT_INDEX_IP6RXMCOCTS + IRDMA_HW_STAT_INDEX_MAX_32].name =
"ip6InMcastOctets", "ip6InMcastOctets",
[IRDMA_HW_STAT_INDEX_IP6RXMCPKTS + IRDMA_HW_STAT_INDEX_MAX_32] = [IRDMA_HW_STAT_INDEX_IP6RXMCPKTS + IRDMA_HW_STAT_INDEX_MAX_32].name =
"ip6InMcastPkts", "ip6InMcastPkts",
[IRDMA_HW_STAT_INDEX_IP6TXOCTS + IRDMA_HW_STAT_INDEX_MAX_32] = [IRDMA_HW_STAT_INDEX_IP6TXOCTS + IRDMA_HW_STAT_INDEX_MAX_32].name =
"ip6OutOctets", "ip6OutOctets",
[IRDMA_HW_STAT_INDEX_IP6TXPKTS + IRDMA_HW_STAT_INDEX_MAX_32] = [IRDMA_HW_STAT_INDEX_IP6TXPKTS + IRDMA_HW_STAT_INDEX_MAX_32].name =
"ip6OutPkts", "ip6OutPkts",
[IRDMA_HW_STAT_INDEX_IP6TXFRAGS + IRDMA_HW_STAT_INDEX_MAX_32] = [IRDMA_HW_STAT_INDEX_IP6TXFRAGS + IRDMA_HW_STAT_INDEX_MAX_32].name =
"ip6OutSegRqd", "ip6OutSegRqd",
[IRDMA_HW_STAT_INDEX_IP6TXMCOCTS + IRDMA_HW_STAT_INDEX_MAX_32] = [IRDMA_HW_STAT_INDEX_IP6TXMCOCTS + IRDMA_HW_STAT_INDEX_MAX_32].name =
"ip6OutMcastOctets", "ip6OutMcastOctets",
[IRDMA_HW_STAT_INDEX_IP6TXMCPKTS + IRDMA_HW_STAT_INDEX_MAX_32] = [IRDMA_HW_STAT_INDEX_IP6TXMCPKTS + IRDMA_HW_STAT_INDEX_MAX_32].name =
"ip6OutMcastPkts", "ip6OutMcastPkts",
[IRDMA_HW_STAT_INDEX_TCPRXSEGS + IRDMA_HW_STAT_INDEX_MAX_32] = [IRDMA_HW_STAT_INDEX_TCPRXSEGS + IRDMA_HW_STAT_INDEX_MAX_32].name =
"tcpInSegs", "tcpInSegs",
[IRDMA_HW_STAT_INDEX_TCPTXSEG + IRDMA_HW_STAT_INDEX_MAX_32] = [IRDMA_HW_STAT_INDEX_TCPTXSEG + IRDMA_HW_STAT_INDEX_MAX_32].name =
"tcpOutSegs", "tcpOutSegs",
[IRDMA_HW_STAT_INDEX_RDMARXRDS + IRDMA_HW_STAT_INDEX_MAX_32] = [IRDMA_HW_STAT_INDEX_RDMARXRDS + IRDMA_HW_STAT_INDEX_MAX_32].name =
"iwInRdmaReads", "iwInRdmaReads",
[IRDMA_HW_STAT_INDEX_RDMARXSNDS + IRDMA_HW_STAT_INDEX_MAX_32] = [IRDMA_HW_STAT_INDEX_RDMARXSNDS + IRDMA_HW_STAT_INDEX_MAX_32].name =
"iwInRdmaSends", "iwInRdmaSends",
[IRDMA_HW_STAT_INDEX_RDMARXWRS + IRDMA_HW_STAT_INDEX_MAX_32] = [IRDMA_HW_STAT_INDEX_RDMARXWRS + IRDMA_HW_STAT_INDEX_MAX_32].name =
"iwInRdmaWrites", "iwInRdmaWrites",
[IRDMA_HW_STAT_INDEX_RDMATXRDS + IRDMA_HW_STAT_INDEX_MAX_32] = [IRDMA_HW_STAT_INDEX_RDMATXRDS + IRDMA_HW_STAT_INDEX_MAX_32].name =
"iwOutRdmaReads", "iwOutRdmaReads",
[IRDMA_HW_STAT_INDEX_RDMATXSNDS + IRDMA_HW_STAT_INDEX_MAX_32] = [IRDMA_HW_STAT_INDEX_RDMATXSNDS + IRDMA_HW_STAT_INDEX_MAX_32].name =
"iwOutRdmaSends", "iwOutRdmaSends",
[IRDMA_HW_STAT_INDEX_RDMATXWRS + IRDMA_HW_STAT_INDEX_MAX_32] = [IRDMA_HW_STAT_INDEX_RDMATXWRS + IRDMA_HW_STAT_INDEX_MAX_32].name =
"iwOutRdmaWrites", "iwOutRdmaWrites",
[IRDMA_HW_STAT_INDEX_RDMAVBND + IRDMA_HW_STAT_INDEX_MAX_32] = [IRDMA_HW_STAT_INDEX_RDMAVBND + IRDMA_HW_STAT_INDEX_MAX_32].name =
"iwRdmaBnd", "iwRdmaBnd",
[IRDMA_HW_STAT_INDEX_RDMAVINV + IRDMA_HW_STAT_INDEX_MAX_32] = [IRDMA_HW_STAT_INDEX_RDMAVINV + IRDMA_HW_STAT_INDEX_MAX_32].name =
"iwRdmaInv", "iwRdmaInv",
[IRDMA_HW_STAT_INDEX_UDPRXPKTS + IRDMA_HW_STAT_INDEX_MAX_32] = [IRDMA_HW_STAT_INDEX_UDPRXPKTS + IRDMA_HW_STAT_INDEX_MAX_32].name =
"RxUDP", "RxUDP",
[IRDMA_HW_STAT_INDEX_UDPTXPKTS + IRDMA_HW_STAT_INDEX_MAX_32] = [IRDMA_HW_STAT_INDEX_UDPTXPKTS + IRDMA_HW_STAT_INDEX_MAX_32].name =
"TxUDP", "TxUDP",
[IRDMA_HW_STAT_INDEX_RXNPECNMARKEDPKTS + IRDMA_HW_STAT_INDEX_MAX_32] = [IRDMA_HW_STAT_INDEX_RXNPECNMARKEDPKTS + IRDMA_HW_STAT_INDEX_MAX_32]
"RxECNMrkd", .name = "RxECNMrkd",
}; };
static void irdma_get_dev_fw_str(struct ib_device *dev, char *str) static void irdma_get_dev_fw_str(struct ib_device *dev, char *str)
...@@ -3753,10 +3753,10 @@ static struct rdma_hw_stats *irdma_alloc_hw_port_stats(struct ib_device *ibdev, ...@@ -3753,10 +3753,10 @@ static struct rdma_hw_stats *irdma_alloc_hw_port_stats(struct ib_device *ibdev,
IRDMA_HW_STAT_INDEX_MAX_64; IRDMA_HW_STAT_INDEX_MAX_64;
unsigned long lifespan = RDMA_HW_STATS_DEFAULT_LIFESPAN; unsigned long lifespan = RDMA_HW_STATS_DEFAULT_LIFESPAN;
BUILD_BUG_ON(ARRAY_SIZE(irdma_hw_stat_names) != BUILD_BUG_ON(ARRAY_SIZE(irdma_hw_stat_descs) !=
(IRDMA_HW_STAT_INDEX_MAX_32 + IRDMA_HW_STAT_INDEX_MAX_64)); (IRDMA_HW_STAT_INDEX_MAX_32 + IRDMA_HW_STAT_INDEX_MAX_64));
return rdma_alloc_hw_stats_struct(irdma_hw_stat_names, num_counters, return rdma_alloc_hw_stats_struct(irdma_hw_stat_descs, num_counters,
lifespan); lifespan);
} }
......
...@@ -2105,10 +2105,10 @@ mlx4_ib_alloc_hw_device_stats(struct ib_device *ibdev) ...@@ -2105,10 +2105,10 @@ mlx4_ib_alloc_hw_device_stats(struct ib_device *ibdev)
struct mlx4_ib_dev *dev = to_mdev(ibdev); struct mlx4_ib_dev *dev = to_mdev(ibdev);
struct mlx4_ib_diag_counters *diag = dev->diag_counters; struct mlx4_ib_diag_counters *diag = dev->diag_counters;
if (!diag[0].name) if (!diag[0].descs)
return NULL; return NULL;
return rdma_alloc_hw_stats_struct(diag[0].name, diag[0].num_counters, return rdma_alloc_hw_stats_struct(diag[0].descs, diag[0].num_counters,
RDMA_HW_STATS_DEFAULT_LIFESPAN); RDMA_HW_STATS_DEFAULT_LIFESPAN);
} }
...@@ -2118,10 +2118,10 @@ mlx4_ib_alloc_hw_port_stats(struct ib_device *ibdev, u32 port_num) ...@@ -2118,10 +2118,10 @@ mlx4_ib_alloc_hw_port_stats(struct ib_device *ibdev, u32 port_num)
struct mlx4_ib_dev *dev = to_mdev(ibdev); struct mlx4_ib_dev *dev = to_mdev(ibdev);
struct mlx4_ib_diag_counters *diag = dev->diag_counters; struct mlx4_ib_diag_counters *diag = dev->diag_counters;
if (!diag[1].name) if (!diag[1].descs)
return NULL; return NULL;
return rdma_alloc_hw_stats_struct(diag[1].name, diag[1].num_counters, return rdma_alloc_hw_stats_struct(diag[1].descs, diag[1].num_counters,
RDMA_HW_STATS_DEFAULT_LIFESPAN); RDMA_HW_STATS_DEFAULT_LIFESPAN);
} }
...@@ -2151,10 +2151,8 @@ static int mlx4_ib_get_hw_stats(struct ib_device *ibdev, ...@@ -2151,10 +2151,8 @@ static int mlx4_ib_get_hw_stats(struct ib_device *ibdev,
} }
static int __mlx4_ib_alloc_diag_counters(struct mlx4_ib_dev *ibdev, static int __mlx4_ib_alloc_diag_counters(struct mlx4_ib_dev *ibdev,
const char ***name, struct rdma_stat_desc **pdescs,
u32 **offset, u32 **offset, u32 *num, bool port)
u32 *num,
bool port)
{ {
u32 num_counters; u32 num_counters;
...@@ -2166,46 +2164,46 @@ static int __mlx4_ib_alloc_diag_counters(struct mlx4_ib_dev *ibdev, ...@@ -2166,46 +2164,46 @@ static int __mlx4_ib_alloc_diag_counters(struct mlx4_ib_dev *ibdev,
if (!port) if (!port)
num_counters += ARRAY_SIZE(diag_device_only); num_counters += ARRAY_SIZE(diag_device_only);
*name = kcalloc(num_counters, sizeof(**name), GFP_KERNEL); *pdescs = kcalloc(num_counters, sizeof(struct rdma_stat_desc),
if (!*name) GFP_KERNEL);
if (!*pdescs)
return -ENOMEM; return -ENOMEM;
*offset = kcalloc(num_counters, sizeof(**offset), GFP_KERNEL); *offset = kcalloc(num_counters, sizeof(**offset), GFP_KERNEL);
if (!*offset) if (!*offset)
goto err_name; goto err;
*num = num_counters; *num = num_counters;
return 0; return 0;
err_name: err:
kfree(*name); kfree(*pdescs);
return -ENOMEM; return -ENOMEM;
} }
static void mlx4_ib_fill_diag_counters(struct mlx4_ib_dev *ibdev, static void mlx4_ib_fill_diag_counters(struct mlx4_ib_dev *ibdev,
const char **name, struct rdma_stat_desc *descs,
u32 *offset, u32 *offset, bool port)
bool port)
{ {
int i; int i;
int j; int j;
for (i = 0, j = 0; i < ARRAY_SIZE(diag_basic); i++, j++) { for (i = 0, j = 0; i < ARRAY_SIZE(diag_basic); i++, j++) {
name[i] = diag_basic[i].name; descs[i].name = diag_basic[i].name;
offset[i] = diag_basic[i].offset; offset[i] = diag_basic[i].offset;
} }
if (ibdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_DIAG_PER_PORT) { if (ibdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_DIAG_PER_PORT) {
for (i = 0; i < ARRAY_SIZE(diag_ext); i++, j++) { for (i = 0; i < ARRAY_SIZE(diag_ext); i++, j++) {
name[j] = diag_ext[i].name; descs[j].name = diag_ext[i].name;
offset[j] = diag_ext[i].offset; offset[j] = diag_ext[i].offset;
} }
} }
if (!port) { if (!port) {
for (i = 0; i < ARRAY_SIZE(diag_device_only); i++, j++) { for (i = 0; i < ARRAY_SIZE(diag_device_only); i++, j++) {
name[j] = diag_device_only[i].name; descs[j].name = diag_device_only[i].name;
offset[j] = diag_device_only[i].offset; offset[j] = diag_device_only[i].offset;
} }
} }
...@@ -2233,13 +2231,13 @@ static int mlx4_ib_alloc_diag_counters(struct mlx4_ib_dev *ibdev) ...@@ -2233,13 +2231,13 @@ static int mlx4_ib_alloc_diag_counters(struct mlx4_ib_dev *ibdev)
if (i && !per_port) if (i && !per_port)
continue; continue;
ret = __mlx4_ib_alloc_diag_counters(ibdev, &diag[i].name, ret = __mlx4_ib_alloc_diag_counters(ibdev, &diag[i].descs,
&diag[i].offset, &diag[i].offset,
&diag[i].num_counters, i); &diag[i].num_counters, i);
if (ret) if (ret)
goto err_alloc; goto err_alloc;
mlx4_ib_fill_diag_counters(ibdev, diag[i].name, mlx4_ib_fill_diag_counters(ibdev, diag[i].descs,
diag[i].offset, i); diag[i].offset, i);
} }
...@@ -2249,7 +2247,7 @@ static int mlx4_ib_alloc_diag_counters(struct mlx4_ib_dev *ibdev) ...@@ -2249,7 +2247,7 @@ static int mlx4_ib_alloc_diag_counters(struct mlx4_ib_dev *ibdev)
err_alloc: err_alloc:
if (i) { if (i) {
kfree(diag[i - 1].name); kfree(diag[i - 1].descs);
kfree(diag[i - 1].offset); kfree(diag[i - 1].offset);
} }
...@@ -2262,7 +2260,7 @@ static void mlx4_ib_diag_cleanup(struct mlx4_ib_dev *ibdev) ...@@ -2262,7 +2260,7 @@ static void mlx4_ib_diag_cleanup(struct mlx4_ib_dev *ibdev)
for (i = 0; i < MLX4_DIAG_COUNTERS_TYPES; i++) { for (i = 0; i < MLX4_DIAG_COUNTERS_TYPES; i++) {
kfree(ibdev->diag_counters[i].offset); kfree(ibdev->diag_counters[i].offset);
kfree(ibdev->diag_counters[i].name); kfree(ibdev->diag_counters[i].descs);
} }
} }
......
...@@ -601,7 +601,7 @@ struct mlx4_ib_counters { ...@@ -601,7 +601,7 @@ struct mlx4_ib_counters {
#define MLX4_DIAG_COUNTERS_TYPES 2 #define MLX4_DIAG_COUNTERS_TYPES 2
struct mlx4_ib_diag_counters { struct mlx4_ib_diag_counters {
const char **name; struct rdma_stat_desc *descs;
u32 *offset; u32 *offset;
u32 num_counters; u32 num_counters;
}; };
......
...@@ -167,7 +167,7 @@ mlx5_ib_alloc_hw_device_stats(struct ib_device *ibdev) ...@@ -167,7 +167,7 @@ mlx5_ib_alloc_hw_device_stats(struct ib_device *ibdev)
struct mlx5_ib_dev *dev = to_mdev(ibdev); struct mlx5_ib_dev *dev = to_mdev(ibdev);
const struct mlx5_ib_counters *cnts = &dev->port[0].cnts; const struct mlx5_ib_counters *cnts = &dev->port[0].cnts;
return rdma_alloc_hw_stats_struct(cnts->names, return rdma_alloc_hw_stats_struct(cnts->descs,
cnts->num_q_counters + cnts->num_q_counters +
cnts->num_cong_counters + cnts->num_cong_counters +
cnts->num_ext_ppcnt_counters, cnts->num_ext_ppcnt_counters,
...@@ -180,7 +180,7 @@ mlx5_ib_alloc_hw_port_stats(struct ib_device *ibdev, u32 port_num) ...@@ -180,7 +180,7 @@ mlx5_ib_alloc_hw_port_stats(struct ib_device *ibdev, u32 port_num)
struct mlx5_ib_dev *dev = to_mdev(ibdev); struct mlx5_ib_dev *dev = to_mdev(ibdev);
const struct mlx5_ib_counters *cnts = &dev->port[port_num - 1].cnts; const struct mlx5_ib_counters *cnts = &dev->port[port_num - 1].cnts;
return rdma_alloc_hw_stats_struct(cnts->names, return rdma_alloc_hw_stats_struct(cnts->descs,
cnts->num_q_counters + cnts->num_q_counters +
cnts->num_cong_counters + cnts->num_cong_counters +
cnts->num_ext_ppcnt_counters, cnts->num_ext_ppcnt_counters,
...@@ -302,7 +302,7 @@ mlx5_ib_counter_alloc_stats(struct rdma_counter *counter) ...@@ -302,7 +302,7 @@ mlx5_ib_counter_alloc_stats(struct rdma_counter *counter)
const struct mlx5_ib_counters *cnts = const struct mlx5_ib_counters *cnts =
get_counters(dev, counter->port - 1); get_counters(dev, counter->port - 1);
return rdma_alloc_hw_stats_struct(cnts->names, return rdma_alloc_hw_stats_struct(cnts->descs,
cnts->num_q_counters + cnts->num_q_counters +
cnts->num_cong_counters + cnts->num_cong_counters +
cnts->num_ext_ppcnt_counters, cnts->num_ext_ppcnt_counters,
...@@ -371,57 +371,55 @@ static int mlx5_ib_counter_unbind_qp(struct ib_qp *qp) ...@@ -371,57 +371,55 @@ static int mlx5_ib_counter_unbind_qp(struct ib_qp *qp)
return mlx5_ib_qp_set_counter(qp, NULL); return mlx5_ib_qp_set_counter(qp, NULL);
} }
static void mlx5_ib_fill_counters(struct mlx5_ib_dev *dev, static void mlx5_ib_fill_counters(struct mlx5_ib_dev *dev,
const char **names, struct rdma_stat_desc *descs, size_t *offsets)
size_t *offsets)
{ {
int i; int i;
int j = 0; int j = 0;
for (i = 0; i < ARRAY_SIZE(basic_q_cnts); i++, j++) { for (i = 0; i < ARRAY_SIZE(basic_q_cnts); i++, j++) {
names[j] = basic_q_cnts[i].name; descs[j].name = basic_q_cnts[i].name;
offsets[j] = basic_q_cnts[i].offset; offsets[j] = basic_q_cnts[i].offset;
} }
if (MLX5_CAP_GEN(dev->mdev, out_of_seq_cnt)) { if (MLX5_CAP_GEN(dev->mdev, out_of_seq_cnt)) {
for (i = 0; i < ARRAY_SIZE(out_of_seq_q_cnts); i++, j++) { for (i = 0; i < ARRAY_SIZE(out_of_seq_q_cnts); i++, j++) {
names[j] = out_of_seq_q_cnts[i].name; descs[j].name = out_of_seq_q_cnts[i].name;
offsets[j] = out_of_seq_q_cnts[i].offset; offsets[j] = out_of_seq_q_cnts[i].offset;
} }
} }
if (MLX5_CAP_GEN(dev->mdev, retransmission_q_counters)) { if (MLX5_CAP_GEN(dev->mdev, retransmission_q_counters)) {
for (i = 0; i < ARRAY_SIZE(retrans_q_cnts); i++, j++) { for (i = 0; i < ARRAY_SIZE(retrans_q_cnts); i++, j++) {
names[j] = retrans_q_cnts[i].name; descs[j].name = retrans_q_cnts[i].name;
offsets[j] = retrans_q_cnts[i].offset; offsets[j] = retrans_q_cnts[i].offset;
} }
} }
if (MLX5_CAP_GEN(dev->mdev, enhanced_error_q_counters)) { if (MLX5_CAP_GEN(dev->mdev, enhanced_error_q_counters)) {
for (i = 0; i < ARRAY_SIZE(extended_err_cnts); i++, j++) { for (i = 0; i < ARRAY_SIZE(extended_err_cnts); i++, j++) {
names[j] = extended_err_cnts[i].name; descs[j].name = extended_err_cnts[i].name;
offsets[j] = extended_err_cnts[i].offset; offsets[j] = extended_err_cnts[i].offset;
} }
} }
if (MLX5_CAP_GEN(dev->mdev, roce_accl)) { if (MLX5_CAP_GEN(dev->mdev, roce_accl)) {
for (i = 0; i < ARRAY_SIZE(roce_accl_cnts); i++, j++) { for (i = 0; i < ARRAY_SIZE(roce_accl_cnts); i++, j++) {
names[j] = roce_accl_cnts[i].name; descs[j].name = roce_accl_cnts[i].name;
offsets[j] = roce_accl_cnts[i].offset; offsets[j] = roce_accl_cnts[i].offset;
} }
} }
if (MLX5_CAP_GEN(dev->mdev, cc_query_allowed)) { if (MLX5_CAP_GEN(dev->mdev, cc_query_allowed)) {
for (i = 0; i < ARRAY_SIZE(cong_cnts); i++, j++) { for (i = 0; i < ARRAY_SIZE(cong_cnts); i++, j++) {
names[j] = cong_cnts[i].name; descs[j].name = cong_cnts[i].name;
offsets[j] = cong_cnts[i].offset; offsets[j] = cong_cnts[i].offset;
} }
} }
if (MLX5_CAP_PCAM_FEATURE(dev->mdev, rx_icrc_encapsulated_counter)) { if (MLX5_CAP_PCAM_FEATURE(dev->mdev, rx_icrc_encapsulated_counter)) {
for (i = 0; i < ARRAY_SIZE(ext_ppcnt_cnts); i++, j++) { for (i = 0; i < ARRAY_SIZE(ext_ppcnt_cnts); i++, j++) {
names[j] = ext_ppcnt_cnts[i].name; descs[j].name = ext_ppcnt_cnts[i].name;
offsets[j] = ext_ppcnt_cnts[i].offset; offsets[j] = ext_ppcnt_cnts[i].offset;
} }
} }
...@@ -457,20 +455,21 @@ static int __mlx5_ib_alloc_counters(struct mlx5_ib_dev *dev, ...@@ -457,20 +455,21 @@ static int __mlx5_ib_alloc_counters(struct mlx5_ib_dev *dev,
cnts->num_ext_ppcnt_counters = ARRAY_SIZE(ext_ppcnt_cnts); cnts->num_ext_ppcnt_counters = ARRAY_SIZE(ext_ppcnt_cnts);
num_counters += ARRAY_SIZE(ext_ppcnt_cnts); num_counters += ARRAY_SIZE(ext_ppcnt_cnts);
} }
cnts->names = kcalloc(num_counters, sizeof(*cnts->names), GFP_KERNEL); cnts->descs = kcalloc(num_counters,
if (!cnts->names) sizeof(struct rdma_stat_desc), GFP_KERNEL);
if (!cnts->descs)
return -ENOMEM; return -ENOMEM;
cnts->offsets = kcalloc(num_counters, cnts->offsets = kcalloc(num_counters,
sizeof(*cnts->offsets), GFP_KERNEL); sizeof(*cnts->offsets), GFP_KERNEL);
if (!cnts->offsets) if (!cnts->offsets)
goto err_names; goto err;
return 0; return 0;
err_names: err:
kfree(cnts->names); kfree(cnts->descs);
cnts->names = NULL; cnts->descs = NULL;
return -ENOMEM; return -ENOMEM;
} }
...@@ -491,7 +490,7 @@ static void mlx5_ib_dealloc_counters(struct mlx5_ib_dev *dev) ...@@ -491,7 +490,7 @@ static void mlx5_ib_dealloc_counters(struct mlx5_ib_dev *dev)
dev->port[i].cnts.set_id); dev->port[i].cnts.set_id);
mlx5_cmd_exec_in(dev->mdev, dealloc_q_counter, in); mlx5_cmd_exec_in(dev->mdev, dealloc_q_counter, in);
} }
kfree(dev->port[i].cnts.names); kfree(dev->port[i].cnts.descs);
kfree(dev->port[i].cnts.offsets); kfree(dev->port[i].cnts.offsets);
} }
} }
...@@ -514,7 +513,7 @@ static int mlx5_ib_alloc_counters(struct mlx5_ib_dev *dev) ...@@ -514,7 +513,7 @@ static int mlx5_ib_alloc_counters(struct mlx5_ib_dev *dev)
if (err) if (err)
goto err_alloc; goto err_alloc;
mlx5_ib_fill_counters(dev, dev->port[i].cnts.names, mlx5_ib_fill_counters(dev, dev->port[i].cnts.descs,
dev->port[i].cnts.offsets); dev->port[i].cnts.offsets);
MLX5_SET(alloc_q_counter_in, in, uid, MLX5_SET(alloc_q_counter_in, in, uid,
......
...@@ -798,7 +798,7 @@ struct mlx5_ib_resources { ...@@ -798,7 +798,7 @@ struct mlx5_ib_resources {
}; };
struct mlx5_ib_counters { struct mlx5_ib_counters {
const char **names; struct rdma_stat_desc *descs;
size_t *offsets; size_t *offsets;
u32 num_q_counters; u32 num_q_counters;
u32 num_cong_counters; u32 num_cong_counters;
......
...@@ -6,22 +6,22 @@ ...@@ -6,22 +6,22 @@
#include "rxe.h" #include "rxe.h"
#include "rxe_hw_counters.h" #include "rxe_hw_counters.h"
static const char * const rxe_counter_name[] = { static const struct rdma_stat_desc rxe_counter_descs[] = {
[RXE_CNT_SENT_PKTS] = "sent_pkts", [RXE_CNT_SENT_PKTS].name = "sent_pkts",
[RXE_CNT_RCVD_PKTS] = "rcvd_pkts", [RXE_CNT_RCVD_PKTS].name = "rcvd_pkts",
[RXE_CNT_DUP_REQ] = "duplicate_request", [RXE_CNT_DUP_REQ].name = "duplicate_request",
[RXE_CNT_OUT_OF_SEQ_REQ] = "out_of_seq_request", [RXE_CNT_OUT_OF_SEQ_REQ].name = "out_of_seq_request",
[RXE_CNT_RCV_RNR] = "rcvd_rnr_err", [RXE_CNT_RCV_RNR].name = "rcvd_rnr_err",
[RXE_CNT_SND_RNR] = "send_rnr_err", [RXE_CNT_SND_RNR].name = "send_rnr_err",
[RXE_CNT_RCV_SEQ_ERR] = "rcvd_seq_err", [RXE_CNT_RCV_SEQ_ERR].name = "rcvd_seq_err",
[RXE_CNT_COMPLETER_SCHED] = "ack_deferred", [RXE_CNT_COMPLETER_SCHED].name = "ack_deferred",
[RXE_CNT_RETRY_EXCEEDED] = "retry_exceeded_err", [RXE_CNT_RETRY_EXCEEDED].name = "retry_exceeded_err",
[RXE_CNT_RNR_RETRY_EXCEEDED] = "retry_rnr_exceeded_err", [RXE_CNT_RNR_RETRY_EXCEEDED].name = "retry_rnr_exceeded_err",
[RXE_CNT_COMP_RETRY] = "completer_retry_err", [RXE_CNT_COMP_RETRY].name = "completer_retry_err",
[RXE_CNT_SEND_ERR] = "send_err", [RXE_CNT_SEND_ERR].name = "send_err",
[RXE_CNT_LINK_DOWNED] = "link_downed", [RXE_CNT_LINK_DOWNED].name = "link_downed",
[RXE_CNT_RDMA_SEND] = "rdma_sends", [RXE_CNT_RDMA_SEND].name = "rdma_sends",
[RXE_CNT_RDMA_RECV] = "rdma_recvs", [RXE_CNT_RDMA_RECV].name = "rdma_recvs",
}; };
int rxe_ib_get_hw_stats(struct ib_device *ibdev, int rxe_ib_get_hw_stats(struct ib_device *ibdev,
...@@ -34,18 +34,18 @@ int rxe_ib_get_hw_stats(struct ib_device *ibdev, ...@@ -34,18 +34,18 @@ int rxe_ib_get_hw_stats(struct ib_device *ibdev,
if (!port || !stats) if (!port || !stats)
return -EINVAL; return -EINVAL;
for (cnt = 0; cnt < ARRAY_SIZE(rxe_counter_name); cnt++) for (cnt = 0; cnt < ARRAY_SIZE(rxe_counter_descs); cnt++)
stats->value[cnt] = atomic64_read(&dev->stats_counters[cnt]); stats->value[cnt] = atomic64_read(&dev->stats_counters[cnt]);
return ARRAY_SIZE(rxe_counter_name); return ARRAY_SIZE(rxe_counter_descs);
} }
struct rdma_hw_stats *rxe_ib_alloc_hw_port_stats(struct ib_device *ibdev, struct rdma_hw_stats *rxe_ib_alloc_hw_port_stats(struct ib_device *ibdev,
u32 port_num) u32 port_num)
{ {
BUILD_BUG_ON(ARRAY_SIZE(rxe_counter_name) != RXE_NUM_OF_COUNTERS); BUILD_BUG_ON(ARRAY_SIZE(rxe_counter_descs) != RXE_NUM_OF_COUNTERS);
return rdma_alloc_hw_stats_struct(rxe_counter_name, return rdma_alloc_hw_stats_struct(rxe_counter_descs,
ARRAY_SIZE(rxe_counter_name), ARRAY_SIZE(rxe_counter_descs),
RDMA_HW_STATS_DEFAULT_LIFESPAN); RDMA_HW_STATS_DEFAULT_LIFESPAN);
} }
...@@ -545,6 +545,14 @@ enum ib_port_speed { ...@@ -545,6 +545,14 @@ enum ib_port_speed {
IB_SPEED_NDR = 128, IB_SPEED_NDR = 128,
}; };
/**
* struct rdma_stat_desc
* @name - The name of the counter
*/
struct rdma_stat_desc {
const char *name;
};
/** /**
* struct rdma_hw_stats * struct rdma_hw_stats
* @lock - Mutex to protect parallel write access to lifespan and values * @lock - Mutex to protect parallel write access to lifespan and values
...@@ -555,8 +563,8 @@ enum ib_port_speed { ...@@ -555,8 +563,8 @@ enum ib_port_speed {
* should be before being updated again. Stored in jiffies, defaults * should be before being updated again. Stored in jiffies, defaults
* to 10 milliseconds, drivers can override the default be specifying * to 10 milliseconds, drivers can override the default be specifying
* their own value during their allocation routine. * their own value during their allocation routine.
* @name - Array of pointers to static names used for the counters in * @descs - Array of pointers to static descriptors used for the counters
* directory. * in directory.
* @num_counters - How many hardware counters there are. If name is * @num_counters - How many hardware counters there are. If name is
* shorter than this number, a kernel oops will result. Driver authors * shorter than this number, a kernel oops will result. Driver authors
* are encouraged to leave BUILD_BUG_ON(ARRAY_SIZE(@name) < num_counters) * are encouraged to leave BUILD_BUG_ON(ARRAY_SIZE(@name) < num_counters)
...@@ -568,7 +576,7 @@ struct rdma_hw_stats { ...@@ -568,7 +576,7 @@ struct rdma_hw_stats {
struct mutex lock; /* Protect lifespan and values[] */ struct mutex lock; /* Protect lifespan and values[] */
unsigned long timestamp; unsigned long timestamp;
unsigned long lifespan; unsigned long lifespan;
const char * const *names; const struct rdma_stat_desc *descs;
int num_counters; int num_counters;
u64 value[]; u64 value[];
}; };
...@@ -577,12 +585,12 @@ struct rdma_hw_stats { ...@@ -577,12 +585,12 @@ struct rdma_hw_stats {
/** /**
* rdma_alloc_hw_stats_struct - Helper function to allocate dynamic struct * rdma_alloc_hw_stats_struct - Helper function to allocate dynamic struct
* for drivers. * for drivers.
* @names - Array of static const char * * @descs - Array of static descriptors
* @num_counters - How many elements in array * @num_counters - How many elements in array
* @lifespan - How many milliseconds between updates * @lifespan - How many milliseconds between updates
*/ */
static inline struct rdma_hw_stats *rdma_alloc_hw_stats_struct( static inline struct rdma_hw_stats *rdma_alloc_hw_stats_struct(
const char * const *names, int num_counters, const struct rdma_stat_desc *descs, int num_counters,
unsigned long lifespan) unsigned long lifespan)
{ {
struct rdma_hw_stats *stats; struct rdma_hw_stats *stats;
...@@ -591,7 +599,8 @@ static inline struct rdma_hw_stats *rdma_alloc_hw_stats_struct( ...@@ -591,7 +599,8 @@ static inline struct rdma_hw_stats *rdma_alloc_hw_stats_struct(
GFP_KERNEL); GFP_KERNEL);
if (!stats) if (!stats)
return NULL; return NULL;
stats->names = names;
stats->descs = descs;
stats->num_counters = num_counters; stats->num_counters = num_counters;
stats->lifespan = msecs_to_jiffies(lifespan); stats->lifespan = msecs_to_jiffies(lifespan);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment