Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

RDMA/mlx5: Use a union inside mlx5_ib_mr

The struct mlx5_ib_mr can be used for three different things, but only one
at a time:

- In the user MR cache
- As a kernel MR
- As a user MR

Overlay the three things into a single union with the following rules:

- If the mr is found on the cache_ent->head list then it is a cache MR
and umem == NULL. The entire union is zero after the MR is removed from
the cache.

- If umem != NULL or type == IB_MR_TYPE_USER then it is a user MR.

- If umem == NULL then it is a kernel MR

This reduces the size of struct mlx5_ib_mr to 552 bytes from 702.

The only place the three flows overlap in the code is during dereg, so add
a few extra checks along there.

Link: https://lore.kernel.org/r/20210304120745.1090751-3-leon@kernel.org
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>

+3 -3
+1 -1
drivers/infiniband/hw/mlx5/mlx5_ib.h
··· 657 657 struct ib_umem *umem; 658 658 659 659 /* This is zero'd when the MR is allocated */ 660 - struct { 660 + union { 661 661 /* Used only while the MR is in the cache */ 662 662 struct { 663 663 u32 out[MLX5_ST_SZ_DW(create_mkey_out)];
+2 -2
drivers/infiniband/hw/mlx5/mr.c
··· 1929 1929 static void 1930 1930 mlx5_free_priv_descs(struct mlx5_ib_mr *mr) 1931 1931 { 1932 - if (mr->descs) { 1932 + if (!mr->umem && mr->descs) { 1933 1933 struct ib_device *device = mr->ibmr.device; 1934 1934 int size = mr->max_descs * mr->desc_size; 1935 1935 struct mlx5_ib_dev *dev = to_mdev(device); ··· 1943 1943 1944 1944 static void clean_mr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr) 1945 1945 { 1946 - if (mr->sig) { 1946 + if (mr->ibmr.type == IB_MR_TYPE_INTEGRITY) { 1947 1947 if (mlx5_core_destroy_psv(dev->mdev, 1948 1948 mr->sig->psv_memory.psv_idx)) 1949 1949 mlx5_ib_warn(dev, "failed to destroy mem psv %d\n",