]> git.itanic.dy.fi Git - linux-stable/commitdiff
IB/isert: Avoid flush_scheduled_work() usage
authorTetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Thu, 5 May 2022 06:07:25 +0000 (15:07 +0900)
committerJason Gunthorpe <jgg@nvidia.com>
Fri, 20 May 2022 14:05:42 +0000 (11:05 -0300)
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>
drivers/infiniband/ulp/isert/ib_isert.c

index 181e39e2a673111a4265083271e2da4f741b13d2..b9e8afb51f6e2812a8612a5f5b4096b8d66c967b 100644 (file)
@@ -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");