1. 30 Mar, 2021 1 commit
    • David Jeffery's avatar
      block: recalculate segment count for multi-segment discards correctly · fdc61af3
      David Jeffery authored
      [ Upstream commit a958937f ]
      
      When a stacked block device inserts a request into another block device
      using blk_insert_cloned_request, the request's nr_phys_segments field gets
      recalculated by a call to blk_recalc_rq_segments in
      blk_cloned_rq_check_limits. But blk_recalc_rq_segments does not know how to
      handle multi-segment discards. For disk types which can handle
      multi-segment discards like nvme, this results in discard requests which
      claim a single segment when it should report several, triggering a warning
      in nvme and causing nvme to fail the discard from the invalid state.
      
       WARNING: CPU: 5 PID: 191 at drivers/nvme/host/core.c:700 nvme_setup_discard+0x170/0x1e0 [nvme_core]
       ...
       nvme_setup_cmd+0x217/0x270 [nvme_core]
       nvme_loop_queue_rq+0x51/0x1b0 [nvme_loop]
       __blk_mq_try_issue_directly+0xe7/0x1b0
       blk_mq_request_issue_directly+0x41/0x70
       ? blk_account_io_start+0x40/0x50
       dm_mq_queue_rq+0x200/0x3e0
       blk_mq_dispatch_rq_list+0x10a/0x7d0
       ? __sbitmap_queue_get+0x25/0x90
       ? elv_rb_del+0x1f/0x30
       ? deadline_remove_request+0x55/0xb0
       ? dd_dispatch_request+0x181/0x210
       __blk_mq_do_dispatch_sched+0x144/0x290
       ? bio_attempt_discard_merge+0x134/0x1f0
       __blk_mq_sched_dispatch_requests+0x129/0x180
       blk_mq_sched_dispatch_requests+0x30/0x60
       __blk_mq_run_hw_queue+0x47/0xe0
       __blk_mq_delay_run_hw_queue+0x15b/0x170
       blk_mq_sched_insert_requests+0x68/0xe0
       blk_mq_flush_plug_list+0xf0/0x170
       blk_finish_plug+0x36/0x50
       xlog_cil_committed+0x19f/0x290 [xfs]
       xlog_cil_process_committed+0x57/0x80 [xfs]
       xlog_state_do_callback+0x1e0/0x2a0 [xfs]
       xlog_ioend_work+0x2f/0x80 [xfs]
       process_one_work+0x1b6/0x350
       worker_thread+0x53/0x3e0
       ? process_one_work+0x350/0x350
       kthread+0x11b/0x140
       ? __kthread_bind_mask+0x60/0x60
       ret_from_fork+0x22/0x30
      
      This patch fixes blk_recalc_rq_segments to be aware of devices which can
      have multi-segment discards. It calculates the correct discard segment
      count by counting the number of bio as each discard bio is considered its
      own segment.
      
      Fixes: 1e739730
      
       ("block: optionally merge discontiguous discard bios into a single request")
      Signed-off-by: default avatarDavid Jeffery <djeffery@redhat.com>
      Reviewed-by: default avatarMing Lei <ming.lei@redhat.com>
      Reviewed-by: default avatarLaurence Oberman <loberman@redhat.com>
      Link: https://lore.kernel.org/r/20210211143807.GA115624@redhat
      
      Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      fdc61af3
  2. 03 Sep, 2020 2 commits
  3. 22 Jul, 2020 2 commits
  4. 05 Aug, 2019 5 commits
  5. 03 Jul, 2019 1 commit
  6. 20 Jun, 2019 3 commits
  7. 23 May, 2019 3 commits
  8. 22 Apr, 2019 1 commit
  9. 12 Apr, 2019 1 commit
  10. 08 Apr, 2019 1 commit
    • Ming Lei's avatar
      block: fix build warning in merging bvecs · b21e11c5
      Ming Lei authored
      Commit f6970f83
      
       ("block: don't check if adjacent bvecs in one bio can
      be mergeable") changes bvec merge by only considering two bvecs from
      different bios. However, if the former bio doesn't inlcude any io bvec,
      then the following warning may be triggered:
      
       warning: ‘bvec.bv_offset’ may be used uninitialized in this function [-Wmaybe-uninitialized]
      
      In practice, it shouldn't be triggered.
      
      Fixes it by adding check on former bio, the check shouldn't add any cost
      given 'bio->bi_iter' can be hit in cache.
      Reported-by: default avatarJens Axboe <axboe@kernel.dk>
      Fixes: f6970f83
      
       ("block: don't check if adjacent bvecs in one bio can be mergeable")
      Signed-off-by: default avatarMing Lei <ming.lei@redhat.com>
      Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
      b21e11c5
  11. 01 Apr, 2019 4 commits
  12. 06 Mar, 2019 1 commit
    • Ming Lei's avatar
      block: fix segment calculation for passthrough IO · 05b700ba
      Ming Lei authored
      blk_recount_segments() can be called in bio_add_pc_page() for
      calculating how many segments this bio will has after one page is added
      to this bio. If the resulted segment number is beyond the queue limit,
      the added page will be removed.
      
      The try-and-fix policy requires blk_recount_segments(__blk_recalc_rq_segments)
      to not consider the segment number limit. Unfortunately bvec_split_segs()
      does check this limit, and causes small segment number returned to
      bio_add_pc_page(), then page still may be added to the bio even though
      segment number limit becomes broken.
      
      Fixes this issue by not considering segment number limit when calcualting
      bio's segment number.
      
      Fixes: dcebd755
      
       ("block: use bio_for_each_bvec() to compute multi-page bvec count")
      Cc: Christoph Hellwig <hch@lst.de>
      Cc: Omar Sandoval <osandov@fb.com>
      Signed-off-by: default avatarMing Lei <ming.lei@redhat.com>
      Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
      05b700ba
  13. 02 Mar, 2019 1 commit
  14. 27 Feb, 2019 3 commits
  15. 19 Feb, 2019 1 commit
  16. 15 Feb, 2019 4 commits
  17. 27 Jan, 2019 1 commit
  18. 22 Jan, 2019 1 commit
    • Ming Lei's avatar
      block: cover another queue enter recursion via BIO_QUEUE_ENTERED · 698cef17
      Ming Lei authored
      Except for blk_queue_split(), bio_split() is used for splitting bio too,
      then the remained bio is often resubmit to queue via generic_make_request().
      So the same queue enter recursion exits in this case too. Unfortunatley
      commit cd4a4ae4 doesn't help this case.
      
      This patch covers the above case by setting BIO_QUEUE_ENTERED before calling
      q->make_request_fn.
      
      In theory the per-bio flag is used to simulate one stack variable, it is
      just fine to clear it after q->make_request_fn is returned. Especially
      the same bio can't be submitted from another context.
      
      Fixes: cd4a4ae4
      
       ("block: don't use blocking queue entered for recursive bio submits")
      Cc: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
      Cc: NeilBrown <neilb@suse.com>
      Reviewed-by: default avatarMike Snitzer <snitzer@redhat.com>
      Signed-off-by: default avatarMing Lei <ming.lei@redhat.com>
      Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
      698cef17
  19. 19 Dec, 2018 1 commit
  20. 14 Dec, 2018 1 commit
  21. 10 Dec, 2018 2 commits