[Devel] [RFC PATCH vz9 v6 05/62] dm-ploop: remove unnecessary lock
Alexander Atanasov
alexander.atanasov at virtuozzo.com
Mon Jan 13 17:34:38 MSK 2025
On 9.01.25 5:24, Pavel Tikhomirov wrote:
>
>
> 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?
You are right, locks are reimplemented in later patches - both
md->lock and bat_lock are used. The idea to use only bitops didn't work.
>>
>>
>> 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,
>>
>
--
Regards,
Alexander Atanasov
More information about the Devel
mailing list