1. 19 8月, 2023 1 次提交
  2. 11 8月, 2023 1 次提交
  3. 10 8月, 2023 2 次提交
  4. 09 8月, 2023 1 次提交
  5. 06 8月, 2023 1 次提交
  6. 04 8月, 2023 1 次提交
  7. 02 8月, 2023 1 次提交
  8. 27 7月, 2023 3 次提交
  9. 25 7月, 2023 5 次提交
  10. 22 7月, 2023 3 次提交
    • M
      loop: do not enforce max_loop hard limit by (new) default · bb5faa99
      Mauricio Faria de Oliveira 提交于
      Problem:
      
      The max_loop parameter is used for 2 different purposes:
      
      1) initial number of loop devices to pre-create on init
      2) maximum number of loop devices to add on access/open()
      
      Historically, its default value (zero) caused 1) to create non-zero
      number of devices (CONFIG_BLK_DEV_LOOP_MIN_COUNT), and no hard limit on
      2) to add devices with autoloading.
      
      However, the default value changed in commit 85c50197 ("loop: Fix
      the max_loop commandline argument treatment when it is set to 0") to
      CONFIG_BLK_DEV_LOOP_MIN_COUNT, for max_loop=0 not to pre-create devices.
      
      That does improve 1), but unfortunately it breaks 2), as the default
      behavior changed from no-limit to hard-limit.
      
      Example:
      
      For example, this userspace code broke for N >= CONFIG, if the user
      relied on the default value 0 for max_loop:
      
          mknod("/dev/loopN");
          open("/dev/loopN");  // now fails with ENXIO
      
      Though affected users may "fix" it with (loop.)max_loop=0, this means to
      require a kernel parameter change on stable kernel update (that commit
      Fixes: an old commit in stable).
      
      Solution:
      
      The original semantics for the default value in 2) can be applied if the
      parameter is not set (ie, default behavior).
      
      This still keeps the intended function in 1) and 2) if set, and that
      commit's intended improvement in 1) if max_loop=0.
      
      Before 85c50197:
        - default:     1) CONFIG devices   2) no limit
        - max_loop=0:  1) CONFIG devices   2) no limit
        - max_loop=X:  1) X devices        2) X limit
      
      After 85c50197:
        - default:     1) CONFIG devices   2) CONFIG limit (*)
        - max_loop=0:  1) 0 devices (*)    2) no limit
        - max_loop=X:  1) X devices        2) X limit
      
      This commit:
        - default:     1) CONFIG devices   2) no limit (*)
        - max_loop=0:  1) 0 devices        2) no limit
        - max_loop=X:  1) X devices        2) X limit
      
      Future:
      
      The issue/regression from that commit only affects code under the
      CONFIG_BLOCK_LEGACY_AUTOLOAD deprecation guard, thus the fix too is
      contained under it.
      
      Once that deprecated functionality/code is removed, the purpose 2) of
      max_loop (hard limit) is no longer in use, so the module parameter
      description can be changed then.
      
      Tests:
      
      Linux 6.4-rc7
      CONFIG_BLK_DEV_LOOP_MIN_COUNT=8
      CONFIG_BLOCK_LEGACY_AUTOLOAD=y
      
      - default (original)
      
      	# ls -1 /dev/loop*
      	/dev/loop-control
      	/dev/loop0
      	...
      	/dev/loop7
      
      	# ./test-loop
      	open: /dev/loop8: No such device or address
      
      - default (patched)
      
      	# ls -1 /dev/loop*
      	/dev/loop-control
      	/dev/loop0
      	...
      	/dev/loop7
      
      	# ./test-loop
      	#
      
      - max_loop=0 (original & patched):
      
      	# ls -1 /dev/loop*
      	/dev/loop-control
      
      	# ./test-loop
      	#
      
      - max_loop=8 (original & patched):
      
      	# ls -1 /dev/loop*
      	/dev/loop-control
      	/dev/loop0
      	...
      	/dev/loop7
      
      	# ./test-loop
      	open: /dev/loop8: No such device or address
      
      - max_loop=0 (patched; CONFIG_BLOCK_LEGACY_AUTOLOAD is not set)
      
      	# ls -1 /dev/loop*
      	/dev/loop-control
      
      	# ./test-loop
      	open: /dev/loop8: No such device or address
      
      Fixes: 85c50197 ("loop: Fix the max_loop commandline argument treatment when it is set to 0")
      Signed-off-by: NMauricio Faria de Oliveira <mfo@canonical.com>
      Reviewed-by: NChristoph Hellwig <hch@lst.de>
      Link: https://lore.kernel.org/r/20230720143033.841001-3-mfo@canonical.comSigned-off-by: NJens Axboe <axboe@kernel.dk>
      bb5faa99
    • M
      loop: deprecate autoloading callback loop_probe() · 23881aec
      Mauricio Faria de Oliveira 提交于
      The 'probe' callback in __register_blkdev() is only used under the
      CONFIG_BLOCK_LEGACY_AUTOLOAD deprecation guard.
      
      The loop_probe() function is only used for that callback, so guard it
      too, accordingly.
      
      See commit fbdee71b ("block: deprecate autoloading based on dev_t").
      Signed-off-by: NMauricio Faria de Oliveira <mfo@canonical.com>
      Reviewed-by: NChristoph Hellwig <hch@lst.de>
      Link: https://lore.kernel.org/r/20230720143033.841001-2-mfo@canonical.comSigned-off-by: NJens Axboe <axboe@kernel.dk>
      23881aec
    • D
      sbitmap: fix batching wakeup · 10639737
      David Jeffery 提交于
      Current code supposes that it is enough to provide forward progress by
      just waking up one wait queue after one completion batch is done.
      
      Unfortunately this way isn't enough, cause waiter can be added to wait
      queue just after it is woken up.
      
      Follows one example(64 depth, wake_batch is 8)
      
      1) all 64 tags are active
      
      2) in each wait queue, there is only one single waiter
      
      3) each time one completion batch(8 completions) wakes up just one
         waiter in each wait queue, then immediately one new sleeper is added
         to this wait queue
      
      4) after 64 completions, 8 waiters are wakeup, and there are still 8
         waiters in each wait queue
      
      5) after another 8 active tags are completed, only one waiter can be
         wakeup, and the other 7 can't be waken up anymore.
      
      Turns out it isn't easy to fix this problem, so simply wakeup enough
      waiters for single batch.
      
      Cc: Kemeng Shi <shikemeng@huaweicloud.com>
      Cc: Chengming Zhou <zhouchengming@bytedance.com>
      Cc: Jan Kara <jack@suse.cz>
      Signed-off-by: NDavid Jeffery <djeffery@redhat.com>
      Signed-off-by: NMing Lei <ming.lei@redhat.com>
      Reviewed-by: NGabriel Krisman Bertazi <krisman@suse.de>
      Reviewed-by: NKeith Busch <kbusch@kernel.org>
      Link: https://lore.kernel.org/r/20230721095715.232728-1-ming.lei@redhat.comSigned-off-by: NJens Axboe <axboe@kernel.dk>
      10639737
  11. 21 7月, 2023 5 次提交
  12. 15 7月, 2023 1 次提交
    • R
      blk-mq: Fix stall due to recursive flush plug · 70904263
      Ross Lagerwall 提交于
      We have seen rare IO stalls as follows:
      
      * blk_mq_plug_issue_direct() is entered with an mq_list containing two
      requests.
      * For the first request, it sets last == false and enters the driver's
      queue_rq callback.
      * The driver queue_rq callback indirectly calls schedule() which calls
      blk_flush_plug(). This may happen if the driver has the
      BLK_MQ_F_BLOCKING flag set and is allowed to sleep in ->queue_rq.
      * blk_flush_plug() handles the remaining request in the mq_list. mq_list
      is now empty.
      * The original call to queue_rq resumes (with last == false).
      * The loop in blk_mq_plug_issue_direct() terminates because there are no
      remaining requests in mq_list.
      
      The IO is now stalled because the last request submitted to the driver
      had last == false and there was no subsequent call to commit_rqs().
      
      Fix this by returning early in blk_mq_flush_plug_list() if rq_count is 0
      which it will be in the recursive case, rather than checking if the
      mq_list is empty. At the same time, adjust one of the callers to skip
      the mq_list empty check as it is not necessary.
      
      Fixes: dc5fc361 ("block: attempt direct issue of plug list")
      Signed-off-by: NRoss Lagerwall <ross.lagerwall@citrix.com>
      Reviewed-by: NBart Van Assche <bvanassche@acm.org>
      Link: https://lore.kernel.org/r/20230714101106.3635611-1-ross.lagerwall@citrix.comSigned-off-by: NJens Axboe <axboe@kernel.dk>
      70904263
  13. 14 7月, 2023 3 次提交
  14. 13 7月, 2023 6 次提交
  15. 12 7月, 2023 2 次提交
  16. 11 7月, 2023 2 次提交
  17. 10 7月, 2023 2 次提交