Skip to content

Commit ddec8ed

Browse files
committed
Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma
Pull rdma fixes from Jason Gunthorpe: "Last pull for 5.16, the reversion has been known for a while now but didn't get a proper fix in time. Looks like we will have several info-leak bugs to take care of going foward. - Revert the patch fixing the DM related crash causing a widespread regression for kernel ULPs. A proper fix just didn't appear this cycle due to the holidays - Missing NULL check on alloc in uverbs - Double free in rxe error paths - Fix a new kernel-infoleak report when forming ah_attr's without GRH's in ucma" * tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma: RDMA/core: Don't infoleak GRH fields RDMA/uverbs: Check for null return of kmalloc_array Revert "RDMA/mlx5: Fix releasing unallocated memory in dereg MR flow" RDMA/rxe: Prevent double freeing rxe_map_set()
2 parents b2b436e + b35a0f4 commit ddec8ed

File tree

5 files changed

+28
-25
lines changed

5 files changed

+28
-25
lines changed

drivers/infiniband/core/uverbs_marshall.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ void ib_copy_ah_attr_to_user(struct ib_device *device,
6666
struct rdma_ah_attr *src = ah_attr;
6767
struct rdma_ah_attr conv_ah;
6868

69-
memset(&dst->grh.reserved, 0, sizeof(dst->grh.reserved));
69+
memset(&dst->grh, 0, sizeof(dst->grh));
7070

7171
if ((ah_attr->type == RDMA_AH_ATTR_TYPE_OPA) &&
7272
(rdma_ah_get_dlid(ah_attr) > be16_to_cpu(IB_LID_PERMISSIVE)) &&

drivers/infiniband/core/uverbs_uapi.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,9 @@ static int uapi_finalize(struct uverbs_api *uapi)
447447
uapi->num_write_ex = max_write_ex + 1;
448448
data = kmalloc_array(uapi->num_write + uapi->num_write_ex,
449449
sizeof(*uapi->write_methods), GFP_KERNEL);
450+
if (!data)
451+
return -ENOMEM;
452+
450453
for (i = 0; i != uapi->num_write + uapi->num_write_ex; i++)
451454
data[i] = &uapi->notsupp_method;
452455
uapi->write_methods = data;

drivers/infiniband/hw/mlx5/mlx5_ib.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -664,6 +664,7 @@ struct mlx5_ib_mr {
664664

665665
/* User MR data */
666666
struct mlx5_cache_ent *cache_ent;
667+
struct ib_umem *umem;
667668

668669
/* This is zero'd when the MR is allocated */
669670
union {
@@ -675,7 +676,7 @@ struct mlx5_ib_mr {
675676
struct list_head list;
676677
};
677678

678-
/* Used only by kernel MRs */
679+
/* Used only by kernel MRs (umem == NULL) */
679680
struct {
680681
void *descs;
681682
void *descs_alloc;
@@ -696,9 +697,8 @@ struct mlx5_ib_mr {
696697
int data_length;
697698
};
698699

699-
/* Used only by User MRs */
700+
/* Used only by User MRs (umem != NULL) */
700701
struct {
701-
struct ib_umem *umem;
702702
unsigned int page_shift;
703703
/* Current access_flags */
704704
int access_flags;

drivers/infiniband/hw/mlx5/mr.c

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1904,18 +1904,19 @@ mlx5_alloc_priv_descs(struct ib_device *device,
19041904
return ret;
19051905
}
19061906

1907-
static void mlx5_free_priv_descs(struct mlx5_ib_mr *mr)
1907+
static void
1908+
mlx5_free_priv_descs(struct mlx5_ib_mr *mr)
19081909
{
1909-
struct mlx5_ib_dev *dev = to_mdev(mr->ibmr.device);
1910-
int size = mr->max_descs * mr->desc_size;
1911-
1912-
if (!mr->descs)
1913-
return;
1910+
if (!mr->umem && mr->descs) {
1911+
struct ib_device *device = mr->ibmr.device;
1912+
int size = mr->max_descs * mr->desc_size;
1913+
struct mlx5_ib_dev *dev = to_mdev(device);
19141914

1915-
dma_unmap_single(&dev->mdev->pdev->dev, mr->desc_map, size,
1916-
DMA_TO_DEVICE);
1917-
kfree(mr->descs_alloc);
1918-
mr->descs = NULL;
1915+
dma_unmap_single(&dev->mdev->pdev->dev, mr->desc_map, size,
1916+
DMA_TO_DEVICE);
1917+
kfree(mr->descs_alloc);
1918+
mr->descs = NULL;
1919+
}
19191920
}
19201921

19211922
int mlx5_ib_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata)
@@ -1991,8 +1992,7 @@ int mlx5_ib_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata)
19911992
if (mr->cache_ent) {
19921993
mlx5_mr_cache_free(dev, mr);
19931994
} else {
1994-
if (!udata)
1995-
mlx5_free_priv_descs(mr);
1995+
mlx5_free_priv_descs(mr);
19961996
kfree(mr);
19971997
}
19981998
return 0;
@@ -2079,6 +2079,7 @@ static struct mlx5_ib_mr *mlx5_ib_alloc_pi_mr(struct ib_pd *pd,
20792079
if (err)
20802080
goto err_free_in;
20812081

2082+
mr->umem = NULL;
20822083
kfree(in);
20832084

20842085
return mr;
@@ -2205,6 +2206,7 @@ static struct ib_mr *__mlx5_ib_alloc_mr(struct ib_pd *pd,
22052206
}
22062207

22072208
mr->ibmr.device = pd->device;
2209+
mr->umem = NULL;
22082210

22092211
switch (mr_type) {
22102212
case IB_MR_TYPE_MEM_REG:

drivers/infiniband/sw/rxe/rxe_mr.c

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -135,19 +135,19 @@ static int rxe_mr_alloc(struct rxe_mr *mr, int num_buf, int both)
135135

136136
ret = rxe_mr_alloc_map_set(num_map, &mr->cur_map_set);
137137
if (ret)
138-
goto err_out;
138+
return -ENOMEM;
139139

140140
if (both) {
141141
ret = rxe_mr_alloc_map_set(num_map, &mr->next_map_set);
142-
if (ret) {
143-
rxe_mr_free_map_set(mr->num_map, mr->cur_map_set);
144-
goto err_out;
145-
}
142+
if (ret)
143+
goto err_free;
146144
}
147145

148146
return 0;
149147

150-
err_out:
148+
err_free:
149+
rxe_mr_free_map_set(mr->num_map, mr->cur_map_set);
150+
mr->cur_map_set = NULL;
151151
return -ENOMEM;
152152
}
153153

@@ -214,7 +214,7 @@ int rxe_mr_init_user(struct rxe_pd *pd, u64 start, u64 length, u64 iova,
214214
pr_warn("%s: Unable to get virtual address\n",
215215
__func__);
216216
err = -ENOMEM;
217-
goto err_cleanup_map;
217+
goto err_release_umem;
218218
}
219219

220220
buf->addr = (uintptr_t)vaddr;
@@ -237,8 +237,6 @@ int rxe_mr_init_user(struct rxe_pd *pd, u64 start, u64 length, u64 iova,
237237

238238
return 0;
239239

240-
err_cleanup_map:
241-
rxe_mr_free_map_set(mr->num_map, mr->cur_map_set);
242240
err_release_umem:
243241
ib_umem_release(umem);
244242
err_out:

0 commit comments

Comments
 (0)