mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
nvmet-rdma: flush nvmet-wq on module exit
nvmet_rdma_exit() relies on ib_unregister_client() to flush nvmet-wq through nvmet_rdma_remove_one(), but since commita3dd7d0022that returns at once for a device no longer on device_list. The release work of the last queue takes the device off the list in nvmet_rdma_free_dev() and still has to drop the mutex, free the struct and return through nvmet_rdma_release_queue_work(), so an rmmod in that window frees the module code it's running. Flush nvmet-wq after ib_unregister_client(). No release work can be queued after that point. Fixes:a3dd7d0022("nvmet-rdma: Don't flush system_wq by default during remove_one") Cc: Christoph Hellwig <hch@lst.de> Cc: Sagi Grimberg <sagi@grimberg.me> Cc: Chaitanya Kulkarni <kch@nvidia.com> Signed-off-by: Chris Mason <mason@kernel.org> Signed-off-by: Jens Axboe <axboe@kernel.dk> Signed-off-by: Keith Busch <kbusch@kernel.org>
This commit is contained in:
parent
64e21d7820
commit
2b646788ee
|
|
@ -2151,6 +2151,12 @@ static void __exit nvmet_rdma_exit(void)
|
|||
{
|
||||
nvmet_unregister_transport(&nvmet_rdma_ops);
|
||||
ib_unregister_client(&nvmet_rdma_ib_client);
|
||||
/*
|
||||
* nvmet_rdma_remove_one() does not flush for a device that has left
|
||||
* device_list, and the release work that took it off still has to
|
||||
* return from nvmet_rdma_free_dev().
|
||||
*/
|
||||
flush_workqueue(nvmet_wq);
|
||||
WARN_ON_ONCE(!list_empty(&nvmet_rdma_queue_list));
|
||||
ida_destroy(&nvmet_rdma_queue_ida);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user