]> git.openfabrics.org - ~shefty/rdma-win.git/commitdiff
[mlx4] Fix for FMR. (mlx4_0270_fmr_enable.patch) (winib 2392, 2394)
authortzachid <tzachid@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Thu, 15 May 2008 07:22:44 +0000 (07:22 +0000)
committertzachid <tzachid@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Thu, 15 May 2008 07:22:44 +0000 (07:22 +0000)
mlx4_table_find (for fmr mpt's) requires that ICM memory already
be mapped.  Before this fix, fmr allocation depended on ICM memory
already being mapped for the mpt entry.  If all currently mapped
entries are taken, the find operation fails (even if the ICM mpt
table still had more entries, which were as yet unmapped).

This fix moves the mpt find operation to fmr_enable, to guarantee
that any required ICM memory mapping has already occurred.

git-svn-id: svn://openib.tc.cornell.edu/gen1@1171 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86

trunk/hw/mlx4/kernel/bus/ib/mr.c
trunk/hw/mlx4/kernel/bus/net/mr.c

index 431fee22a355b827b929a9a6aefed3e6b4aeeb19..b142d9fa05e90f848cffe53c32e438337e6e79ca 100644 (file)
@@ -198,7 +198,7 @@ struct ib_fmr *mlx4_ib_fmr_alloc(struct ib_pd *pd, int acc,
        if (err)
                goto err_free;
 
-       err = mlx4_mr_enable(to_mdev(pd->device)->dev, &fmr->mfmr.mr);
+       err = mlx4_fmr_enable(to_mdev(pd->device)->dev, &fmr->mfmr);
        if (err)
                goto err_mr;
 
index 51e5a0b73c57e66ba80f58edf2e7c1ef225ac47d..1f7b90978fa778ab6cc73240c75941bcc6de316e 100644 (file)
@@ -576,14 +576,6 @@ int mlx4_fmr_alloc(struct mlx4_dev *dev, u32 pd, u32 access, int max_pages,
                err = -ENOMEM;
                goto err_free;
        }
-
-       fmr->mpt = mlx4_table_find(&priv->mr_table.dmpt_table,
-                                   key_to_hw_index(fmr->mr.key), NULL);
-       if (!fmr->mpt) {
-               err = -ENOMEM;
-               goto err_free;
-       }
-
        return 0;
 
 err_free:
@@ -594,7 +586,19 @@ EXPORT_SYMBOL_GPL(mlx4_fmr_alloc);
 
 int mlx4_fmr_enable(struct mlx4_dev *dev, struct mlx4_fmr *fmr)
 {
-       return mlx4_mr_enable(dev, &fmr->mr);
+       struct mlx4_priv *priv = mlx4_priv(dev);
+       int err;
+
+       err = mlx4_mr_enable(dev, &fmr->mr);
+       if (err)
+               return err;
+
+       fmr->mpt = mlx4_table_find(&priv->mr_table.dmpt_table,
+                                   key_to_hw_index(fmr->mr.key), NULL);
+       if (!fmr->mpt)
+               return -ENOMEM;
+
+       return 0;
 }
 EXPORT_SYMBOL_GPL(mlx4_fmr_enable);