[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/trunk@1171 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86

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

index 431fee2..b142d9f 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 51e5a0b..1f7b909 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);