aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEli Cohen <eli@mellanox.com>2016-10-27 09:36:43 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-01-26 02:24:34 -0500
commit0d64860aa6389e4cd23da3ef1eb648fbeded1060 (patch)
treec8e0e0b199f2389673adec1ff1518daafddbee02
parent7c8441c89043d9914a441e5589bb76148f1a93da (diff)
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: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/infiniband/hw/mlx5/mr.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/drivers/infiniband/hw/mlx5/mr.c b/drivers/infiniband/hw/mlx5/mr.c
index 501af9eab6ec..be2d02b6a6aa 100644
--- a/drivers/infiniband/hw/mlx5/mr.c
+++ b/drivers/infiniband/hw/mlx5/mr.c
@@ -647,6 +647,33 @@ int mlx5_mr_cache_init(struct mlx5_ib_dev *dev)
647 return 0; 647 return 0;
648} 648}
649 649
650static void wait_for_async_commands(struct mlx5_ib_dev *dev)
651{
652 struct mlx5_mr_cache *cache = &dev->cache;
653 struct mlx5_cache_ent *ent;
654 int total = 0;
655 int i;
656 int j;
657
658 for (i = 0; i < MAX_MR_CACHE_ENTRIES; i++) {
659 ent = &cache->ent[i];
660 for (j = 0 ; j < 1000; j++) {
661 if (!ent->pending)
662 break;
663 msleep(50);
664 }
665 }
666 for (i = 0; i < MAX_MR_CACHE_ENTRIES; i++) {
667 ent = &cache->ent[i];
668 total += ent->pending;
669 }
670
671 if (total)
672 mlx5_ib_warn(dev, "aborted while there are %d pending mr requests\n", total);
673 else
674 mlx5_ib_warn(dev, "done with all pending requests\n");
675}
676
650int mlx5_mr_cache_cleanup(struct mlx5_ib_dev *dev) 677int mlx5_mr_cache_cleanup(struct mlx5_ib_dev *dev)
651{ 678{
652 int i; 679 int i;
@@ -660,6 +687,7 @@ int mlx5_mr_cache_cleanup(struct mlx5_ib_dev *dev)
660 clean_keys(dev, i); 687 clean_keys(dev, i);
661 688
662 destroy_workqueue(dev->cache.wq); 689 destroy_workqueue(dev->cache.wq);
690 wait_for_async_commands(dev);
663 del_timer_sync(&dev->delay_timer); 691 del_timer_sync(&dev->delay_timer);
664 692
665 return 0; 693 return 0;