]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
IB/mlx5: Report correctly tag matching rendezvous capability
authorDanit Goldberg <danitg@mellanox.com>
Fri, 5 Jul 2019 16:21:57 +0000 (19:21 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 26 Jul 2019 07:13:04 +0000 (09:13 +0200)
commit 89705e92700170888236555fe91b45e4c1bb0985 upstream.

Userspace expects the IB_TM_CAP_RC bit to indicate that the device
supports RC transport tag matching with rendezvous offload. However the
firmware splits this into two capabilities for eager and rendezvous tag
matching.

Only if the FW supports both modes should userspace be told the tag
matching capability is available.

Cc: <stable@vger.kernel.org> # 4.13
Fixes: eb761894351d ("IB/mlx5: Fill XRQ capabilities")
Signed-off-by: Danit Goldberg <danitg@mellanox.com>
Reviewed-by: Yishai Hadas <yishaih@mellanox.com>
Reviewed-by: Artemy Kovalyov <artemyko@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/infiniband/hw/mlx5/main.c
include/rdma/ib_verbs.h

index da81402992bca6b3a67505182d7fb7583204a4a6..9d7303041b3e4ad54bd758d68983de06cc7434f6 100644 (file)
@@ -1041,15 +1041,19 @@ static int mlx5_ib_query_device(struct ib_device *ibdev,
        }
 
        if (MLX5_CAP_GEN(mdev, tag_matching)) {
-               props->tm_caps.max_rndv_hdr_size = MLX5_TM_MAX_RNDV_MSG_SIZE;
                props->tm_caps.max_num_tags =
                        (1 << MLX5_CAP_GEN(mdev, log_tag_matching_list_sz)) - 1;
-               props->tm_caps.flags = IB_TM_CAP_RC;
                props->tm_caps.max_ops =
                        1 << MLX5_CAP_GEN(mdev, log_max_qp_sz);
                props->tm_caps.max_sge = MLX5_TM_MAX_SGE;
        }
 
+       if (MLX5_CAP_GEN(mdev, tag_matching) &&
+           MLX5_CAP_GEN(mdev, rndv_offload_rc)) {
+               props->tm_caps.flags = IB_TM_CAP_RNDV_RC;
+               props->tm_caps.max_rndv_hdr_size = MLX5_TM_MAX_RNDV_MSG_SIZE;
+       }
+
        if (MLX5_CAP_GEN(dev->mdev, cq_moderation)) {
                props->cq_caps.max_cq_moderation_count =
                                                MLX5_MAX_CQ_COUNT;
index 9b9e17bcc201d394e3010b782536eddc62883d3e..417a096e43d6dcbb838aedecdb2bc5e8bf876d24 100644 (file)
@@ -293,8 +293,8 @@ struct ib_rss_caps {
 };
 
 enum ib_tm_cap_flags {
-       /*  Support tag matching on RC transport */
-       IB_TM_CAP_RC                = 1 << 0,
+       /*  Support tag matching with rendezvous offload for RC transport */
+       IB_TM_CAP_RNDV_RC = 1 << 0,
 };
 
 struct ib_tm_caps {