| From 95fd691713e3ef557dc1d91d4461e10cb3d61be0 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 15 Jan 2020 14:43:35 +0200 |
| Subject: RDMA/mlx5: Don't fake udata for kernel path |
| |
| From: Leon Romanovsky <leonro@mellanox.com> |
| |
| [ Upstream commit 4835709176e8ccf6561abc9f5c405293e008095f ] |
| |
| Kernel paths must not set udata and provide NULL pointer, |
| instead of faking zeroed udata struct. |
| |
| Signed-off-by: Leon Romanovsky <leonro@mellanox.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/infiniband/hw/mlx5/main.c | 34 +++++++++++++++---------------- |
| 1 file changed, 16 insertions(+), 18 deletions(-) |
| |
| diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c |
| index e1cfbedefcbc9..9a918db9e8db4 100644 |
| --- a/drivers/infiniband/hw/mlx5/main.c |
| +++ b/drivers/infiniband/hw/mlx5/main.c |
| @@ -829,6 +829,7 @@ static int mlx5_ib_query_device(struct ib_device *ibdev, |
| struct ib_device_attr *props, |
| struct ib_udata *uhw) |
| { |
| + size_t uhw_outlen = (uhw) ? uhw->outlen : 0; |
| struct mlx5_ib_dev *dev = to_mdev(ibdev); |
| struct mlx5_core_dev *mdev = dev->mdev; |
| int err = -ENOMEM; |
| @@ -842,12 +843,12 @@ static int mlx5_ib_query_device(struct ib_device *ibdev, |
| u64 max_tso; |
| |
| resp_len = sizeof(resp.comp_mask) + sizeof(resp.response_length); |
| - if (uhw->outlen && uhw->outlen < resp_len) |
| + if (uhw_outlen && uhw_outlen < resp_len) |
| return -EINVAL; |
| else |
| resp.response_length = resp_len; |
| |
| - if (uhw->inlen && !ib_is_udata_cleared(uhw, 0, uhw->inlen)) |
| + if (uhw && uhw->inlen && !ib_is_udata_cleared(uhw, 0, uhw->inlen)) |
| return -EINVAL; |
| |
| memset(props, 0, sizeof(*props)); |
| @@ -911,7 +912,7 @@ static int mlx5_ib_query_device(struct ib_device *ibdev, |
| props->raw_packet_caps |= |
| IB_RAW_PACKET_CAP_CVLAN_STRIPPING; |
| |
| - if (field_avail(typeof(resp), tso_caps, uhw->outlen)) { |
| + if (field_avail(typeof(resp), tso_caps, uhw_outlen)) { |
| max_tso = MLX5_CAP_ETH(mdev, max_lso_cap); |
| if (max_tso) { |
| resp.tso_caps.max_tso = 1 << max_tso; |
| @@ -921,7 +922,7 @@ static int mlx5_ib_query_device(struct ib_device *ibdev, |
| } |
| } |
| |
| - if (field_avail(typeof(resp), rss_caps, uhw->outlen)) { |
| + if (field_avail(typeof(resp), rss_caps, uhw_outlen)) { |
| resp.rss_caps.rx_hash_function = |
| MLX5_RX_HASH_FUNC_TOEPLITZ; |
| resp.rss_caps.rx_hash_fields_mask = |
| @@ -941,9 +942,9 @@ static int mlx5_ib_query_device(struct ib_device *ibdev, |
| resp.response_length += sizeof(resp.rss_caps); |
| } |
| } else { |
| - if (field_avail(typeof(resp), tso_caps, uhw->outlen)) |
| + if (field_avail(typeof(resp), tso_caps, uhw_outlen)) |
| resp.response_length += sizeof(resp.tso_caps); |
| - if (field_avail(typeof(resp), rss_caps, uhw->outlen)) |
| + if (field_avail(typeof(resp), rss_caps, uhw_outlen)) |
| resp.response_length += sizeof(resp.rss_caps); |
| } |
| |
| @@ -1066,7 +1067,7 @@ static int mlx5_ib_query_device(struct ib_device *ibdev, |
| MLX5_MAX_CQ_PERIOD; |
| } |
| |
| - if (field_avail(typeof(resp), cqe_comp_caps, uhw->outlen)) { |
| + if (field_avail(typeof(resp), cqe_comp_caps, uhw_outlen)) { |
| resp.response_length += sizeof(resp.cqe_comp_caps); |
| |
| if (MLX5_CAP_GEN(dev->mdev, cqe_compression)) { |
| @@ -1084,7 +1085,7 @@ static int mlx5_ib_query_device(struct ib_device *ibdev, |
| } |
| } |
| |
| - if (field_avail(typeof(resp), packet_pacing_caps, uhw->outlen) && |
| + if (field_avail(typeof(resp), packet_pacing_caps, uhw_outlen) && |
| raw_support) { |
| if (MLX5_CAP_QOS(mdev, packet_pacing) && |
| MLX5_CAP_GEN(mdev, qos)) { |
| @@ -1103,7 +1104,7 @@ static int mlx5_ib_query_device(struct ib_device *ibdev, |
| } |
| |
| if (field_avail(typeof(resp), mlx5_ib_support_multi_pkt_send_wqes, |
| - uhw->outlen)) { |
| + uhw_outlen)) { |
| if (MLX5_CAP_ETH(mdev, multi_pkt_send_wqe)) |
| resp.mlx5_ib_support_multi_pkt_send_wqes = |
| MLX5_IB_ALLOW_MPW; |
| @@ -1116,7 +1117,7 @@ static int mlx5_ib_query_device(struct ib_device *ibdev, |
| sizeof(resp.mlx5_ib_support_multi_pkt_send_wqes); |
| } |
| |
| - if (field_avail(typeof(resp), flags, uhw->outlen)) { |
| + if (field_avail(typeof(resp), flags, uhw_outlen)) { |
| resp.response_length += sizeof(resp.flags); |
| |
| if (MLX5_CAP_GEN(mdev, cqe_compression_128)) |
| @@ -1132,8 +1133,7 @@ static int mlx5_ib_query_device(struct ib_device *ibdev, |
| resp.flags |= MLX5_IB_QUERY_DEV_RESP_FLAGS_SCAT2CQE_DCT; |
| } |
| |
| - if (field_avail(typeof(resp), sw_parsing_caps, |
| - uhw->outlen)) { |
| + if (field_avail(typeof(resp), sw_parsing_caps, uhw_outlen)) { |
| resp.response_length += sizeof(resp.sw_parsing_caps); |
| if (MLX5_CAP_ETH(mdev, swp)) { |
| resp.sw_parsing_caps.sw_parsing_offloads |= |
| @@ -1153,7 +1153,7 @@ static int mlx5_ib_query_device(struct ib_device *ibdev, |
| } |
| } |
| |
| - if (field_avail(typeof(resp), striding_rq_caps, uhw->outlen) && |
| + if (field_avail(typeof(resp), striding_rq_caps, uhw_outlen) && |
| raw_support) { |
| resp.response_length += sizeof(resp.striding_rq_caps); |
| if (MLX5_CAP_GEN(mdev, striding_rq)) { |
| @@ -1170,8 +1170,7 @@ static int mlx5_ib_query_device(struct ib_device *ibdev, |
| } |
| } |
| |
| - if (field_avail(typeof(resp), tunnel_offloads_caps, |
| - uhw->outlen)) { |
| + if (field_avail(typeof(resp), tunnel_offloads_caps, uhw_outlen)) { |
| resp.response_length += sizeof(resp.tunnel_offloads_caps); |
| if (MLX5_CAP_ETH(mdev, tunnel_stateless_vxlan)) |
| resp.tunnel_offloads_caps |= |
| @@ -1192,7 +1191,7 @@ static int mlx5_ib_query_device(struct ib_device *ibdev, |
| MLX5_IB_TUNNELED_OFFLOADS_MPLS_UDP; |
| } |
| |
| - if (uhw->outlen) { |
| + if (uhw_outlen) { |
| err = ib_copy_to_udata(uhw, &resp, resp.response_length); |
| |
| if (err) |
| @@ -4738,7 +4737,6 @@ static int __get_port_caps(struct mlx5_ib_dev *dev, u8 port) |
| struct ib_device_attr *dprops = NULL; |
| struct ib_port_attr *pprops = NULL; |
| int err = -ENOMEM; |
| - struct ib_udata uhw = {.inlen = 0, .outlen = 0}; |
| |
| pprops = kzalloc(sizeof(*pprops), GFP_KERNEL); |
| if (!pprops) |
| @@ -4748,7 +4746,7 @@ static int __get_port_caps(struct mlx5_ib_dev *dev, u8 port) |
| if (!dprops) |
| goto out; |
| |
| - err = mlx5_ib_query_device(&dev->ib_dev, dprops, &uhw); |
| + err = mlx5_ib_query_device(&dev->ib_dev, dprops, NULL); |
| if (err) { |
| mlx5_ib_warn(dev, "query_device failed %d\n", err); |
| goto out; |
| -- |
| 2.20.1 |
| |