From 5e77ccb13ef5aa8c0bb7bc684d20845e9f99babe Mon Sep 17 00:00:00 2001 From: =?utf8?q?Francisco=20Trivi=C3=B1o?= Date: Mon, 14 Nov 2016 08:46:14 -0800 Subject: [PATCH] IB/cm: return original rnr value when RNR WA for PSIF MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit With this patch, the original min_rnr_value set by the user is saved in case it is later queried. The ib_qp flag has been re-purposed to store the value in addition. This patch makes the RNR WA implementation total transparent for the user. Orabug: 24785622 Reviewed-by: Håkon Bugge Reviewed-by: Santosh Shilimkar Signed-off-by: Francisco Triviño --- drivers/infiniband/core/uverbs_cmd.c | 5 ++++- drivers/infiniband/core/verbs.c | 21 +++++++++++++++++---- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c index 586629c680c2..92f9bfc32032 100644 --- a/drivers/infiniband/core/uverbs_cmd.c +++ b/drivers/infiniband/core/uverbs_cmd.c @@ -2824,8 +2824,11 @@ ssize_t ib_uverbs_modify_qp(struct ib_uverbs_file *file, qp->qp_flag |= IB_GUID_RNR_TWEAK; if ((qp->qp_flag & IB_GUID_RNR_TWEAK) && - (cmd.attr_mask & IB_QP_MIN_RNR_TIMER)) + (cmd.attr_mask & IB_QP_MIN_RNR_TIMER)) { + /* Save original min_rnr_timer value in qp->qp_flag */ + qp->qp_flag = attr->min_rnr_timer | IB_QP_MIN_RNR_TIMER; attr->min_rnr_timer = ib_uverbs_rnr_timeout_sif[attr->min_rnr_timer]; + } ret = qp->device->modify_qp(qp, attr, cmd.attr_mask, &udata); } else { diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c index cb63b692472f..dbc1afff750e 100644 --- a/drivers/infiniband/core/verbs.c +++ b/drivers/infiniband/core/verbs.c @@ -948,8 +948,11 @@ int ib_modify_qp(struct ib_qp *qp, qp->qp_flag |= IB_GUID_RNR_TWEAK; if ((qp->qp_flag & IB_GUID_RNR_TWEAK) && - (qp_attr_mask & IB_QP_MIN_RNR_TIMER)) + (qp_attr_mask & IB_QP_MIN_RNR_TIMER)) { + /* Original min_rnr_timer value is saved in qp->qp_flag */ + qp->qp_flag = idx | IB_QP_MIN_RNR_TIMER; qp_attr->min_rnr_timer = ib_rnr_timeout_sif[idx]; + } return qp->device->modify_qp(qp->real_qp, qp_attr, qp_attr_mask, NULL); } @@ -960,9 +963,19 @@ int ib_query_qp(struct ib_qp *qp, int qp_attr_mask, struct ib_qp_init_attr *qp_init_attr) { - return qp->device->query_qp ? - qp->device->query_qp(qp->real_qp, qp_attr, qp_attr_mask, qp_init_attr) : - -ENOSYS; + int ret; + + if (!qp->device->query_qp) + return -ENOSYS; + + ret = qp->device->query_qp(qp->real_qp, qp_attr, + qp_attr_mask, qp_init_attr); + + if (!ret && (qp_attr_mask & IB_QP_MIN_RNR_TIMER) && + (qp->qp_flag & IB_GUID_RNR_TWEAK)) + qp_attr->min_rnr_timer = qp->qp_flag & ~IB_GUID_RNR_TWEAK; + + return ret; } EXPORT_SYMBOL(ib_query_qp); -- 2.50.1