qlcnic: fix sleep-in-atomic-context bugs caused by msleep
authorDuoming Zhou <duoming@zju.edu.cn>
Wed, 23 Nov 2022 10:06:42 +0000 (18:06 +0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 25 Nov 2022 08:12:12 +0000 (08:12 +0000)
commit8dbd6e4ce1b9c527921643d9e34f188a10d4e893
treed206c29de8527d179133ac3ec5aca780de4b85b0
parent8d1c37e6aaaca495f043bac31f0cd309aa0cfdc5
qlcnic: fix sleep-in-atomic-context bugs caused by msleep

The watchdog timer is used to monitor whether the process
of transmitting data is timeout. If we use qlcnic driver,
the dev_watchdog() that is the timer handler of watchdog
timer will call qlcnic_tx_timeout() to process the timeout.
But the qlcnic_tx_timeout() calls msleep(), as a result,
the sleep-in-atomic-context bugs will happen. The processes
are shown below:

   (atomic context)
dev_watchdog
  qlcnic_tx_timeout
    qlcnic_83xx_idc_request_reset
      qlcnic_83xx_lock_driver
        msleep

---------------------------

   (atomic context)
dev_watchdog
  qlcnic_tx_timeout
    qlcnic_83xx_idc_request_reset
      qlcnic_83xx_lock_driver
        qlcnic_83xx_recover_driver_lock
          msleep

Fix by changing msleep() to mdelay(), the mdelay() is
busy-waiting and the bugs could be mitigated.

Fixes: 629263acaea3 ("qlcnic: 83xx CNA inter driver communication mechanism")
Signed-off-by: Duoming Zhou <duoming@zju.edu.cn>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c