From 124f6b06af4df6c026aec010346bc943f2399481 Mon Sep 17 00:00:00 2001 From: tzachid Date: Thu, 15 May 2008 07:22:44 +0000 Subject: [PATCH] [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 --- trunk/hw/mlx4/kernel/bus/ib/mr.c | 2 +- trunk/hw/mlx4/kernel/bus/net/mr.c | 22 +++++++++++++--------- 2 files changed, 14 insertions(+), 10 deletions(-) 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); -- 2.41.0