On 3/14/23 16:00, Alexey Klimov wrote:
The delay is found to be in device's ->shutdown() methods called from kernel_restart(): void kernel_restart_prepare(char *cmd) { blocking_notifier_call_chain(&reboot_notifier_list, SYS_RESTART, cmd); system_state = SYSTEM_RESTART; usermodehelper_disable(); device_shutdown(); <---- here } The driver in question is ufshcd and its ufshcd_wl_shutdown() shutdown method. It often blocks on scsi_device_quiesce() and upon manual checking it seems that it sleeps on blk_mq_freeze_queue_wait()/wait_event() in blk_freeze_queue(): scsi_device_quiesce(struct scsi_device *sdev) { ... blk_mq_freeze_queue(q); ... } || V void blk_freeze_queue(struct request_queue *q) { /* * In the !blk_mq case we are only calling this to kill the * q_usage_counter, otherwise this increases the freeze depth * and waits for it to return to zero. For this reason there is * no blk_unfreeze_queue(), and blk_freeze_queue() is not * exported to drivers as the only user for unfreeze is blk_mq. */ blk_freeze_queue_start(q); blk_mq_freeze_queue_wait(q); <--- sleeps on wait_event() here }
Please let me know if you want me to resubmit patch "scsi: ufs: Remove the LUN quiescing code from ufshcd_wl_shutdown()" (https://lore.kernel.org/linux-scsi/20220331223424.1054715-14-bvanassche@xxxxxxx/).
Thanks, Bart.