Skip to content

Commit be154d9

Browse files
shroffnikawasaki
authored andcommitted
block: fix atomic write limits for stacked devices
The current logic applies the bottom device's atomic write limits to the stacked (top) device only if the top device does not support chunk sectors. However, this approach is too restrictive. We should also propagate the bottom device's atomic write limits to the stacked device if atomic_write_hw_unit_{min,max} of the bottom device are aligned with the top device's chunk size (io_min). Failing to do so may unnecessarily reduce the stacked device's atomic write limits to values much smaller than what the hardware can actually support. For example, on an NVMe disk with the following controller capability: $ nvme id-ctrl /dev/nvme1 | grep awupf awupf : 63 Without the patch applied, The bottom device (nvme1c1n1) atomic queue limits: $ /sys/block/nvme1c1n1/queue/atomic_write_boundary_bytes:0 $ /sys/block/nvme1c1n1/queue/atomic_write_max_bytes:262144 $ /sys/block/nvme1c1n1/queue/atomic_write_unit_max_bytes:262144 $ /sys/block/nvme1c1n1/queue/atomic_write_unit_min_bytes:4096 The top device (nvme1n1) atomic queue limits: $ /sys/block/nvme1n1/queue/atomic_write_boundary_bytes:0 $ /sys/block/nvme1n1/queue/atomic_write_max_bytes:4096 $ /sys/block/nvme1n1/queue/atomic_write_unit_max_bytes:4096 $ /sys/block/nvme1n1/queue/atomic_write_unit_min_bytes:4096 With this patch applied, The top device (nvme1n1) atomic queue limits: /sys/block/nvme1n1/queue/atomic_write_boundary_bytes:0 /sys/block/nvme1n1/queue/atomic_write_max_bytes:262144 /sys/block/nvme1n1/queue/atomic_write_unit_max_bytes:262144 /sys/block/nvme1n1/queue/atomic_write_unit_min_bytes:4096 This change ensures that the stacked device retains optimal atomic write capability when alignment permits, improving overall performance and correctness. Reported-by: Ojaswin Mujoo <[email protected]> Fixes: d7f36dc ("block: Support atomic writes limits for stacked devices") Signed-off-by: Nilay Shroff <[email protected]>
1 parent 3d460ec commit be154d9

1 file changed

Lines changed: 8 additions & 2 deletions

File tree

block/blk-settings.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -598,8 +598,14 @@ static bool blk_stack_atomic_writes_head(struct queue_limits *t,
598598
!blk_stack_atomic_writes_boundary_head(t, b))
599599
return false;
600600

601-
if (t->io_min <= SECTOR_SIZE) {
602-
/* No chunk sectors, so use bottom device values directly */
601+
if (t->io_min <= SECTOR_SIZE ||
602+
(!(t->atomic_write_hw_unit_max % t->io_min) &&
603+
!(t->atomic_write_hw_unit_min % t->io_min))) {
604+
/*
605+
* If there are no chunk sectors, or if b->atomic_write_hw_unit
606+
* _{min, max} are aligned to the chunk size (t->io_min), then
607+
* use the bottom device's values directly.
608+
*/
603609
t->atomic_write_hw_unit_max = b->atomic_write_hw_unit_max;
604610
t->atomic_write_hw_unit_min = b->atomic_write_hw_unit_min;
605611
t->atomic_write_hw_max = b->atomic_write_hw_max;

0 commit comments

Comments
 (0)