Re: [PATCH] dm-delay: Prevent zoned write reordering on suspend

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 4/10/25 4:54 PM, Christoph Hellwig wrote:
> On Thu, Apr 10, 2025 at 01:33:11PM +0900, Damien Le Moal wrote:
>> When a dm-delay devie is being suspended, the .presuspend() operation is
> 
> s/devie/device/
> 
>> first executed (delay_presuspend()) to immediately issue all the BIOs
>> present in the delayed list of the device and also sets the device
>> may_delay boolean to false. At the same time, any new BIO is issued to
>> the device will not be delayed and immediately issued with delay_bio()
>> returning DM_MAPIO_REMAPPED. This creates a situation where potentially
>> 2 different contexts may be issuing write BIOs to the same zone of a
>> zone device without respecting the issuing order from the user, that is,
>> a newly issued write BIO may be issued before other write BIOs for the
>> same target zone that are in the device delayed list. If such situation
>> occurs, write BIOs may be failed by the underlying zoned device due to
>> an unaligned write error.
>>
>> Prevent this situation from happening by always handling newly issued
>> write BIOs using the delayed list of BIOs, even when the device is being
>> suspended. This is done by forcing the use of the worker kthread for
>> zoned devices, and by modifying flush_worker_fn() to always flush all
>> delayed BIOs if the device may_delay boolean is false.
> 
> Is that scenario specific to dm-delay?  I think the same applies to
> any other target that supports passing on bios to zoned devices.

Don't think so. The delayed BIO list is a dm-delay thing only. dm-linear,
dm-error or dm-crypt do not delay BIOs like dm-delay so we do not have BIOs
being issued in the pre-suspend context.

> 
>>  	spin_lock(&dc->delayed_bios_lock);
>>  	if (unlikely(!dc->may_delay)) {
>> -		spin_unlock(&dc->delayed_bios_lock);
>> -		return DM_MAPIO_REMAPPED;
>> +		/*
>> +		 * Issue the BIO immediately if the device is not zoned. FOr a
>> +		 * zoned device, preserver the ordering of write operations by
>> +		 * using the delay list.
>> +		 */
>> +		if (!bdev_is_zoned(c->dev->bdev) || c != &dc->write) {
>> +			spin_unlock(&dc->delayed_bios_lock);
>> +			return DM_MAPIO_REMAPPED;
> 
> Don't we only need to do that if anything is queued up due to a
> suspension?  Then again having a different patch might be premature
> optimization, it's not like anyone cares about dm-delay performance
> almost by definition :)

True. I can add a list_empty check here. Will send a v2 with that.


-- 
Damien Le Moal
Western Digital Research




[Index of Archives]     [DM Crypt]     [Fedora Desktop]     [ATA RAID]     [Fedora Marketing]     [Fedora Packaging]     [Fedora SELinux]     [Yosemite Discussion]     [KDE Users]     [Fedora Docs]

  Powered by Linux