Re: [PATCH v6] sbitmap: fix io hung due to race on sbitmap_word::cleared

From: Ming Lei
Date: Thu Jul 11 2024 - 09:39:47 EST


On Thu, Jul 11, 2024 at 08:48:03PM +0800, YangYang wrote:
> On 2024/7/11 3:54, Bart Van Assche wrote:
> > On 7/9/24 11:56 PM, Yang Yang wrote:
> > > +    /**
> > > +     * @swap_lock: Held while swapping word <-> cleared
> > > +     */
> > > +    spinlock_t swap_lock;
> >
> > Why is only swapping 'word' with 'cleared' protected by the spinlock?
> > If all 'cleared' changes would be protected by this spinlock then
> > that would allow to eliminate the expensive xchg() call from
> > sbitmap_deferred_clear().
>
> The spinlock was initially introduced in ea86ea2cdced ("sbitmap:
> ammortize cost of clearing bits").
> I think if all 'cleared' changes are protected by the spinlock, the
> overhead of clearing tags would definitely increase.

There are only two WRITE on 'cleared':

- xchg(&map->cleared, 0) in sbitmap_deferred_clear()

- set_bit() in sbitmap_deferred_clear_bit()

xchg() supposes to provide such protection already.

Thanks,
Ming