From: tzachid Date: Thu, 15 May 2008 07:22:44 +0000 (+0000) Subject: [mlx4] Fix for FMR. (mlx4_0270_fmr_enable.patch) (winib 2392, 2394) X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=124f6b06af4df6c026aec010346bc943f2399481;p=~shefty%2Frdma-win.git [mlx4] Fix for FMR. (mlx4_0270_fmr_enable.patch) (winib 2392, 2394) 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 --- diff --git a/trunk/hw/mlx4/kernel/bus/ib/mr.c b/trunk/hw/mlx4/kernel/bus/ib/mr.c index 431fee22..b142d9fa 100644 --- a/trunk/hw/mlx4/kernel/bus/ib/mr.c +++ b/trunk/hw/mlx4/kernel/bus/ib/mr.c @@ -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; diff --git a/trunk/hw/mlx4/kernel/bus/net/mr.c b/trunk/hw/mlx4/kernel/bus/net/mr.c index 51e5a0b7..1f7b9097 100644 --- a/trunk/hw/mlx4/kernel/bus/net/mr.c +++ b/trunk/hw/mlx4/kernel/bus/net/mr.c @@ -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);