| From 0d24ba4aa2b59537388b6b0fbb36f7fc37682d34 Mon Sep 17 00:00:00 2001 |
| From: Leon Romanovsky <leonro@mellanox.com> |
| Date: Wed, 15 Jan 2020 14:43:35 +0200 |
| Subject: [PATCH] RDMA/mlx5: Don't fake udata for kernel path |
| |
| commit 4835709176e8ccf6561abc9f5c405293e008095f upstream. |
| |
| 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: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c |
| index 890df7a5eadc..41b86068eb6f 100644 |
| --- a/drivers/infiniband/hw/mlx5/main.c |
| +++ b/drivers/infiniband/hw/mlx5/main.c |
| @@ -828,6 +828,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; |
| @@ -841,12 +842,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)); |
| @@ -910,7 +911,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; |
| @@ -920,7 +921,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 = |
| @@ -940,9 +941,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); |
| } |
| |
| @@ -1063,7 +1064,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)) { |
| @@ -1081,7 +1082,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)) { |
| @@ -1100,7 +1101,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; |
| @@ -1113,7 +1114,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)) |
| @@ -1129,8 +1130,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 |= |
| @@ -1150,7 +1150,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)) { |
| @@ -1167,8 +1167,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 |= |
| @@ -1189,7 +1188,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) |
| @@ -4677,7 +4676,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 = kmalloc(sizeof(*pprops), GFP_KERNEL); |
| if (!pprops) |
| @@ -4687,7 +4685,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.7.4 |
| |