Provide already supported real-time timestamp
Subsystems (6)
cover Provide already supported real-time timestamp
From: Leon Romanovsky <[email protected]>
In case device supports only real-time timestamp, the kernel will fail to create QP despite rdma-core requested such timestamp type.
It is because device returns free-running timestamp, and the conversion from free-running to real-time is performed in the user space.
This series fixes it, by returning real-time timestamp.
Thanks
Aharon Landau (2):
RDMA/mlx5: Refactor get_ts_format functions to simplify code RDMA/mlx5: Support real-time timestamp directly from the device
drivers/infiniband/hw/mlx5/cq.c | 6 +- drivers/infiniband/hw/mlx5/main.c | 6 ++ drivers/infiniband/hw/mlx5/mlx5_ib.h | 7 ++ drivers/infiniband/hw/mlx5/qp.c | 102 ++++++++++-------- .../net/ethernet/mellanox/mlx5/core/en_main.c | 8 +- .../ethernet/mellanox/mlx5/core/lib/clock.h | 10 +- include/linux/mlx5/mlx5_ifc.h | 36 ++----- include/linux/mlx5/qp.h | 4 +- include/uapi/rdma/mlx5-abi.h | 2 + 9 files changed, 94 insertions(+), 87 deletions(-)
Signature · 1 line
2.31.1
PATCH 1/2 RDMA/mlx5: Refactor get_ts_format functions to simplify code
From: Aharon Landau <[email protected]>
QPC, SQC and RQC timestamp formats and capabilities are always equal because they represent general hardware support. So instead of code duplication, let's merge them into general enum and logic.
--- drivers/infiniband/hw/mlx5/qp.c | 84 ++++++++----------- .../net/ethernet/mellanox/mlx5/core/en_main.c | 8 +- .../ethernet/mellanox/mlx5/core/lib/clock.h | 10 ++- include/linux/mlx5/mlx5_ifc.h | 36 ++------ include/linux/mlx5/qp.h | 4 +- 5 files changed, 55 insertions(+), 87 deletions(-)
drivers/infiniband/hw/mlx5/qp.c +37 -47
@@ -1175,69 +1175,59 @@ static void destroy_flow_rule_vport_sq(struct mlx5_ib_sq *sq) sq->flow_rule =NULL ; } -static int get_rq_ts_format (struct mlx5_ib_dev *dev,struct mlx5_ib_cq *send_cq) +static bool fr_supported (int ts_cap) { -bool fr_supported = -MLX5_CAP_GEN (dev->mdev, rq_ts_format) == -MLX5_RQ_TIMESTAMP_FORMAT_CAP_FREE_RUNNING || -MLX5_CAP_GEN (dev->mdev, rq_ts_format) == -MLX5_RQ_TIMESTAMP_FORMAT_CAP_FREE_RUNNING_AND_REAL_TIME ; +return ts_cap ==MLX5_TIMESTAMP_FORMAT_CAP_FREE_RUNNING || + ts_cap ==MLX5_TIMESTAMP_FORMAT_CAP_FREE_RUNNING_AND_REAL_TIME ; +} -if (send_cq->create_flags &IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION ) { -if (!fr_supported) { -mlx5_ib_dbg (dev,"Free running TS format is not supported\n" ); +static int get_ts_format (struct mlx5_ib_dev *dev,struct mlx5_ib_cq *cq, +bool fr_sup) +{ +if (cq->create_flags &IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION ) { +if (!fr_sup) { +mlx5_ib_dbg (dev, +"Free running TS format is not supported\n" );return -EOPNOTSUPP ; } -return MLX5_RQC_TIMESTAMP_FORMAT_FREE_RUNNING ; +return MLX5_TIMESTAMP_FORMAT_FREE_RUNNING ; } -return fr_supported ?MLX5_RQC_TIMESTAMP_FORMAT_FREE_RUNNING : -MLX5_RQC_TIMESTAMP_FORMAT_DEFAULT ; +return fr_sup ?MLX5_TIMESTAMP_FORMAT_FREE_RUNNING : +MLX5_TIMESTAMP_FORMAT_DEFAULT ; +} + +static int get_rq_ts_format (struct mlx5_ib_dev *dev,struct mlx5_ib_cq *recv_cq) +{ +u8 ts_cap =MLX5_CAP_GEN (dev->mdev, rq_ts_format); + +return get_ts_format (dev, recv_cq,fr_supported (ts_cap)); }static int get_sq_ts_format (struct mlx5_ib_dev *dev,struct mlx5_ib_cq *send_cq) { -bool fr_supported = -MLX5_CAP_GEN (dev->mdev, sq_ts_format) == -MLX5_SQ_TIMESTAMP_FORMAT_CAP_FREE_RUNNING || -MLX5_CAP_GEN (dev->mdev, sq_ts_format) == -MLX5_SQ_TIMESTAMP_FORMAT_CAP_FREE_RUNNING_AND_REAL_TIME ; +u8 ts_cap =MLX5_CAP_GEN (dev->mdev, sq_ts_format); -if (send_cq->create_flags &IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION ) { -if (!fr_supported) { -mlx5_ib_dbg (dev,"Free running TS format is not supported\n" ); -return -EOPNOTSUPP ; - } -return MLX5_SQC_TIMESTAMP_FORMAT_FREE_RUNNING ; - } -return fr_supported ?MLX5_SQC_TIMESTAMP_FORMAT_FREE_RUNNING : -MLX5_SQC_TIMESTAMP_FORMAT_DEFAULT ; +return get_ts_format (dev, send_cq,fr_supported (ts_cap)); }static int get_qp_ts_format (struct mlx5_ib_dev *dev,struct mlx5_ib_cq *send_cq,struct mlx5_ib_cq *recv_cq) { -bool fr_supported = -MLX5_CAP_ROCE (dev->mdev, qp_ts_format) == -MLX5_QP_TIMESTAMP_FORMAT_CAP_FREE_RUNNING || -MLX5_CAP_ROCE (dev->mdev, qp_ts_format) == -MLX5_QP_TIMESTAMP_FORMAT_CAP_FREE_RUNNING_AND_REAL_TIME ; -int ts_format = fr_supported ?MLX5_QPC_TIMESTAMP_FORMAT_FREE_RUNNING : -MLX5_QPC_TIMESTAMP_FORMAT_DEFAULT ; - -if (recv_cq && - recv_cq->create_flags &IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION ) - ts_format =MLX5_QPC_TIMESTAMP_FORMAT_FREE_RUNNING ; - -if (send_cq && - send_cq->create_flags &IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION ) - ts_format =MLX5_QPC_TIMESTAMP_FORMAT_FREE_RUNNING ; - -if (ts_format ==MLX5_QPC_TIMESTAMP_FORMAT_FREE_RUNNING && - !fr_supported) { -mlx5_ib_dbg (dev,"Free running TS format is not supported\n" ); +u8 ts_cap =MLX5_CAP_ROCE (dev->mdev, qp_ts_format); +bool fr_sup =fr_supported (ts_cap); +u8 default_ts = fr_sup ?MLX5_TIMESTAMP_FORMAT_FREE_RUNNING : +MLX5_TIMESTAMP_FORMAT_DEFAULT ; +int send_ts_format = + send_cq ?get_ts_format (dev, send_cq, fr_sup) : + default_ts; +int recv_ts_format = + recv_cq ?get_ts_format (dev, recv_cq, fr_sup) : + default_ts; + +if (send_ts_format <0 || recv_ts_format <0 )return -EOPNOTSUPP ; - } -return ts_format; + +return send_ts_format == default_ts ? recv_ts_format : send_ts_format; } static int create_raw_packet_qp_sq(struct mlx5_ib_dev *dev,
drivers/net/ethernet/mellanox/mlx5/core/en_main.c +4 -4
@@ -643,8 +643,8 @@ int mlx5e_create_rq(struct mlx5e_rq *rq, struct mlx5e_rq_param *param)return -ENOMEM ; ts_format =mlx5_is_real_time_rq (mdev) ? -MLX5_RQC_TIMESTAMP_FORMAT_REAL_TIME : -MLX5_RQC_TIMESTAMP_FORMAT_FREE_RUNNING ; +MLX5_TIMESTAMP_FORMAT_REAL_TIME : +MLX5_TIMESTAMP_FORMAT_FREE_RUNNING ; rqc =MLX5_ADDR_OF (create_rq_in, in, ctx); wq =MLX5_ADDR_OF (rqc, rqc, wq);
@@ -1184,8 +1184,8 @@ static int mlx5e_create_sq(struct mlx5_core_dev *mdev,return -ENOMEM ; ts_format =mlx5_is_real_time_sq (mdev) ? -MLX5_SQC_TIMESTAMP_FORMAT_REAL_TIME : -MLX5_SQC_TIMESTAMP_FORMAT_FREE_RUNNING ; +MLX5_TIMESTAMP_FORMAT_REAL_TIME : +MLX5_TIMESTAMP_FORMAT_FREE_RUNNING ; sqc =MLX5_ADDR_OF (create_sq_in, in, ctx); wq =MLX5_ADDR_OF (sqc, sqc, wq);
drivers/net/ethernet/mellanox/mlx5/core/lib/clock.h +6 -4
@@ -37,16 +37,18 @@ static inline bool mlx5_is_real_time_rq(struct mlx5_core_dev *mdev) {u8 rq_ts_format_cap =MLX5_CAP_GEN (mdev, rq_ts_format); -return (rq_ts_format_cap ==MLX5_RQ_TIMESTAMP_FORMAT_CAP_REAL_TIME || - rq_ts_format_cap ==MLX5_RQ_TIMESTAMP_FORMAT_CAP_FREE_RUNNING_AND_REAL_TIME ); +return (rq_ts_format_cap ==MLX5_TIMESTAMP_FORMAT_CAP_REAL_TIME || + rq_ts_format_cap == +MLX5_TIMESTAMP_FORMAT_CAP_FREE_RUNNING_AND_REAL_TIME ); }static inline bool mlx5_is_real_time_sq (struct mlx5_core_dev *mdev) {u8 sq_ts_format_cap =MLX5_CAP_GEN (mdev, sq_ts_format); -return (sq_ts_format_cap ==MLX5_SQ_TIMESTAMP_FORMAT_CAP_REAL_TIME || - sq_ts_format_cap ==MLX5_SQ_TIMESTAMP_FORMAT_CAP_FREE_RUNNING_AND_REAL_TIME ); +return (sq_ts_format_cap ==MLX5_TIMESTAMP_FORMAT_CAP_REAL_TIME || + sq_ts_format_cap == +MLX5_TIMESTAMP_FORMAT_CAP_FREE_RUNNING_AND_REAL_TIME ); }typedef ktime_t (*cqe_ts_to_ns )(struct mlx5_clock *,u64 );
include/linux/mlx5/mlx5_ifc.h +6 -30
@@ -953,9 +953,9 @@ struct mlx5_ifc_per_protocol_networking_offload_caps_bits { };enum { -MLX5_QP_TIMESTAMP_FORMAT_CAP_FREE_RUNNING =0x0 , -MLX5_QP_TIMESTAMP_FORMAT_CAP_REAL_TIME =0x1 , -MLX5_QP_TIMESTAMP_FORMAT_CAP_FREE_RUNNING_AND_REAL_TIME =0x2 , +MLX5_TIMESTAMP_FORMAT_CAP_FREE_RUNNING =0x0 , +MLX5_TIMESTAMP_FORMAT_CAP_REAL_TIME =0x1 , +MLX5_TIMESTAMP_FORMAT_CAP_FREE_RUNNING_AND_REAL_TIME =0x2 , };struct mlx5_ifc_roce_cap_bits {
@@ -1294,18 +1294,6 @@ enum { MLX5_STEERING_FORMAT_CONNECTX_6DX = 1, }; -enum { -MLX5_SQ_TIMESTAMP_FORMAT_CAP_FREE_RUNNING =0x0 , -MLX5_SQ_TIMESTAMP_FORMAT_CAP_REAL_TIME =0x1 , -MLX5_SQ_TIMESTAMP_FORMAT_CAP_FREE_RUNNING_AND_REAL_TIME =0x2 , -}; - -enum { -MLX5_RQ_TIMESTAMP_FORMAT_CAP_FREE_RUNNING =0x0 , -MLX5_RQ_TIMESTAMP_FORMAT_CAP_REAL_TIME =0x1 , -MLX5_RQ_TIMESTAMP_FORMAT_CAP_FREE_RUNNING_AND_REAL_TIME =0x2 , -}; -struct mlx5_ifc_cmd_hca_cap_bits {u8 reserved_at_0[0x1f ];u8 vhca_resource_manager[0x1 ];
@@ -2948,9 +2936,9 @@ enum { };enum { -MLX5_QPC_TIMESTAMP_FORMAT_FREE_RUNNING =0x0 , -MLX5_QPC_TIMESTAMP_FORMAT_DEFAULT =0x1 , -MLX5_QPC_TIMESTAMP_FORMAT_REAL_TIME =0x2 , +MLX5_TIMESTAMP_FORMAT_FREE_RUNNING =0x0 , +MLX5_TIMESTAMP_FORMAT_DEFAULT =0x1 , +MLX5_TIMESTAMP_FORMAT_REAL_TIME =0x2 , };struct mlx5_ifc_qpc_bits {
@@ -3402,12 +3390,6 @@ enum { MLX5_SQC_STATE_ERR = 0x3, }; -enum { -MLX5_SQC_TIMESTAMP_FORMAT_FREE_RUNNING =0x0 , -MLX5_SQC_TIMESTAMP_FORMAT_DEFAULT =0x1 , -MLX5_SQC_TIMESTAMP_FORMAT_REAL_TIME =0x2 , -}; -struct mlx5_ifc_sqc_bits {u8 rlky[0x1 ];u8 cd_master[0x1 ];
@@ -3513,12 +3495,6 @@ enum { MLX5_RQC_STATE_ERR = 0x3, }; -enum { -MLX5_RQC_TIMESTAMP_FORMAT_FREE_RUNNING =0x0 , -MLX5_RQC_TIMESTAMP_FORMAT_DEFAULT =0x1 , -MLX5_RQC_TIMESTAMP_FORMAT_REAL_TIME =0x2 , -}; -struct mlx5_ifc_rqc_bits {u8 rlky[0x1 ];u8 delay_drop_en[0x1 ];
include/linux/mlx5/qp.h +2 -2
@@ -550,8 +550,8 @@ static inline const char *mlx5_qp_state_str(int state)static inline int mlx5_get_qp_default_ts (struct mlx5_core_dev *dev) {return !MLX5_CAP_ROCE (dev, qp_ts_format) ? -MLX5_QPC_TIMESTAMP_FORMAT_FREE_RUNNING : -MLX5_QPC_TIMESTAMP_FORMAT_DEFAULT ; +MLX5_TIMESTAMP_FORMAT_FREE_RUNNING : +MLX5_TIMESTAMP_FORMAT_DEFAULT ; }#endif /* MLX5_QP_H */
Signature · 1 line
2.31.1
PATCH 2/2 RDMA/mlx5: Support real-time timestamp directly from the device
In reply to Leon RomanovskyFrom: Aharon Landau <[email protected]>
Currently, if the user asks for a real-time timestamp, the device will return a free-running one, and the timestamp will be translated to real-time in the user-space.
When the device supports only real-time timestamp and not free-running, the creation of the QP will fail even though the user needs supported the real-time one. To prevent this, we will return the real-time timestamp directly from the device.
--- drivers/infiniband/hw/mlx5/cq.c | 6 +++++- drivers/infiniband/hw/mlx5/main.c | 6 ++++++ drivers/infiniband/hw/mlx5/mlx5_ib.h | 7 +++++++ drivers/infiniband/hw/mlx5/qp.c | 30 +++++++++++++++++++++++----- include/uapi/rdma/mlx5-abi.h | 2 ++ 5 files changed, 45 insertions(+), 6 deletions(-)
drivers/infiniband/hw/mlx5/cq.c +5 -1
@@ -725,7 +725,8 @@ static int create_cq_user(struct mlx5_ib_dev *dev, struct ib_udata *udata,return -EFAULT ;if ((ucmd.flags & ~(MLX5_IB_CREATE_CQ_FLAGS_CQE_128B_PAD | -MLX5_IB_CREATE_CQ_FLAGS_UAR_PAGE_INDEX ))) +MLX5_IB_CREATE_CQ_FLAGS_UAR_PAGE_INDEX | +MLX5_IB_CREATE_CQ_FLAGS_REAL_TIME_TS )))return -EINVAL ; if ((ucmd.cqe_size != 64 && ucmd.cqe_size != 128) ||
@@ -826,6 +827,9 @@ static int create_cq_user(struct mlx5_ib_dev *dev, struct ib_udata *udata, cq->private_flags |=MLX5_IB_CQ_PR_FLAGS_CQE_128_PAD ; } +if (ucmd.flags &MLX5_IB_CREATE_CQ_FLAGS_REAL_TIME_TS ) + cq->private_flags |=MLX5_IB_CQ_PR_FLAGS_REAL_TIME_TS ; +MLX5_SET (create_cq_in, *cqb, uid, context->devx_uid);return 0 ;
drivers/infiniband/hw/mlx5/main.c +6 -0
@@ -1826,6 +1826,12 @@ static int set_ucontext_resp(struct ib_ucontext *uctx,if (MLX5_CAP_GEN (dev->mdev, ece_support)) resp->comp_mask |=MLX5_IB_ALLOC_UCONTEXT_RESP_MASK_ECE ; +if (rt_supported (MLX5_CAP_GEN (dev->mdev, sq_ts_format)) && +rt_supported (MLX5_CAP_GEN (dev->mdev, rq_ts_format)) && +rt_supported (MLX5_CAP_ROCE (dev->mdev, qp_ts_format))) + resp->comp_mask |= +MLX5_IB_ALLOC_UCONTEXT_RESP_MASK_REAL_TIME_TS ; + resp->num_dyn_bfregs = bfregi->num_dyn_bfregs;if (MLX5_CAP_GEN (dev->mdev, drain_sigerr))
drivers/infiniband/hw/mlx5/mlx5_ib.h +7 -0
@@ -549,6 +549,7 @@ static inline const struct mlx5_umr_wr *umr_wr(const struct ib_send_wr *wr)enum mlx5_ib_cq_pr_flags {MLX5_IB_CQ_PR_FLAGS_CQE_128_PAD =1 <<0 , +MLX5_IB_CQ_PR_FLAGS_REAL_TIME_TS =1 <<1 , };struct mlx5_ib_cq {
@@ -1636,4 +1637,10 @@ static inline bool mlx5_ib_lag_should_assign_affinity(struct mlx5_ib_dev *dev) (MLX5_CAP_GEN (dev->mdev, num_lag_ports) >1 && MLX5_CAP_GEN(dev->mdev, lag_tx_port_affinity)); } + +static inline bool rt_supported (int ts_cap) +{ +return ts_cap ==MLX5_TIMESTAMP_FORMAT_CAP_REAL_TIME || + ts_cap ==MLX5_TIMESTAMP_FORMAT_CAP_FREE_RUNNING_AND_REAL_TIME ; +}#endif /* MLX5_IB_H */
drivers/infiniband/hw/mlx5/qp.c +25 -5
@@ -1182,8 +1182,16 @@ static bool fr_supported(int ts_cap) }static int get_ts_format (struct mlx5_ib_dev *dev,struct mlx5_ib_cq *cq, -bool fr_sup) +bool fr_sup,bool rt_sup) { +if (cq->private_flags &MLX5_IB_CQ_PR_FLAGS_REAL_TIME_TS ) { +if (!rt_sup) { +mlx5_ib_dbg (dev, +"Real time TS format is not supported\n" ); +return -EOPNOTSUPP ; + } +return MLX5_TIMESTAMP_FORMAT_REAL_TIME ; + }if (cq->create_flags &IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION ) {if (!fr_sup) { mlx5_ib_dbg(dev,
@@ -1200,14 +1208,16 @@ static int get_rq_ts_format(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *recv_cq) {u8 ts_cap =MLX5_CAP_GEN (dev->mdev, rq_ts_format); -return get_ts_format (dev, recv_cq,fr_supported (ts_cap)); +return get_ts_format (dev, recv_cq,fr_supported (ts_cap), +rt_supported (ts_cap)); }static int get_sq_ts_format (struct mlx5_ib_dev *dev,struct mlx5_ib_cq *send_cq) {u8 ts_cap =MLX5_CAP_GEN (dev->mdev, sq_ts_format); -return get_ts_format (dev, send_cq,fr_supported (ts_cap)); +return get_ts_format (dev, send_cq,fr_supported (ts_cap), +rt_supported (ts_cap)); } static int get_qp_ts_format(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *send_cq,
@@ -1215,18 +1225,28 @@ static int get_qp_ts_format(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *send_cq, {u8 ts_cap =MLX5_CAP_ROCE (dev->mdev, qp_ts_format);bool fr_sup =fr_supported (ts_cap); +bool rt_sup =rt_supported (ts_cap);u8 default_ts = fr_sup ?MLX5_TIMESTAMP_FORMAT_FREE_RUNNING :MLX5_TIMESTAMP_FORMAT_DEFAULT ;int send_ts_format = - send_cq ?get_ts_format (dev, send_cq, fr_sup) : + send_cq ?get_ts_format (dev, send_cq, fr_sup, rt_sup) : default_ts;int recv_ts_format = - recv_cq ?get_ts_format (dev, recv_cq, fr_sup) : + recv_cq ?get_ts_format (dev, recv_cq, fr_sup, rt_sup) : default_ts;if (send_ts_format <0 || recv_ts_format <0 )return -EOPNOTSUPP ; +if (send_ts_format !=MLX5_TIMESTAMP_FORMAT_DEFAULT && + recv_ts_format !=MLX5_TIMESTAMP_FORMAT_DEFAULT && + send_ts_format != recv_ts_format) { +mlx5_ib_dbg ( + dev, +"The send ts_format does not match the receive ts_format\n" ); +return -EOPNOTSUPP ; + } +return send_ts_format == default_ts ? recv_ts_format : send_ts_format; }
include/uapi/rdma/mlx5-abi.h +2 -0
@@ -103,6 +103,7 @@ enum mlx5_ib_alloc_ucontext_resp_mask {MLX5_IB_ALLOC_UCONTEXT_RESP_MASK_DUMP_FILL_MKEY =1UL <<1 ,MLX5_IB_ALLOC_UCONTEXT_RESP_MASK_ECE =1UL <<2 ,MLX5_IB_ALLOC_UCONTEXT_RESP_MASK_SQD2RTS =1UL <<3 , + MLX5_IB_ALLOC_UCONTEXT_RESP_MASK_REAL_TIME_TS = 1UL << 4, }; enum mlx5_user_cmds_supp_uhw {
@@ -278,6 +279,7 @@ struct mlx5_ib_query_device_resp {enum mlx5_ib_create_cq_flags {MLX5_IB_CREATE_CQ_FLAGS_CQE_128B_PAD =1 <<0 ,MLX5_IB_CREATE_CQ_FLAGS_UAR_PAGE_INDEX =1 <<1 , +MLX5_IB_CREATE_CQ_FLAGS_REAL_TIME_TS =1 <<2 , };struct mlx5_ib_create_cq {
Signature · 1 line
2.31.1
Jason Gunthorpe
maintainerQuoted 8 lines · Leon Romanovsky
From: Leon Romanovsky <[email protected]>
In case device supports only real-time timestamp, the kernel will fail to create QP despite rdma-core requested such timestamp type.
It is because device returns free-running timestamp, and the conversion from free-running to real-time is performed in the user space.
Quoted 7 lines
This series fixes it, by returning real-time timestamp.
Thanks
Aharon Landau (2):
RDMA/mlx5: Refactorget_ts_formatfunctions to simplify code RDMA/mlx5: Support real-time timestamp directly from the device
This looks fine, can you update the shared branch please
Jason
Leon Romanovsky
AppliedQuoted 11 lines · Jason Gunthorpe
Quoted 10 lines · Leon Romanovsky
From: Leon Romanovsky <[email protected]>
In case device supports only real-time timestamp, the kernel will fail to create QP despite rdma-core requested such timestamp type.
It is because device returns free-running timestamp, and the conversion from free-running to real-time is performed in the user space.
This series fixes it, by returning real-time timestamp.
Quoted 7 lines
Quoted 5 lines
Thanks
Aharon Landau (2):
RDMA/mlx5: Refactorget_ts_formatfunctions to simplify code RDMA/mlx5: Support real-time timestamp directly from the deviceThis looks fine, can you update the shared branch please
9a1ac95a59d0 RDMA/mlx5: Refactor get_ts_format functions to simplify code
Applied, thanks
Quoted 2 lines
Jason
Jason Gunthorpe
maintainerQuoted 18 lines · Leon Romanovsky
Quoted 17 lines · Jason Gunthorpe
Quoted 15 lines · Leon Romanovsky
From: Leon Romanovsky <[email protected]>
In case device supports only real-time timestamp, the kernel will fail to create QP despite rdma-core requested such timestamp type.
It is because device returns free-running timestamp, and the conversion from free-running to real-time is performed in the user space.
This series fixes it, by returning real-time timestamp.
Thanks
Aharon Landau (2):
RDMA/mlx5: Refactorget_ts_formatfunctions to simplify code RDMA/mlx5: Support real-time timestamp directly from the device
Quoted 5 lines
Quoted 1 line
This looks fine, can you update the shared branch please
9a1ac95a59d0RDMA/mlx5: Refactorget_ts_formatfunctions to simplify codeApplied, thanks
Done, thanks
Jason