]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
IB/cm: return original rnr value when RNR WA for PSIF
authorFrancisco Triviño <francisco.trivino@oracle.com>
Mon, 14 Nov 2016 16:46:14 +0000 (08:46 -0800)
committerSantosh Shilimkar <santosh.shilimkar@oracle.com>
Mon, 14 Nov 2016 16:46:14 +0000 (08:46 -0800)
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 <haakon.bugge@oracle.com>
Reviewed-by: Santosh Shilimkar <santosh.shilimkar@oracle.com>
Signed-off-by: Francisco Triviño <francisco.trivino@oracle.com>
drivers/infiniband/core/uverbs_cmd.c
drivers/infiniband/core/verbs.c

index 586629c680c233cb52d20f486e1b65183f61f7b7..92f9bfc320321924564f582060248b2fe949f58b 100644 (file)
@@ -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 {
index cb63b692472fc07a6bc71c1e2639e8776363ef2a..dbc1afff750ed85624757e662c067d5d3e86dfee 100644 (file)
@@ -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);