• Sagi Grimberg's avatar
    nvme: fix controller removal race with scan work · 0157ec8d
    Sagi Grimberg authored
    With multipath enabled, nvme_scan_work() can read from the device
    (through nvme_mpath_add_disk()) and hang [1]. However, with fabrics,
    once ctrl->state is set to NVME_CTRL_DELETING, the reads will hang
    (see nvmf_check_ready()) and the mpath stack device make_request
    will block if head->list is not empty. However, when the head->list
    consistst of only DELETING/DEAD controllers, we should actually not
    block, but rather fail immediately.
    
    In addition, before we go ahead and remove the namespaces, make sure
    to clear the current path and kick the requeue list so that the
    request will fast fail upon requeuing.
    
    [1]:
    --
      INFO: task kworker/u4:3:166 blocked for more than 120 seconds.
            Not tainted 5.2.0-rc6-vmlocalyes-00005-g808c8c2dc0cf #316
      "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
      kworker/u4:3    D    0   166      2 0x80004000
      Workqueue: nvme-wq nvme_scan_work
      Call Trace:
       __schedule+0x851/0x1400
       schedule+0x99/0x210
       io_schedule+0x21/0x70
       do_read_cache_page+0xa57/0x1330
       read_cache_page+0x4a/0x70
       read_dev_sector+0xbf/0x380
       amiga_partition+0xc4/0x1230
       check_partition+0x30f/0x630
       rescan_partitions+0x19a/0x980
       __blkdev_get+0x85a/0x12f0
       blkdev_get+0x2a5/0x790
       __device_add_disk+0xe25/0x1250
       device_add_disk+0x13/0x20
       nvme_mpath_set_live+0x172/0x2b0
       nvme_update_ns_ana_state+0x130/0x180
       nvme_set_ns_ana_state+0x9a/0xb0
       nvme_parse_ana_log+0x1c3/0x4a0
       nvme_mpath_add_disk+0x157/0x290
       nvme_validate_ns+0x1017/0x1bd0
       nvme_scan_work+0x44d/0x6a0
       process_one_work+0x7d7/0x1240
       worker_thread+0x8e/0xff0
       kthread+0x2c3/0x3b0
       ret_from_fork+0x35/0x40
    
       INFO: task kworker/u4:1:1034 blocked for more than 120 seconds.
            Not tainted 5.2.0-rc6-vmlocalyes-00005-g808c8c2dc0cf #316
      "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
      kworker/u4:1    D    0  1034      2 0x80004000
      Workqueue: nvme-delete-wq nvme_delete_ctrl_work
      Call Trace:
       __schedule+0x851/0x1400
       schedule+0x99/0x210
       schedule_timeout+0x390/0x830
       wait_for_completion+0x1a7/0x310
       __flush_work+0x241/0x5d0
       flush_work+0x10/0x20
       nvme_remove_namespaces+0x85/0x3d0
       nvme_do_delete_ctrl+0xb4/0x1e0
       nvme_delete_ctrl_work+0x15/0x20
       process_one_work+0x7d7/0x1240
       worker_thread+0x8e/0xff0
       kthread+0x2c3/0x3b0
       ret_from_fork+0x35/0x40
    --
    Reported-by: default avatarLogan Gunthorpe <logang@deltatee.com>
    Tested-by: default avatarLogan Gunthorpe <logang@deltatee.com>
    Reviewed-by: default avatarLogan Gunthorpe <logang@deltatee.com>
    Reviewed-by: default avatarMing Lei <ming.lei@redhat.com>
    Signed-off-by: default avatarSagi Grimberg <sagi@grimberg.me>
    0157ec8d
multipath.c 18.6 KB