RDMA/mlx5: Remove mlx5_ib_mr->npages
[linux-2.6-block.git] / drivers / infiniband / hw / mlx5 / mr.c
index b261797b258fd7f9425d44c43c5ec8f68ab15d9b..b6d9419e05a4490c9713d104365891f71126457d 100644 (file)
@@ -126,7 +126,9 @@ static int destroy_mkey(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr)
 static inline bool mlx5_ib_pas_fits_in_mr(struct mlx5_ib_mr *mr, u64 start,
                                          u64 length)
 {
-       return ((u64)1 << mr->order) * MLX5_ADAPTER_PAGE_SIZE >=
+       if (!mr->cache_ent)
+               return false;
+       return ((u64)1 << mr->cache_ent->order) * MLX5_ADAPTER_PAGE_SIZE >=
                length + (start & (MLX5_ADAPTER_PAGE_SIZE - 1));
 }
 
@@ -172,7 +174,6 @@ static struct mlx5_ib_mr *alloc_cache_mr(struct mlx5_cache_ent *ent, void *mkc)
        mr = kzalloc(sizeof(*mr), GFP_KERNEL);
        if (!mr)
                return NULL;
-       mr->order = ent->order;
        mr->cache_ent = ent;
        mr->dev = ent->dev;
 
@@ -1247,10 +1248,8 @@ err_1:
 }
 
 static void set_mr_fields(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr,
-                         int npages, u64 length, int access_flags)
+                         u64 length, int access_flags)
 {
-       mr->npages = npages;
-       atomic_add(npages, &dev->mdev->priv.reg_pages);
        mr->ibmr.lkey = mr->mmkey.key;
        mr->ibmr.rkey = mr->mmkey.key;
        mr->ibmr.length = length;
@@ -1290,8 +1289,7 @@ static struct ib_mr *mlx5_ib_get_dm_mr(struct ib_pd *pd, u64 start_addr,
 
        kfree(in);
 
-       mr->umem = NULL;
-       set_mr_fields(dev, mr, 0, length, acc);
+       set_mr_fields(dev, mr, length, acc);
 
        return &mr->ibmr;
 
@@ -1419,7 +1417,8 @@ struct ib_mr *mlx5_ib_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
        mlx5_ib_dbg(dev, "mkey 0x%x\n", mr->mmkey.key);
 
        mr->umem = umem;
-       set_mr_fields(dev, mr, npages, length, access_flags);
+       atomic_add(ib_umem_num_pages(mr->umem), &dev->mdev->priv.reg_pages);
+       set_mr_fields(dev, mr, length, access_flags);
 
        if (xlt_with_umr && !(access_flags & IB_ACCESS_ON_DEMAND)) {
                /*
@@ -1531,8 +1530,6 @@ int mlx5_ib_rereg_user_mr(struct ib_mr *ib_mr, int flags, u64 start,
        mlx5_ib_dbg(dev, "start 0x%llx, virt_addr 0x%llx, length 0x%llx, access_flags 0x%x\n",
                    start, virt_addr, length, access_flags);
 
-       atomic_sub(mr->npages, &dev->mdev->priv.reg_pages);
-
        if (!mr->umem)
                return -EINVAL;
 
@@ -1553,12 +1550,17 @@ int mlx5_ib_rereg_user_mr(struct ib_mr *ib_mr, int flags, u64 start,
                 * used.
                 */
                flags |= IB_MR_REREG_TRANS;
+               atomic_sub(ib_umem_num_pages(mr->umem),
+                          &dev->mdev->priv.reg_pages);
                ib_umem_release(mr->umem);
                mr->umem = NULL;
+
                err = mr_umem_get(dev, addr, len, access_flags, &mr->umem,
                                  &npages, &page_shift, &ncont, &order);
                if (err)
                        goto err;
+               atomic_add(ib_umem_num_pages(mr->umem),
+                          &dev->mdev->priv.reg_pages);
        }
 
        if (!mlx5_ib_can_reconfig_with_umr(dev, mr->access_flags,
@@ -1609,7 +1611,7 @@ int mlx5_ib_rereg_user_mr(struct ib_mr *ib_mr, int flags, u64 start,
                        goto err;
        }
 
-       set_mr_fields(dev, mr, npages, len, access_flags);
+       set_mr_fields(dev, mr, len, access_flags);
 
        return 0;
 
@@ -1691,7 +1693,6 @@ static void clean_mr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr)
 
 static void dereg_mr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr)
 {
-       int npages = mr->npages;
        struct ib_umem *umem = mr->umem;
 
        /* Stop all DMA */
@@ -1700,14 +1701,17 @@ static void dereg_mr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr)
        else
                clean_mr(dev, mr);
 
+       if (umem) {
+               if (!is_odp_mr(mr))
+                       atomic_sub(ib_umem_num_pages(umem),
+                                  &dev->mdev->priv.reg_pages);
+               ib_umem_release(umem);
+       }
+
        if (mr->cache_ent)
                mlx5_mr_cache_free(dev, mr);
        else
                kfree(mr);
-
-       ib_umem_release(umem);
-       atomic_sub(npages, &dev->mdev->priv.reg_pages);
-
 }
 
 int mlx5_ib_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata)