Skip to content

Commit

Permalink
common/mlx5: add DevX commands for queue counters
Browse files Browse the repository at this point in the history
[ upstream commit 750e48c ]

A queue counter set is an HW object that can be assigned to any RQ\QP
and it counts HW events on the assigned QPs\RQs.

Add DevX API to allocate and query queue counter set object.

The only used counter event is the "out of buffer" where the queue
drops packets when no SW buffer is available to receive it.

Signed-off-by: Matan Azrad <matan@nvidia.com>
Acked-by: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
  • Loading branch information
matan1559 authored and steevenlee committed May 8, 2021
1 parent 6e06d42 commit 4371d3b
Show file tree
Hide file tree
Showing 4 changed files with 163 additions and 1 deletion.
73 changes: 73 additions & 0 deletions drivers/common/mlx5/mlx5_devx_cmds.c
Original file line number Diff line number Diff line change
Expand Up @@ -2077,3 +2077,76 @@ mlx5_devx_cmd_wq_query(void *wq, uint32_t *counter_set_id)
return -ENOTSUP;
#endif
}

/*
* Allocate queue counters via devx interface.
*
* @param[in] ctx
* Context returned from mlx5 open_device() glue function.
*
* @return
* Pointer to counter object on success, a NULL value otherwise and
* rte_errno is set.
*/
struct mlx5_devx_obj *
mlx5_devx_cmd_queue_counter_alloc(void *ctx)
{
struct mlx5_devx_obj *dcs = mlx5_malloc(MLX5_MEM_ZERO, sizeof(*dcs), 0,
SOCKET_ID_ANY);
uint32_t in[MLX5_ST_SZ_DW(alloc_q_counter_in)] = {0};
uint32_t out[MLX5_ST_SZ_DW(alloc_q_counter_out)] = {0};

if (!dcs) {
rte_errno = ENOMEM;
return NULL;
}
MLX5_SET(alloc_q_counter_in, in, opcode, MLX5_CMD_OP_ALLOC_Q_COUNTER);
dcs->obj = mlx5_glue->devx_obj_create(ctx, in, sizeof(in), out,
sizeof(out));
if (!dcs->obj) {
DRV_LOG(DEBUG, "Can't allocate q counter set by DevX - error "
"%d.", errno);
rte_errno = errno;
mlx5_free(dcs);
return NULL;
}
dcs->id = MLX5_GET(alloc_q_counter_out, out, counter_set_id);
return dcs;
}

/**
* Query queue counters values.
*
* @param[in] dcs
* devx object of the queue counter set.
* @param[in] clear
* Whether hardware should clear the counters after the query or not.
* @param[out] out_of_buffers
* Number of dropped occurred due to lack of WQE for the associated QPs/RQs.
*
* @return
* 0 on success, a negative value otherwise.
*/
int
mlx5_devx_cmd_queue_counter_query(struct mlx5_devx_obj *dcs, int clear,
uint32_t *out_of_buffers)
{
uint32_t out[MLX5_ST_SZ_BYTES(query_q_counter_out)] = {0};
uint32_t in[MLX5_ST_SZ_DW(query_q_counter_in)] = {0};
int rc;

MLX5_SET(query_q_counter_in, in, opcode,
MLX5_CMD_OP_QUERY_Q_COUNTER);
MLX5_SET(query_q_counter_in, in, op_mod, 0);
MLX5_SET(query_q_counter_in, in, counter_set_id, dcs->id);
MLX5_SET(query_q_counter_in, in, clear, !!clear);
rc = mlx5_glue->devx_obj_query(dcs->obj, in, sizeof(in), out,
sizeof(out));
if (rc) {
DRV_LOG(ERR, "Failed to query devx q counter set - rc %d", rc);
rte_errno = rc;
return -rc;
}
*out_of_buffers = MLX5_GET(query_q_counter_out, out, out_of_buffer);
return 0;
}
6 changes: 6 additions & 0 deletions drivers/common/mlx5/mlx5_devx_cmds.h
Original file line number Diff line number Diff line change
Expand Up @@ -505,4 +505,10 @@ struct mlx5_devx_obj *mlx5_devx_cmd_create_flow_hit_aso_obj(void *ctx,

__rte_internal
int mlx5_devx_cmd_wq_query(void *wq, uint32_t *counter_set_id);

__rte_internal
struct mlx5_devx_obj *mlx5_devx_cmd_queue_counter_alloc(void *ctx);
__rte_internal
int mlx5_devx_cmd_queue_counter_query(struct mlx5_devx_obj *dcs, int clear,
uint32_t *out_of_buffers);
#endif /* RTE_PMD_MLX5_DEVX_CMDS_H_ */
81 changes: 81 additions & 0 deletions drivers/common/mlx5/mlx5_prm.h
Original file line number Diff line number Diff line change
Expand Up @@ -843,6 +843,8 @@ enum {
MLX5_CMD_OP_SUSPEND_QP = 0x50F,
MLX5_CMD_OP_RESUME_QP = 0x510,
MLX5_CMD_OP_QUERY_NIC_VPORT_CONTEXT = 0x754,
MLX5_CMD_OP_ALLOC_Q_COUNTER = 0x771,
MLX5_CMD_OP_QUERY_Q_COUNTER = 0x773,
MLX5_CMD_OP_ACCESS_REGISTER = 0x805,
MLX5_CMD_OP_ALLOC_TRANSPORT_DOMAIN = 0x816,
MLX5_CMD_OP_CREATE_TIR = 0x900,
Expand Down Expand Up @@ -3034,6 +3036,85 @@ struct mlx5_ifc_query_regexp_register_out_bits {
u8 register_data[0x20];
};

/* Queue counters. */
struct mlx5_ifc_alloc_q_counter_out_bits {
u8 status[0x8];
u8 reserved_at_8[0x18];
u8 syndrome[0x20];
u8 reserved_at_40[0x18];
u8 counter_set_id[0x8];
u8 reserved_at_60[0x20];
};

struct mlx5_ifc_alloc_q_counter_in_bits {
u8 opcode[0x10];
u8 uid[0x10];
u8 reserved_at_20[0x10];
u8 op_mod[0x10];
u8 reserved_at_40[0x40];
};

struct mlx5_ifc_query_q_counter_out_bits {
u8 status[0x8];
u8 reserved_at_8[0x18];
u8 syndrome[0x20];
u8 reserved_at_40[0x40];
u8 rx_write_requests[0x20];
u8 reserved_at_a0[0x20];
u8 rx_read_requests[0x20];
u8 reserved_at_e0[0x20];
u8 rx_atomic_requests[0x20];
u8 reserved_at_120[0x20];
u8 rx_dct_connect[0x20];
u8 reserved_at_160[0x20];
u8 out_of_buffer[0x20];
u8 reserved_at_1a0[0x20];
u8 out_of_sequence[0x20];
u8 reserved_at_1e0[0x20];
u8 duplicate_request[0x20];
u8 reserved_at_220[0x20];
u8 rnr_nak_retry_err[0x20];
u8 reserved_at_260[0x20];
u8 packet_seq_err[0x20];
u8 reserved_at_2a0[0x20];
u8 implied_nak_seq_err[0x20];
u8 reserved_at_2e0[0x20];
u8 local_ack_timeout_err[0x20];
u8 reserved_at_320[0xa0];
u8 resp_local_length_error[0x20];
u8 req_local_length_error[0x20];
u8 resp_local_qp_error[0x20];
u8 local_operation_error[0x20];
u8 resp_local_protection[0x20];
u8 req_local_protection[0x20];
u8 resp_cqe_error[0x20];
u8 req_cqe_error[0x20];
u8 req_mw_binding[0x20];
u8 req_bad_response[0x20];
u8 req_remote_invalid_request[0x20];
u8 resp_remote_invalid_request[0x20];
u8 req_remote_access_errors[0x20];
u8 resp_remote_access_errors[0x20];
u8 req_remote_operation_errors[0x20];
u8 req_transport_retries_exceeded[0x20];
u8 cq_overflow[0x20];
u8 resp_cqe_flush_error[0x20];
u8 req_cqe_flush_error[0x20];
u8 reserved_at_620[0x1e0];
};

struct mlx5_ifc_query_q_counter_in_bits {
u8 opcode[0x10];
u8 uid[0x10];
u8 reserved_at_20[0x10];
u8 op_mod[0x10];
u8 reserved_at_40[0x80];
u8 clear[0x1];
u8 reserved_at_c1[0x1f];
u8 reserved_at_e0[0x18];
u8 counter_set_id[0x8];
};

/* CQE format mask. */
#define MLX5E_CQE_FORMAT_MASK 0xc

Expand Down
4 changes: 3 additions & 1 deletion drivers/common/mlx5/version.map
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ INTERNAL {
mlx5_devx_cmd_create_tis;
mlx5_devx_cmd_create_virtio_q_counters;
mlx5_devx_cmd_create_virtq;
mlx5_devx_cmd_create_flow_hit_aso_obj;
mlx5_devx_cmd_create_flow_hit_aso_obj;
mlx5_devx_cmd_destroy;
mlx5_devx_cmd_flow_counter_alloc;
mlx5_devx_cmd_flow_counter_query;
Expand All @@ -38,6 +38,8 @@ INTERNAL {
mlx5_devx_cmd_query_parse_samples;
mlx5_devx_cmd_query_virtio_q_counters;
mlx5_devx_cmd_query_virtq;
mlx5_devx_cmd_queue_counter_alloc;
mlx5_devx_cmd_queue_counter_query;
mlx5_devx_cmd_register_read;
mlx5_devx_cmd_wq_query;
mlx5_devx_get_out_command_status;
Expand Down

0 comments on commit 4371d3b

Please sign in to comment.