| From: Eli Cohen <eli@mellanox.com> |
| Date: Thu, 27 Oct 2016 16:36:43 +0300 |
| Subject: IB/mlx5: Wait for all async command completions to complete |
| |
| commit acbda523884dcf45613bf6818d8ead5180df35c2 upstream. |
| |
| Wait before continuing unload till all pending mkey async creation requests |
| are done. |
| |
| Fixes: e126ba97dba9 ('mlx5: Add driver for Mellanox Connect-IB adapters') |
| Signed-off-by: Eli Cohen <eli@mellanox.com> |
| Signed-off-by: Maor Gottlieb <maorg@mellanox.com> |
| Signed-off-by: Leon Romanovsky <leon@kernel.org> |
| Signed-off-by: Doug Ledford <dledford@redhat.com> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| drivers/infiniband/hw/mlx5/mr.c | 28 ++++++++++++++++++++++++++++ |
| 1 file changed, 28 insertions(+) |
| |
| --- a/drivers/infiniband/hw/mlx5/mr.c |
| +++ b/drivers/infiniband/hw/mlx5/mr.c |
| @@ -590,6 +590,33 @@ int mlx5_mr_cache_init(struct mlx5_ib_de |
| return 0; |
| } |
| |
| +static void wait_for_async_commands(struct mlx5_ib_dev *dev) |
| +{ |
| + struct mlx5_mr_cache *cache = &dev->cache; |
| + struct mlx5_cache_ent *ent; |
| + int total = 0; |
| + int i; |
| + int j; |
| + |
| + for (i = 0; i < MAX_MR_CACHE_ENTRIES; i++) { |
| + ent = &cache->ent[i]; |
| + for (j = 0 ; j < 1000; j++) { |
| + if (!ent->pending) |
| + break; |
| + msleep(50); |
| + } |
| + } |
| + for (i = 0; i < MAX_MR_CACHE_ENTRIES; i++) { |
| + ent = &cache->ent[i]; |
| + total += ent->pending; |
| + } |
| + |
| + if (total) |
| + mlx5_ib_warn(dev, "aborted while there are %d pending mr requests\n", total); |
| + else |
| + mlx5_ib_warn(dev, "done with all pending requests\n"); |
| +} |
| + |
| int mlx5_mr_cache_cleanup(struct mlx5_ib_dev *dev) |
| { |
| int i; |
| @@ -603,6 +630,7 @@ int mlx5_mr_cache_cleanup(struct mlx5_ib |
| clean_keys(dev, i); |
| |
| destroy_workqueue(dev->cache.wq); |
| + wait_for_async_commands(dev); |
| del_timer_sync(&dev->delay_timer); |
| |
| return 0; |