mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-23 04:34:11 +08:00
RDMA/ocrdma: Add support for IB stack compliant stats in sysfs.
Add the following per-port sysfs traffic counters for RoCE: port_xmit_packets port_rcv_packets port_rcv_data port_xmit_data Signed-off-by: Mitesh Ahuja <mitesh.ahuja@emulex.com> Signed-off-by: Devesh Sharma <devesh.sharma@emulex.com> Signed-off-by: Selvin Xavier <selvin.xavier@emulex.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
This commit is contained in:
parent
bfa76d4957
commit
cad1fbb0fd
@ -29,11 +29,13 @@
|
||||
#include <net/netevent.h>
|
||||
|
||||
#include <rdma/ib_addr.h>
|
||||
#include <rdma/ib_mad.h>
|
||||
|
||||
#include "ocrdma.h"
|
||||
#include "ocrdma_verbs.h"
|
||||
#include "ocrdma_ah.h"
|
||||
#include "ocrdma_hw.h"
|
||||
#include "ocrdma_stats.h"
|
||||
|
||||
#define OCRDMA_VID_PCP_SHIFT 0xD
|
||||
|
||||
@ -191,5 +193,20 @@ int ocrdma_process_mad(struct ib_device *ibdev,
|
||||
struct ib_grh *in_grh,
|
||||
struct ib_mad *in_mad, struct ib_mad *out_mad)
|
||||
{
|
||||
return IB_MAD_RESULT_SUCCESS;
|
||||
int status;
|
||||
struct ocrdma_dev *dev;
|
||||
|
||||
switch (in_mad->mad_hdr.mgmt_class) {
|
||||
case IB_MGMT_CLASS_PERF_MGMT:
|
||||
dev = get_ocrdma_dev(ibdev);
|
||||
if (!ocrdma_pma_counters(dev, out_mad))
|
||||
status = IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_REPLY;
|
||||
else
|
||||
status = IB_MAD_RESULT_SUCCESS;
|
||||
break;
|
||||
default:
|
||||
status = IB_MAD_RESULT_SUCCESS;
|
||||
break;
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
@ -26,6 +26,7 @@
|
||||
*******************************************************************/
|
||||
|
||||
#include <rdma/ib_addr.h>
|
||||
#include <rdma/ib_pma.h>
|
||||
#include "ocrdma_stats.h"
|
||||
|
||||
static struct dentry *ocrdma_dbgfs_dir;
|
||||
@ -249,6 +250,27 @@ static char *ocrdma_rx_stats(struct ocrdma_dev *dev)
|
||||
return stats;
|
||||
}
|
||||
|
||||
static u64 ocrdma_sysfs_rcv_pkts(struct ocrdma_dev *dev)
|
||||
{
|
||||
struct ocrdma_rdma_stats_resp *rdma_stats =
|
||||
(struct ocrdma_rdma_stats_resp *)dev->stats_mem.va;
|
||||
struct ocrdma_rx_stats *rx_stats = &rdma_stats->rx_stats;
|
||||
|
||||
return convert_to_64bit(rx_stats->roce_frames_lo,
|
||||
rx_stats->roce_frames_hi) + (u64)rx_stats->roce_frame_icrc_drops
|
||||
+ (u64)rx_stats->roce_frame_payload_len_drops;
|
||||
}
|
||||
|
||||
static u64 ocrdma_sysfs_rcv_data(struct ocrdma_dev *dev)
|
||||
{
|
||||
struct ocrdma_rdma_stats_resp *rdma_stats =
|
||||
(struct ocrdma_rdma_stats_resp *)dev->stats_mem.va;
|
||||
struct ocrdma_rx_stats *rx_stats = &rdma_stats->rx_stats;
|
||||
|
||||
return (convert_to_64bit(rx_stats->roce_frame_bytes_lo,
|
||||
rx_stats->roce_frame_bytes_hi))/4;
|
||||
}
|
||||
|
||||
static char *ocrdma_tx_stats(struct ocrdma_dev *dev)
|
||||
{
|
||||
char *stats = dev->stats_mem.debugfs_mem, *pcur;
|
||||
@ -292,6 +314,37 @@ static char *ocrdma_tx_stats(struct ocrdma_dev *dev)
|
||||
return stats;
|
||||
}
|
||||
|
||||
static u64 ocrdma_sysfs_xmit_pkts(struct ocrdma_dev *dev)
|
||||
{
|
||||
struct ocrdma_rdma_stats_resp *rdma_stats =
|
||||
(struct ocrdma_rdma_stats_resp *)dev->stats_mem.va;
|
||||
struct ocrdma_tx_stats *tx_stats = &rdma_stats->tx_stats;
|
||||
|
||||
return (convert_to_64bit(tx_stats->send_pkts_lo,
|
||||
tx_stats->send_pkts_hi) +
|
||||
convert_to_64bit(tx_stats->write_pkts_lo, tx_stats->write_pkts_hi) +
|
||||
convert_to_64bit(tx_stats->read_pkts_lo, tx_stats->read_pkts_hi) +
|
||||
convert_to_64bit(tx_stats->read_rsp_pkts_lo,
|
||||
tx_stats->read_rsp_pkts_hi) +
|
||||
convert_to_64bit(tx_stats->ack_pkts_lo, tx_stats->ack_pkts_hi));
|
||||
}
|
||||
|
||||
static u64 ocrdma_sysfs_xmit_data(struct ocrdma_dev *dev)
|
||||
{
|
||||
struct ocrdma_rdma_stats_resp *rdma_stats =
|
||||
(struct ocrdma_rdma_stats_resp *)dev->stats_mem.va;
|
||||
struct ocrdma_tx_stats *tx_stats = &rdma_stats->tx_stats;
|
||||
|
||||
return (convert_to_64bit(tx_stats->send_bytes_lo,
|
||||
tx_stats->send_bytes_hi) +
|
||||
convert_to_64bit(tx_stats->write_bytes_lo,
|
||||
tx_stats->write_bytes_hi) +
|
||||
convert_to_64bit(tx_stats->read_req_bytes_lo,
|
||||
tx_stats->read_req_bytes_hi) +
|
||||
convert_to_64bit(tx_stats->read_rsp_bytes_lo,
|
||||
tx_stats->read_rsp_bytes_hi))/4;
|
||||
}
|
||||
|
||||
static char *ocrdma_wqe_stats(struct ocrdma_dev *dev)
|
||||
{
|
||||
char *stats = dev->stats_mem.debugfs_mem, *pcur;
|
||||
@ -448,6 +501,22 @@ static void ocrdma_update_stats(struct ocrdma_dev *dev)
|
||||
}
|
||||
}
|
||||
|
||||
int ocrdma_pma_counters(struct ocrdma_dev *dev,
|
||||
struct ib_mad *out_mad)
|
||||
{
|
||||
struct ib_pma_portcounters *pma_cnt;
|
||||
|
||||
memset(out_mad->data, 0, sizeof out_mad->data);
|
||||
pma_cnt = (void *)(out_mad->data + 40);
|
||||
ocrdma_update_stats(dev);
|
||||
|
||||
pma_cnt->port_xmit_data = cpu_to_be32(ocrdma_sysfs_xmit_data(dev));
|
||||
pma_cnt->port_rcv_data = cpu_to_be32(ocrdma_sysfs_rcv_data(dev));
|
||||
pma_cnt->port_xmit_packets = cpu_to_be32(ocrdma_sysfs_xmit_pkts(dev));
|
||||
pma_cnt->port_rcv_packets = cpu_to_be32(ocrdma_sysfs_rcv_pkts(dev));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t ocrdma_dbgfs_ops_read(struct file *filp, char __user *buffer,
|
||||
size_t usr_buf_len, loff_t *ppos)
|
||||
{
|
||||
|
@ -50,5 +50,7 @@ void ocrdma_rem_debugfs(void);
|
||||
void ocrdma_init_debugfs(void);
|
||||
void ocrdma_rem_port_stats(struct ocrdma_dev *dev);
|
||||
void ocrdma_add_port_stats(struct ocrdma_dev *dev);
|
||||
int ocrdma_pma_counters(struct ocrdma_dev *dev,
|
||||
struct ib_mad *out_mad);
|
||||
|
||||
#endif /* __OCRDMA_STATS_H__ */
|
||||
|
Loading…
Reference in New Issue
Block a user