Re: [PATCHv2] sbitmap: fix batched wait_cnt accounting
From: Keith Busch <kbusch@kernel.org>
Date: 2022-08-25 13:06:21
On Thu, Aug 25, 2022 at 01:55:06PM +0200, Pankaj Raghav wrote:
On Thu, Aug 25, 2022 at 01:48:43PM +0200, Pankaj Raghav wrote:quoted
On Wed, Aug 24, 2022 at 01:14:40PM -0700, Keith Busch wrote:quoted
-static bool __sbq_wake_up(struct sbitmap_queue *sbq) +static bool __sbq_wake_up(struct sbitmap_queue *sbq, int *nr) { struct sbq_wait_state *ws; - unsigned int wake_batch; - int wait_cnt; + int wake_batch, wait_cnt, sub, cur; ws = sbq_wake_ptr(sbq); if (!ws) return false; - wait_cnt = atomic_dec_return(&ws->wait_cnt); + wake_batch = READ_ONCE(sbq->wake_batch); + do { + cur = atomic_read(&ws->wait_cnt);I think the above statement is not needed if we use atomic_try_cmpxchg as the old value is updated in that function itself. https://docs.kernel.org/staging/index.html?highlight=atomic_try_cmpxchg#atomic-typesI mean after moving the cur = atomic_read(..) above the do statement: wake_batch = READ_ONCE(sbq->wake_batch); cur = atomic_read(&ws->wait_cnt); do { sub = min3(wake_batch, *nr, cur); wait_cnt = cur - sub; } while (!atomic_try_cmpxchg(&ws->wait_cnt, &cur, wait_cnt));
Yeah, that's a good change. I'll fix it up.