Skip to the content.

blk_mq_kick_requeue_list 总是如下的路径:

freeze

例如,如果想要删除一个盘,最后会因为 ref count 不为 0

echo 1 > /sys/block/sda/device/delete
➜  nvme0n1 cat /proc/4837/stack
[<0>] blk_mq_freeze_queue_wait+0x96/0xd0
[<0>] del_gendisk+0x257/0x390
[<0>] sd_remove+0x2f/0x60
[<0>] device_release_driver_internal+0x19f/0x200
[<0>] bus_remove_device+0xc4/0x100
[<0>] device_del+0x15c/0x490
[<0>] __scsi_remove_device+0x12a/0x180
[<0>] sdev_store_delete+0x6a/0xd0
[<0>] kernfs_fop_write_iter+0x10c/0x1f0
[<0>] vfs_write+0x24a/0x440
[<0>] ksys_write+0x6f/0xf0
[<0>] do_syscall_64+0x3b/0x90
[<0>] entry_SYSCALL_64_after_hwframe+0x6e/0xd8

init

blk_mq_dispatch_rq_list

和 __blk_mq_issue_directly 是唯二调用 blk_mq_ops::queue_rq 的地方

blk_mq_dispatch_rq_list 是来自于 scheduler 的

@[
    blk_mq_dispatch_rq_list+5
    __blk_mq_sched_dispatch_requests+301
    blk_mq_sched_dispatch_requests+57
    __blk_mq_run_hw_queue+115
    process_one_work+482
    worker_thread+84
    kthread+218
    ret_from_fork+41
]: 57
@[
    blk_mq_dispatch_rq_list+5
    __blk_mq_sched_dispatch_requests+171
    blk_mq_sched_dispatch_requests+57
    __blk_mq_run_hw_queue+115
    blk_mq_run_hw_queues+105
    blk_mq_requeue_work+340
    process_one_work+482
    worker_thread+84
    kthread+218
    ret_from_fork+41
]: 92

有趣的路径,当 echo check > /sys/block/md2/md/sync_action 的时候产生的

  virtio_queue_rq
  blk_mq_request_issue_directly
  blk_mq_try_issue_list_directly
  blk_mq_flush_plug_list
  blk_add_rq_to_plug
  blk_mq_submit_bio
  submit_bio_noacct_nocheck
  raid1_sync_request
  md_do_sync
  md_thread
  kthread
  ret_from_fork
  ret_from_fork_asm
    406

  virtio_queue_rq
  blk_mq_dispatch_rq_list
  __blk_mq_sched_dispatch_requests
  blk_mq_sched_dispatch_requests
  blk_mq_run_work_fn
  process_scheduled_works
  worker_thread
  kthread
  ret_from_fork
  ret_from_fork_asm
    109222

获取 tags

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。