Introduce ib_get_qp_err_syndrome function, which enables kernel applications to query the reason the QP moved to error state. Even in cases in which no CQE was generated. Signed-off-by: Patrisious Haddad <phaddad@xxxxxxxxxx> Reviewed-by: Leon Romanovsky <leonro@xxxxxxxxxx> --- drivers/infiniband/core/device.c | 1 + drivers/infiniband/core/verbs.c | 8 ++++++++ include/rdma/ib_verbs.h | 13 +++++++++++++ 3 files changed, 22 insertions(+) diff --git a/drivers/infiniband/core/device.c b/drivers/infiniband/core/device.c index ae60c73babcc..8235b8fa1100 100644 --- a/drivers/infiniband/core/device.c +++ b/drivers/infiniband/core/device.c @@ -2657,6 +2657,7 @@ void ib_set_device_ops(struct ib_device *dev, const struct ib_device_ops *ops) SET_DEVICE_OP(dev_ops, get_netdev); SET_DEVICE_OP(dev_ops, get_numa_node); SET_DEVICE_OP(dev_ops, get_port_immutable); + SET_DEVICE_OP(dev_ops, get_qp_err_syndrome); SET_DEVICE_OP(dev_ops, get_vector_affinity); SET_DEVICE_OP(dev_ops, get_vf_config); SET_DEVICE_OP(dev_ops, get_vf_guid); diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c index e54b3f1b730e..ac20af8be33a 100644 --- a/drivers/infiniband/core/verbs.c +++ b/drivers/infiniband/core/verbs.c @@ -1952,6 +1952,14 @@ int ib_query_qp(struct ib_qp *qp, } EXPORT_SYMBOL(ib_query_qp); +int ib_get_qp_err_syndrome(struct ib_qp *qp, char *str) +{ + return qp->device->ops.get_qp_err_syndrome ? + qp->device->ops.get_qp_err_syndrome(qp->real_qp, + str) : -EOPNOTSUPP; +} +EXPORT_SYMBOL(ib_get_qp_err_syndrome); + int ib_close_qp(struct ib_qp *qp) { struct ib_qp *real_qp; diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h index 975d6e9efbcb..9a94f2ef993c 100644 --- a/include/rdma/ib_verbs.h +++ b/include/rdma/ib_verbs.h @@ -2465,6 +2465,7 @@ struct ib_device_ops { int qp_attr_mask, struct ib_udata *udata); int (*query_qp)(struct ib_qp *qp, struct ib_qp_attr *qp_attr, int qp_attr_mask, struct ib_qp_init_attr *qp_init_attr); + int (*get_qp_err_syndrome)(struct ib_qp *qp, char *str); int (*destroy_qp)(struct ib_qp *qp, struct ib_udata *udata); int (*create_cq)(struct ib_cq *cq, const struct ib_cq_init_attr *attr, struct ib_udata *udata); @@ -3777,6 +3778,18 @@ int ib_query_qp(struct ib_qp *qp, int qp_attr_mask, struct ib_qp_init_attr *qp_init_attr); +#define IB_ERR_SYNDROME_LENGTH 256 + +/** + * ib_get_qp_err_syndrome - Returns a string that describes the reason + * the specified QP moved to error state. + * @qp : The QP to query. + * @str: The reason the qp moved to error state. + * + * NOTE: the user must pass a str with size of at least IB_ERR_SYNDROME_LENGTH + */ +int ib_get_qp_err_syndrome(struct ib_qp *qp, char *str); + /** * ib_destroy_qp - Destroys the specified QP. * @qp: The QP to destroy. -- 2.18.1