mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-18 02:46:06 +00:00
IB/isert: Avoid flush_scheduled_work() usage
Flushing system-wide workqueues is dangerous and will be forbidden. Replace system_wq with local isert_login_wq. Link: https://lore.kernel.org/r/fbe5e9a8-0110-0c22-b7d6-74d53948d042@I-love.SAKURA.ne.jp Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> Reviewed-by: Sagi Grimberg <sagi@grimberg.me> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
This commit is contained in:
parent
988d74deaa
commit
549f39a58a
@ -42,6 +42,7 @@ MODULE_PARM_DESC(sg_tablesize,
|
||||
|
||||
static DEFINE_MUTEX(device_list_mutex);
|
||||
static LIST_HEAD(device_list);
|
||||
static struct workqueue_struct *isert_login_wq;
|
||||
static struct workqueue_struct *isert_comp_wq;
|
||||
static struct workqueue_struct *isert_release_wq;
|
||||
|
||||
@ -1017,7 +1018,7 @@ isert_rx_login_req(struct isert_conn *isert_conn)
|
||||
complete(&isert_conn->login_comp);
|
||||
return;
|
||||
}
|
||||
schedule_delayed_work(&conn->login_work, 0);
|
||||
queue_delayed_work(isert_login_wq, &conn->login_work, 0);
|
||||
}
|
||||
|
||||
static struct iscsi_cmd
|
||||
@ -2348,9 +2349,9 @@ isert_get_login_rx(struct iscsi_conn *conn, struct iscsi_login *login)
|
||||
|
||||
/*
|
||||
* For login requests after the first PDU, isert_rx_login_req() will
|
||||
* kick schedule_delayed_work(&conn->login_work) as the packet is
|
||||
* received, which turns this callback from iscsi_target_do_login_rx()
|
||||
* into a NOP.
|
||||
* kick queue_delayed_work(isert_login_wq, &conn->login_work) as
|
||||
* the packet is received, which turns this callback from
|
||||
* iscsi_target_do_login_rx() into a NOP.
|
||||
*/
|
||||
if (!login->first_request)
|
||||
return 0;
|
||||
@ -2606,20 +2607,23 @@ static struct iscsit_transport iser_target_transport = {
|
||||
|
||||
static int __init isert_init(void)
|
||||
{
|
||||
int ret;
|
||||
isert_login_wq = alloc_workqueue("isert_login_wq", 0, 0);
|
||||
if (!isert_login_wq) {
|
||||
isert_err("Unable to allocate isert_login_wq\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
isert_comp_wq = alloc_workqueue("isert_comp_wq",
|
||||
WQ_UNBOUND | WQ_HIGHPRI, 0);
|
||||
if (!isert_comp_wq) {
|
||||
isert_err("Unable to allocate isert_comp_wq\n");
|
||||
return -ENOMEM;
|
||||
goto destroy_login_wq;
|
||||
}
|
||||
|
||||
isert_release_wq = alloc_workqueue("isert_release_wq", WQ_UNBOUND,
|
||||
WQ_UNBOUND_MAX_ACTIVE);
|
||||
if (!isert_release_wq) {
|
||||
isert_err("Unable to allocate isert_release_wq\n");
|
||||
ret = -ENOMEM;
|
||||
goto destroy_comp_wq;
|
||||
}
|
||||
|
||||
@ -2630,17 +2634,20 @@ static int __init isert_init(void)
|
||||
|
||||
destroy_comp_wq:
|
||||
destroy_workqueue(isert_comp_wq);
|
||||
destroy_login_wq:
|
||||
destroy_workqueue(isert_login_wq);
|
||||
|
||||
return ret;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
static void __exit isert_exit(void)
|
||||
{
|
||||
flush_scheduled_work();
|
||||
flush_workqueue(isert_login_wq);
|
||||
destroy_workqueue(isert_release_wq);
|
||||
destroy_workqueue(isert_comp_wq);
|
||||
iscsit_unregister_transport(&iser_target_transport);
|
||||
isert_info("iSER_TARGET[0] - Released iser_target_transport\n");
|
||||
destroy_workqueue(isert_login_wq);
|
||||
}
|
||||
|
||||
MODULE_DESCRIPTION("iSER-Target for mainline target infrastructure");
|
||||
|
Loading…
x
Reference in New Issue
Block a user