|
Revision tags: v6.15, v6.15-rc7, v6.15-rc6, v6.15-rc5, v6.15-rc4, v6.15-rc3, v6.15-rc2, v6.15-rc1, v6.14, v6.14-rc7, v6.14-rc6, v6.14-rc5, v6.14-rc4, v6.14-rc3, v6.14-rc2, v6.14-rc1, v6.13, v6.13-rc7 |
|
| #
80f130bf |
| 07-Jan-2025 |
Krister Johansen <[email protected]> |
dm thin: make get_first_thin use rcu-safe list first function
The documentation in rculist.h explains the absence of list_empty_rcu() and cautions programmers against relying on a list_empty() -> li
dm thin: make get_first_thin use rcu-safe list first function
The documentation in rculist.h explains the absence of list_empty_rcu() and cautions programmers against relying on a list_empty() -> list_first() sequence in RCU safe code. This is because each of these functions performs its own READ_ONCE() of the list head. This can lead to a situation where the list_empty() sees a valid list entry, but the subsequent list_first() sees a different view of list head state after a modification.
In the case of dm-thin, this author had a production box crash from a GP fault in the process_deferred_bios path. This function saw a valid list head in get_first_thin() but when it subsequently dereferenced that and turned it into a thin_c, it got the inside of the struct pool, since the list was now empty and referring to itself. The kernel on which this occurred printed both a warning about a refcount_t being saturated, and a UBSAN error for an out-of-bounds cpuid access in the queued spinlock, prior to the fault itself. When the resulting kdump was examined, it was possible to see another thread patiently waiting in thin_dtr's synchronize_rcu.
The thin_dtr call managed to pull the thin_c out of the active thins list (and have it be the last entry in the active_thins list) at just the wrong moment which lead to this crash.
Fortunately, the fix here is straight forward. Switch get_first_thin() function to use list_first_or_null_rcu() which performs just a single READ_ONCE() and returns NULL if the list is already empty.
This was run against the devicemapper test suite's thin-provisioning suites for delete and suspend and no regressions were observed.
Signed-off-by: Krister Johansen <[email protected]> Fixes: b10ebd34ccca ("dm thin: fix rcu_read_lock being held in code that can sleep") Cc: [email protected] Acked-by: Ming-Hung Tsai <[email protected]> Signed-off-by: Mikulas Patocka <[email protected]>
show more ...
|
|
Revision tags: v6.13-rc6, v6.13-rc5, v6.13-rc4, v6.13-rc3, v6.13-rc2, v6.13-rc1, v6.12, v6.12-rc7 |
|
| #
e74fa244 |
| 06-Nov-2024 |
Yuan Can <[email protected]> |
dm thin: Add missing destroy_work_on_stack()
This commit add missed destroy_work_on_stack() operations for pw->worker in pool_work_wait().
Fixes: e7a3e871d895 ("dm thin: cleanup noflush_work to use
dm thin: Add missing destroy_work_on_stack()
This commit add missed destroy_work_on_stack() operations for pw->worker in pool_work_wait().
Fixes: e7a3e871d895 ("dm thin: cleanup noflush_work to use a proper completion") Cc: [email protected] Signed-off-by: Yuan Can <[email protected]> Signed-off-by: Mikulas Patocka <[email protected]>
show more ...
|
|
Revision tags: v6.12-rc6 |
|
| #
2f5a65ef |
| 29-Oct-2024 |
Christoph Hellwig <[email protected]> |
block: add a bdev_limits helper
Add a helper to get the queue_limits from the bdev without having to poke into the request_queue.
Signed-off-by: Christoph Hellwig <[email protected]> Reviewed-by: John Gar
block: add a bdev_limits helper
Add a helper to get the queue_limits from the bdev without having to poke into the request_queue.
Signed-off-by: Christoph Hellwig <[email protected]> Reviewed-by: John Garry <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jens Axboe <[email protected]>
show more ...
|
|
Revision tags: v6.12-rc5, v6.12-rc4, v6.12-rc3, v6.12-rc2, v6.12-rc1, v6.11, v6.11-rc7, v6.11-rc6 |
|
| #
00565cff |
| 30-Aug-2024 |
Yuesong Li <[email protected]> |
dm: Convert to use ERR_CAST()
Use ERR_CAST() as it is designed for casting an error pointer to another type.
This macro utilizes the __force and __must_check modifiers, which instruct the compiler
dm: Convert to use ERR_CAST()
Use ERR_CAST() as it is designed for casting an error pointer to another type.
This macro utilizes the __force and __must_check modifiers, which instruct the compiler to verify for errors at the locations where it is employed.
Signed-off-by: Yuesong Li <[email protected]> Signed-off-by: Mikulas Patocka <[email protected]>
show more ...
|
|
Revision tags: v6.11-rc5, v6.11-rc4, v6.11-rc3, v6.11-rc2, v6.11-rc1, v6.10, v6.10-rc7 |
|
| #
0a94a469 |
| 03-Jul-2024 |
Christoph Hellwig <[email protected]> |
dm: stop using blk_limits_io_{min,opt}
Remove use of the blk_limits_io_{min,opt} and assign the values directly to the queue_limits structure. For the io_opt this is a completely mechanical change,
dm: stop using blk_limits_io_{min,opt}
Remove use of the blk_limits_io_{min,opt} and assign the values directly to the queue_limits structure. For the io_opt this is a completely mechanical change, for io_min it removes flooring the limit to the physical and logical block size in the particular caller. But as blk_validate_limits will do the same later when actually applying the limits, there still is no change in overall behavior.
Signed-off-by: Christoph Hellwig <[email protected]> Signed-off-by: Mikulas Patocka <[email protected]>
show more ...
|
|
Revision tags: v6.10-rc6, v6.10-rc5, v6.10-rc4, v6.10-rc3, v6.10-rc2, v6.10-rc1 |
|
| #
825d8bbd |
| 20-May-2024 |
Mike Snitzer <[email protected]> |
dm: always manage discard support in terms of max_hw_discard_sectors
Commit 4f563a64732d ("block: add a max_user_discard_sectors queue limit") changed block core to set max_discard_sectors to: min(
dm: always manage discard support in terms of max_hw_discard_sectors
Commit 4f563a64732d ("block: add a max_user_discard_sectors queue limit") changed block core to set max_discard_sectors to: min(lim->max_hw_discard_sectors, lim->max_user_discard_sectors)
Since commit 1c0e720228ad ("dm: use queue_limits_set") it was reported dm-thinp was failing in a few fstests (generic/347 and generic/405) with the first WARN_ON_ONCE in dm_cell_key_has_valid_range() being reported, e.g.: WARNING: CPU: 1 PID: 30 at drivers/md/dm-bio-prison-v1.c:128 dm_cell_key_has_valid_range+0x3d/0x50
blk_set_stacking_limits() sets max_user_discard_sectors to UINT_MAX, so given how block core now sets max_discard_sectors (detailed above) it follows that blk_stack_limits() stacks up the underlying device's max_hw_discard_sectors and max_discard_sectors is set to match it. If max_hw_discard_sectors exceeds dm's BIO_PRISON_MAX_RANGE, then dm_cell_key_has_valid_range() will trigger the warning with: WARN_ON_ONCE(key->block_end - key->block_begin > BIO_PRISON_MAX_RANGE)
Aside from this warning, the discard will fail. Fix this and other DM issues by governing discard support in terms of max_hw_discard_sectors instead of max_discard_sectors.
Reported-by: Theodore Ts'o <[email protected]> Fixes: 1c0e720228ad ("dm: use queue_limits_set") Signed-off-by: Mike Snitzer <[email protected]>
show more ...
|
|
Revision tags: v6.9, v6.9-rc7, v6.9-rc6, v6.9-rc5, v6.9-rc4, v6.9-rc3, v6.9-rc2 |
|
| #
50bc2150 |
| 28-Mar-2024 |
Christoph Hellwig <[email protected]> |
dm: use bio_list_merge_init
Use bio_list_merge_init instead of open coding bio_list_merge and bio_list_init.
Signed-off-by: Christoph Hellwig <[email protected]> Reviewed-by: Mike Snitzer <snitzer@kernel.
dm: use bio_list_merge_init
Use bio_list_merge_init instead of open coding bio_list_merge and bio_list_init.
Signed-off-by: Christoph Hellwig <[email protected]> Reviewed-by: Mike Snitzer <[email protected]> Reviewed-by: Johannes Thumshirn <[email protected]> Reviewed-by: Damien Le Moal <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jens Axboe <[email protected]>
show more ...
|
|
Revision tags: v6.9-rc1, v6.8, v6.8-rc7, v6.8-rc6, v6.8-rc5, v6.8-rc4 |
|
| #
fa34e589 |
| 07-Feb-2024 |
Mike Snitzer <[email protected]> |
dm: update relevant MODULE_AUTHOR entries to latest dm-devel mailing list
Signed-off-by: Mike Snitzer <[email protected]>
|
|
Revision tags: v6.8-rc3, v6.8-rc2, v6.8-rc1, v6.7, v6.7-rc8, v6.7-rc7, v6.7-rc6, v6.7-rc5, v6.7-rc4, v6.7-rc3, v6.7-rc2 |
|
| #
47c00dcd |
| 15-Nov-2023 |
Mike Snitzer <[email protected]> |
dm thin: add braces around conditional code that spans lines
Signed-off-by: Mike Snitzer <[email protected]>
|
|
Revision tags: v6.7-rc1, v6.6, v6.6-rc7, v6.6-rc6, v6.6-rc5, v6.6-rc4, v6.6-rc3, v6.6-rc2, v6.6-rc1, v6.5, v6.5-rc7, v6.5-rc6, v6.5-rc5, v6.5-rc4, v6.5-rc3, v6.5-rc2, v6.5-rc1, v6.4, v6.4-rc7 |
|
| #
fa375646 |
| 16-Jun-2023 |
Mike Snitzer <[email protected]> |
dm thin: disable discards for thin-pool if no_discard_passdown
Also rename disable_passdown_if_not_supported to disable_discard_passdown_if_not_supported.
And fold passdown_enabled() into only call
dm thin: disable discards for thin-pool if no_discard_passdown
Also rename disable_passdown_if_not_supported to disable_discard_passdown_if_not_supported.
And fold passdown_enabled() into only caller.
Signed-off-by: Mike Snitzer <[email protected]>
show more ...
|
|
Revision tags: v6.4-rc6, v6.4-rc5 |
|
| #
ef6953fb |
| 31-May-2023 |
Mike Snitzer <[email protected]> |
dm thin: update .io_hints methods to not require handling discards last
Removes assumptions about what might follow the discard setup code (previously the code would return early if discards not ena
dm thin: update .io_hints methods to not require handling discards last
Removes assumptions about what might follow the discard setup code (previously the code would return early if discards not enabled).
Makes it possible to add more capabilites to the end of each .io_hints method (which is the natural thing to do when adding new features).
Signed-off-by: Mike Snitzer <[email protected]>
show more ...
|
|
Revision tags: v6.4-rc4, v6.4-rc3 |
|
| #
c0a7a0ac |
| 15-May-2023 |
Mike Snitzer <[email protected]> |
dm thin: remove return code variable in pool_map
Always returns DM_MAPIO_REMAPPED so no need for variable.
Signed-off-by: Mike Snitzer <[email protected]>
|
| #
722d9082 |
| 14-Jun-2023 |
Mike Snitzer <[email protected]> |
dm thin: fix issue_discard to pass GFP_NOIO to __blkdev_issue_discard
issue_discard() passes GFP_NOWAIT to __blkdev_issue_discard() despite its code assuming bio_alloc() always succeeds.
Commit 3db
dm thin: fix issue_discard to pass GFP_NOIO to __blkdev_issue_discard
issue_discard() passes GFP_NOWAIT to __blkdev_issue_discard() despite its code assuming bio_alloc() always succeeds.
Commit 3dba53a958a75 ("dm thin: use __blkdev_issue_discard for async discard support") clearly shows where things went bad:
Before commit 3dba53a958a75, dm-thin.c's open-coded __blkdev_issue_discard_async() properly handled using GFP_NOWAIT. Unfortunately __blkdev_issue_discard() doesn't and it was missed during review.
Cc: [email protected] Signed-off-by: Mike Snitzer <[email protected]>
show more ...
|
| #
05bdb996 |
| 08-Jun-2023 |
Christoph Hellwig <[email protected]> |
block: replace fmode_t with a block-specific type for block open flags
The only overlap between the block open flags mapped into the fmode_t and other uses of fmode_t are FMODE_READ and FMODE_WRITE.
block: replace fmode_t with a block-specific type for block open flags
The only overlap between the block open flags mapped into the fmode_t and other uses of fmode_t are FMODE_READ and FMODE_WRITE. Define a new blk_mode_t instead for use in blkdev_get_by_{dev,path}, ->open and ->ioctl and stop abusing fmode_t.
Signed-off-by: Christoph Hellwig <[email protected]> Acked-by: Jack Wang <[email protected]> [rnbd] Reviewed-by: Hannes Reinecke <[email protected]> Reviewed-by: Christian Brauner <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jens Axboe <[email protected]>
show more ...
|
|
Revision tags: v6.4-rc2, v6.4-rc1, v6.3, v6.3-rc7, v6.3-rc6, v6.3-rc5, v6.3-rc4 |
|
| #
3f8d3f54 |
| 25-Mar-2023 |
Mike Snitzer <[email protected]> |
dm bio prison v1: add dm_cell_key_has_valid_range
Don't have bio_detain() BUG_ON if a dm_cell_key is beyond BIO_PRISON_MAX_RANGE or spans a boundary.
Update dm-thin.c:build_key() to use dm_cell_key
dm bio prison v1: add dm_cell_key_has_valid_range
Don't have bio_detain() BUG_ON if a dm_cell_key is beyond BIO_PRISON_MAX_RANGE or spans a boundary.
Update dm-thin.c:build_key() to use dm_cell_key_has_valid_range() which will do this checking without using BUG_ON. Also update process_discard_bio() to check the discard bio that DM core passes in (having first imposed max_discard_granularity based splitting).
dm_cell_key_has_valid_range() will merely WARN_ON_ONCE if it returns false because if it does: it is programmer error that should be caught with proper testing. So relax the BUG_ONs to be WARN_ON_ONCE.
Signed-off-by: Mike Snitzer <[email protected]>
show more ...
|
|
Revision tags: v6.3-rc3, v6.3-rc2, v6.3-rc1 |
|
| #
e2dd8aca |
| 02-Mar-2023 |
Joe Thornber <[email protected]> |
dm bio prison v1: improve concurrent IO performance
Split the bio prison into multiple regions, with a separate rbtree and associated lock for each region.
To get fast bio prison locking and not da
dm bio prison v1: improve concurrent IO performance
Split the bio prison into multiple regions, with a separate rbtree and associated lock for each region.
To get fast bio prison locking and not damage the performance of discards too much the bio-prison now stipulates that discards should not cross a BIO_PRISON_MAX_RANGE boundary.
Because the range of a key (block_end - block_begin) must not exceed BIO_PRISON_MAX_RANGE: break_up_discard_bio() now ensures the data range reflected in PHYSICAL key doesn't exceed BIO_PRISON_MAX_RANGE. And splitting the thin target's discards (handled with VIRTUAL key) is achieved by updating dm-thin.c to set limits->max_discard_sectors in terms of BIO_PRISON_MAX_RANGE _and_ setting the thin and thin-pool targets' max_discard_granularity to true.
Signed-off-by: Joe Thornber <[email protected]> Signed-off-by: Mike Snitzer <[email protected]>
show more ...
|
| #
bb46c561 |
| 22-Mar-2023 |
Joe Thornber <[email protected]> |
dm thin: speed up cell_defer_no_holder()
Reduce the time that a spinlock is held in cell_defer_no_holder().
Signed-off-by: Joe Thornber <[email protected]> Signed-off-by: Mike Snitzer <snitzer@kernel.
dm thin: speed up cell_defer_no_holder()
Reduce the time that a spinlock is held in cell_defer_no_holder().
Signed-off-by: Joe Thornber <[email protected]> Signed-off-by: Mike Snitzer <[email protected]>
show more ...
|
| #
9bbf5fee |
| 27-Feb-2023 |
Coly Li <[email protected]> |
dm thin: fix deadlock when swapping to thin device
This is an already known issue that dm-thin volume cannot be used as swap, otherwise a deadlock may happen when dm-thin internal memory demand trig
dm thin: fix deadlock when swapping to thin device
This is an already known issue that dm-thin volume cannot be used as swap, otherwise a deadlock may happen when dm-thin internal memory demand triggers swap I/O on the dm-thin volume itself.
But thanks to commit a666e5c05e7c ("dm: fix deadlock when swapping to encrypted device"), the limit_swap_bios target flag can also be used for dm-thin to avoid the recursive I/O when it is used as swap.
Fix is to simply set ti->limit_swap_bios to true in both pool_ctr() and thin_ctr().
In my test, I create a dm-thin volume /dev/vg/swap and use it as swap device. Then I run fio on another dm-thin volume /dev/vg/main and use large --blocksize to trigger swap I/O onto /dev/vg/swap.
The following fio command line is used in my test, fio --name recursive-swap-io --lockmem 1 --iodepth 128 \ --ioengine libaio --filename /dev/vg/main --rw randrw \ --blocksize 1M --numjobs 32 --time_based --runtime=12h
Without this fix, the whole system can be locked up within 15 seconds.
With this fix, there is no any deadlock or hung task observed after 2 hours of running fio.
Furthermore, if blocksize is changed from 1M to 128M, after around 30 seconds fio has no visible I/O, and the out-of-memory killer message shows up in kernel message. After around 20 minutes all fio processes are killed and the whole system is back to being alive.
This is exactly what is expected when recursive I/O happens on dm-thin volume when it is used as swap.
Depends-on: a666e5c05e7c ("dm: fix deadlock when swapping to encrypted device") Cc: [email protected] Signed-off-by: Coly Li <[email protected]> Acked-by: Mikulas Patocka <[email protected]> Signed-off-by: Mike Snitzer <[email protected]>
show more ...
|
|
Revision tags: v6.2 |
|
| #
e4f80303 |
| 16-Feb-2023 |
Mike Snitzer <[email protected]> |
dm thin: add cond_resched() to various workqueue loops
Otherwise on resource constrained systems these workqueues may be too greedy.
Signed-off-by: Mike Snitzer <[email protected]>
|
|
Revision tags: v6.2-rc8 |
|
| #
774f13ac |
| 07-Feb-2023 |
Heinz Mauelshagen <[email protected]> |
dm: declare variables static when sensible
Signed-off-by: Heinz Mauelshagen <[email protected]> Signed-off-by: Mike Snitzer <[email protected]>
|
| #
6a808034 |
| 06-Feb-2023 |
Heinz Mauelshagen <[email protected]> |
dm: avoid using symbolic permissions
Signed-off-by: Heinz Mauelshagen <[email protected]> Signed-off-by: Mike Snitzer <[email protected]>
|
|
Revision tags: v6.2-rc7 |
|
| #
0ef0b471 |
| 01-Feb-2023 |
Heinz Mauelshagen <[email protected]> |
dm: add missing empty lines
Signed-off-by: Heinz Mauelshagen <[email protected]> Signed-off-by: Mike Snitzer <[email protected]>
|
|
Revision tags: v6.2-rc6 |
|
| #
a4a82ce3 |
| 26-Jan-2023 |
Heinz Mauelshagen <[email protected]> |
dm: correct block comments format.
Signed-off-by: Heinz Mauelshagen <[email protected]> Signed-off-by: Mike Snitzer <[email protected]>
|
| #
255e2646 |
| 25-Jan-2023 |
Heinz Mauelshagen <[email protected]> |
dm: address indent/space issues
Signed-off-by: Heinz Mauelshagen <[email protected]> Signed-off-by: Mike Snitzer <[email protected]>
|
| #
86a3238c |
| 25-Jan-2023 |
Heinz Mauelshagen <[email protected]> |
dm: change "unsigned" to "unsigned int"
Signed-off-by: Heinz Mauelshagen <[email protected]> Signed-off-by: Mike Snitzer <[email protected]>
|