On Wed, Jan 12, 2022 at 08:37:34AM -0700, Jens Axboe wrote: > On 1/12/22 7:38 AM, Andy Shevchenko wrote: > > On Wed, Jan 12, 2022 at 12:51:13PM +0000, John Garry wrote: > >> On 12/01/2022 12:30, Andy Shevchenko wrote: > >>>>>> + if (test_bit(QUEUE_FLAG_HCTX_ACTIVE, &q->queue_flags) || > >>>>>> + test_and_set_bit(QUEUE_FLAG_HCTX_ACTIVE, &q->queue_flags)) { > >>>>> Whoever wrote this code did too much defensive programming, because the first > >>>>> conditional doesn't make much sense here. Am I right? > >>>>> > >>>> I think because this judgement is in the general IO process, there are also > >>>> some performance considerations here. > >>> I didn't buy this. Is there any better argument why you need redundant > >>> test_bit() call? > >> > >> I think that the idea is that test_bit() is fast and test_and_set_bit() is > >> slow; as such, if we generally expect the bit to be set, then there is no > >> need to do the slower test_and_set_bit() always. > > > > It doesn't sound thought through solution, the bit can be flipped in > > between, so what is this all about? Maybe missing proper serialization > > somewhere else? > > You need to work on your communication a bit - if there's a piece of > code you don't understand, maybe try being a bit less aggressive about > it? Otherwise people tend to just ignore you rather than explain it. Sure. Thanks for below explanations, btw. > test_bit() is a lot faster than a test_and_set_bit(), and there's no > need to run the latter if the former returns true. This is a pretty > common optimization, particularly if the majority of the calls end up > having the bit set already. I don't see how it may give optimization here generally speaking. If we know that bit is _often_ is set, than of course it sounds like opportunistic win. Otherwise, it may have the opposite effect. I.o.w. without knowing the statistics of the bit being set/clear it's hard to say if it's optimization or waste of the (CPU) resources. > Can the bit be flipped right after? Certainly! Can that happen if just > test_and_set_bit() is used? Of course! This isn't a critical section > with a lock, it's a piece of state. And guarding the RMW operation with > a test first doesn't change that one bit. -- With Best Regards, Andy Shevchenko