[Devel] [RFC PATCH vz9 v6 05/62] dm-ploop: remove unnecessary lock

Pavel Tikhomirov ptikhomirov at virtuozzo.com
Thu Jan 9 06:24:40 MSK 2025



On 1/9/25 11:17, Pavel Tikhomirov wrote:
> Why is lock unnecessary?
> 
> For instance what will happen if ploop_md_make_dirty and 
> ploop_make_md_wb are executed concurrently?
> 
> 
> Thread 1:                                  Thread 2:
> ploop_make_md_wb() {
>                                             ploop_md_make_dirty() {
> 
> WARN_ON_ONCE(test_bit(MD_WRITEBACK, &md->status));
>    set_bit(MD_WRITEBACK, &md->status);
>                                               if (! 
> test_and_set_bit(MD_DIRTY, &md->status)) ...
>                                             }
> }

Sorry for wrap destroying alignment... fixed version:

Thread 1:               Thread 2:
ploop_make_md_wb() {
                         ploop_md_make_dirty() {
                           WARN_ON_ONCE(test_bit(MD_WRITEBACK,
                                                 &md->status));
   set_bit(MD_WRITEBACK,
           &md->status);
                           if (!test_and_set_bit(MD_DIRTY,
                                                 &md->status)) ...
                         }
}

> 
> The warning will be false-negative.
> 
> In case we have concurrent ploop_advance_local_after_bat_wb and 
> ploop_make_md_wb, there can be a false-positive warning.
> 
> By the above I want to emphasize that in previous code with locks 
> everywhere, several operations with md->status in one block were 
> "together" atomic, and after switching to bit ops and removing lock we 
> only have atomicity for single operations, not for blocks of operations, 
> that can lead to any unexpected consequences.
> 
> I think we need semi-formal proof why all those changes with locks are 
> valid. And not just saying switching lock to atomic is ok without any 
> proof.
> 
> On 12/6/24 05:55, Alexander Atanasov wrote:
>> now proper bitops are used for status we do not need to lock.
>>
>> https://virtuozzo.atlassian.net/browse/VSTOR-91820
>> Signed-off-by: Alexander Atanasov <alexander.atanasov at virtuozzo.com>
>> ---
>>   drivers/md/dm-ploop-cmd.c | 2 --
>>   1 file changed, 2 deletions(-)
>>
>> diff --git a/drivers/md/dm-ploop-cmd.c b/drivers/md/dm-ploop-cmd.c
>> index 8bbb1680c579..61daaf8415c9 100644
>> --- a/drivers/md/dm-ploop-cmd.c
>> +++ b/drivers/md/dm-ploop-cmd.c
>> @@ -273,9 +273,7 @@ static int ploop_write_zero_cluster_sync(struct 
>> ploop *ploop,
>>   static void ploop_make_md_wb(struct ploop *ploop, struct md_page *md)
>>   {
>> -    write_lock_irq(&ploop->bat_rwlock);
>>       set_bit(MD_WRITEBACK, &md->status);
>> -    write_unlock_irq(&ploop->bat_rwlock);
>>   }
>>   static int ploop_grow_relocate_cluster(struct ploop *ploop,
> 

-- 
Best regards, Tikhomirov Pavel
Senior Software Developer, Virtuozzo.



More information about the Devel mailing list