IB/mlx5: Flush cache workqueue before destroying it
Destroying the workqueue without flushing it first can lead to a case in which the kernel tries to push a delayed work to the workqueue which does not exist anymore. Signed-off-by: Moshe Lazer <moshel@mellanox.com> Signed-off-by: Eli Cohen <eli@mellanox.com> Signed-off-by: Roland Dreier <roland@purestorage.com>hifive-unleashed-5.1
parent
b125a54bfd
commit
3c4619114c
|
@ -415,6 +415,7 @@ static void clean_keys(struct mlx5_ib_dev *dev, int c)
|
||||||
int size;
|
int size;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
cancel_delayed_work(&ent->dwork);
|
||||||
while (1) {
|
while (1) {
|
||||||
spin_lock(&ent->lock);
|
spin_lock(&ent->lock);
|
||||||
if (list_empty(&ent->head)) {
|
if (list_empty(&ent->head)) {
|
||||||
|
@ -540,13 +541,15 @@ int mlx5_mr_cache_cleanup(struct mlx5_ib_dev *dev)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
dev->cache.stopped = 1;
|
dev->cache.stopped = 1;
|
||||||
destroy_workqueue(dev->cache.wq);
|
flush_workqueue(dev->cache.wq);
|
||||||
|
|
||||||
mlx5_mr_cache_debugfs_cleanup(dev);
|
mlx5_mr_cache_debugfs_cleanup(dev);
|
||||||
|
|
||||||
for (i = 0; i < MAX_MR_CACHE_ENTRIES; i++)
|
for (i = 0; i < MAX_MR_CACHE_ENTRIES; i++)
|
||||||
clean_keys(dev, i);
|
clean_keys(dev, i);
|
||||||
|
|
||||||
|
destroy_workqueue(dev->cache.wq);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue