diff options
author | Eli Cohen <eli@mellanox.com> | 2016-10-27 09:36:43 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-01-26 02:24:34 -0500 |
commit | 0d64860aa6389e4cd23da3ef1eb648fbeded1060 (patch) | |
tree | c8e0e0b199f2389673adec1ff1518daafddbee02 | |
parent | 7c8441c89043d9914a441e5589bb76148f1a93da (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.c | 28 |
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 | ||
650 | static 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 | |||
650 | int mlx5_mr_cache_cleanup(struct mlx5_ib_dev *dev) | 677 | int 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; |