diff mbox

mlx5: Fix incorrect wc pkey_index assignment for GSI messages

Message ID 1441034670-27778-1-git-send-email-sagig@mellanox.com (mailing list archive)
State Accepted
Headers show

Commit Message

Sagi Grimberg Aug. 31, 2015, 3:24 p.m. UTC
Since patch series "Demux IB CM requests in the rdma_cm module" the
P_Key index is taken from the work completion rather than the message
itself (see http://www.spinics.net/lists/netdev/msg335599.html).

The HCA provides us with the message P_Key. In order
to provide the P_Key index, we need to look it up. Given
that this is relevant only for GSI messages (session establishments)
which is less performance critical, micro-optimize against the GSI
(is_qp1) branch.

Signed-off-by: Sagi Grimberg <sagig@mellanox.com>
Cc: Haggai Eran <haggaie@mellanox.com>
---
 drivers/infiniband/hw/mlx5/cq.c      |   10 +++++++++-
 drivers/infiniband/hw/mlx5/mlx5_ib.h |    5 +++++
 drivers/infiniband/hw/mlx5/qp.c      |    5 -----
 3 files changed, 14 insertions(+), 6 deletions(-)

Comments

Or Gerlitz Aug. 31, 2015, 8:18 p.m. UTC | #1
On Mon, Aug 31, 2015 at 6:24 PM, Sagi Grimberg <sagig@mellanox.com> wrote:
> Since patch series "Demux IB CM requests in the rdma_cm module" the
> P_Key index is taken from the work completion rather than the message itself

so prior to this series nobody in the IB core (and maybe across the
whole upstream kernel) uses ib_wc->pkey_index?!

>  (see http://www.spinics.net/lists/netdev/msg335599.html).

better to have pointer here to upstream commit and not to an archive
URL which is possibly gonna die some day


> The HCA provides us with the message P_Key. In order
> to provide the P_Key index, we need to look it up. Given
> that this is relevant only for GSI messages (session establishments)
> which is less performance critical, micro-optimize against the GSI
> (is_qp1) branch.
>
> Signed-off-by: Sagi Grimberg <sagig@mellanox.com>
> Cc: Haggai Eran <haggaie@mellanox.com>
> ---
>  drivers/infiniband/hw/mlx5/cq.c      |   10 +++++++++-
>  drivers/infiniband/hw/mlx5/mlx5_ib.h |    5 +++++
>  drivers/infiniband/hw/mlx5/qp.c      |    5 -----
>  3 files changed, 14 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/infiniband/hw/mlx5/cq.c b/drivers/infiniband/hw/mlx5/cq.c
> index 640c54e..3dfd287 100644
> --- a/drivers/infiniband/hw/mlx5/cq.c
> +++ b/drivers/infiniband/hw/mlx5/cq.c
> @@ -33,6 +33,7 @@
>  #include <linux/kref.h>
>  #include <rdma/ib_umem.h>
>  #include <rdma/ib_user_verbs.h>
> +#include <rdma/ib_cache.h>
>  #include "mlx5_ib.h"
>  #include "user.h"
>
> @@ -227,7 +228,14 @@ static void handle_responder(struct ib_wc *wc, struct mlx5_cqe64 *cqe,
>         wc->dlid_path_bits = cqe->ml_path;
>         g = (be32_to_cpu(cqe->flags_rqpn) >> 28) & 3;
>         wc->wc_flags |= g ? IB_WC_GRH : 0;
> -       wc->pkey_index     = be32_to_cpu(cqe->imm_inval_pkey) & 0xffff;
> +       if (unlikely(is_qp1(qp->ibqp.qp_type))) {
> +               u16 pkey = be32_to_cpu(cqe->imm_inval_pkey) & 0xffff;
> +
> +               ib_find_cached_pkey(&dev->ib_dev, qp->port, pkey,
> +                                   &wc->pkey_index);
> +       } else {
> +               wc->pkey_index = 0;
> +       }
>  }
>
>  static void dump_cqe(struct mlx5_ib_dev *dev, struct mlx5_err_cqe *cqe)
> diff --git a/drivers/infiniband/hw/mlx5/mlx5_ib.h b/drivers/infiniband/hw/mlx5/mlx5_ib.h
> index fc987fe..a4ef6a7 100644
> --- a/drivers/infiniband/hw/mlx5/mlx5_ib.h
> +++ b/drivers/infiniband/hw/mlx5/mlx5_ib.h
> @@ -656,6 +656,11 @@ static inline u8 convert_access(int acc)
>                MLX5_PERM_LOCAL_READ;
>  }
>
> +static inline int is_qp1(enum ib_qp_type qp_type)
> +{
> +       return qp_type == IB_QPT_GSI;
> +}
> +
>  #define MLX5_MAX_UMR_SHIFT 16
>  #define MLX5_MAX_UMR_PAGES (1 << MLX5_MAX_UMR_SHIFT)
>
> diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c
> index 9380d2d..8c51ea3 100644
> --- a/drivers/infiniband/hw/mlx5/qp.c
> +++ b/drivers/infiniband/hw/mlx5/qp.c
> @@ -76,11 +76,6 @@ static int is_qp0(enum ib_qp_type qp_type)
>         return qp_type == IB_QPT_SMI;
>  }
>
> -static int is_qp1(enum ib_qp_type qp_type)
> -{
> -       return qp_type == IB_QPT_GSI;
> -}
> -
>  static int is_sqp(enum ib_qp_type qp_type)
>  {
>         return is_qp0(qp_type) || is_qp1(qp_type);
> --
> 1.7.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Sagi Grimberg Sept. 1, 2015, 8:08 a.m. UTC | #2
On 8/31/2015 11:18 PM, Or Gerlitz wrote:
> On Mon, Aug 31, 2015 at 6:24 PM, Sagi Grimberg <sagig@mellanox.com> wrote:
>> Since patch series "Demux IB CM requests in the rdma_cm module" the
>> P_Key index is taken from the work completion rather than the message itself
>
> so prior to this series nobody in the IB core (and maybe across the
> whole upstream kernel) uses ib_wc->pkey_index?!

I guess so...

>
>>   (see http://www.spinics.net/lists/netdev/msg335599.html).
>
> better to have pointer here to upstream commit and not to an archive
> URL which is possibly gonna die some day

This commit is not upstream yet.
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Or Gerlitz Sept. 1, 2015, 8:36 a.m. UTC | #3
On 9/1/2015 11:08 AM, Sagi Grimberg wrote:
>
>>
>>>   (see http://www.spinics.net/lists/netdev/msg335599.html).
>>
>> better to have pointer here to upstream commit and not to an archive
>> URL which is possibly gonna die some day
>
> This commit is not upstream yet. 

I know, but but under the way the net/net-next and now also Doug's tree 
are set,
the ID remains the same also when Linus picks the offending patch, so 
you can give their
ID now, just make sure you take it from the correct branch -- see Doug's 
responses to
my email on the list in the last 1-2 days

Or.
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/infiniband/hw/mlx5/cq.c b/drivers/infiniband/hw/mlx5/cq.c
index 640c54e..3dfd287 100644
--- a/drivers/infiniband/hw/mlx5/cq.c
+++ b/drivers/infiniband/hw/mlx5/cq.c
@@ -33,6 +33,7 @@ 
 #include <linux/kref.h>
 #include <rdma/ib_umem.h>
 #include <rdma/ib_user_verbs.h>
+#include <rdma/ib_cache.h>
 #include "mlx5_ib.h"
 #include "user.h"
 
@@ -227,7 +228,14 @@  static void handle_responder(struct ib_wc *wc, struct mlx5_cqe64 *cqe,
 	wc->dlid_path_bits = cqe->ml_path;
 	g = (be32_to_cpu(cqe->flags_rqpn) >> 28) & 3;
 	wc->wc_flags |= g ? IB_WC_GRH : 0;
-	wc->pkey_index     = be32_to_cpu(cqe->imm_inval_pkey) & 0xffff;
+	if (unlikely(is_qp1(qp->ibqp.qp_type))) {
+		u16 pkey = be32_to_cpu(cqe->imm_inval_pkey) & 0xffff;
+
+		ib_find_cached_pkey(&dev->ib_dev, qp->port, pkey,
+				    &wc->pkey_index);
+	} else {
+		wc->pkey_index = 0;
+	}
 }
 
 static void dump_cqe(struct mlx5_ib_dev *dev, struct mlx5_err_cqe *cqe)
diff --git a/drivers/infiniband/hw/mlx5/mlx5_ib.h b/drivers/infiniband/hw/mlx5/mlx5_ib.h
index fc987fe..a4ef6a7 100644
--- a/drivers/infiniband/hw/mlx5/mlx5_ib.h
+++ b/drivers/infiniband/hw/mlx5/mlx5_ib.h
@@ -656,6 +656,11 @@  static inline u8 convert_access(int acc)
 	       MLX5_PERM_LOCAL_READ;
 }
 
+static inline int is_qp1(enum ib_qp_type qp_type)
+{
+	return qp_type == IB_QPT_GSI;
+}
+
 #define MLX5_MAX_UMR_SHIFT 16
 #define MLX5_MAX_UMR_PAGES (1 << MLX5_MAX_UMR_SHIFT)
 
diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c
index 9380d2d..8c51ea3 100644
--- a/drivers/infiniband/hw/mlx5/qp.c
+++ b/drivers/infiniband/hw/mlx5/qp.c
@@ -76,11 +76,6 @@  static int is_qp0(enum ib_qp_type qp_type)
 	return qp_type == IB_QPT_SMI;
 }
 
-static int is_qp1(enum ib_qp_type qp_type)
-{
-	return qp_type == IB_QPT_GSI;
-}
-
 static int is_sqp(enum ib_qp_type qp_type)
 {
 	return is_qp0(qp_type) || is_qp1(qp_type);