Re: [PATCH -next RFC v2 8/8] sbitmap: wake up the number of threads based on required tags

From: Bart Van Assche
Date: Fri Apr 08 2022 - 17:13:10 EST


On 4/8/22 00:39, Yu Kuai wrote:
+static unsigned int get_wake_nr(struct sbq_wait_state *ws, unsigned int nr_tags)
+{
+ struct sbq_wait *wait;
+ struct wait_queue_entry *entry;
+ unsigned int nr = 1;
+
+ spin_lock_irq(&ws->wait.lock);
+ list_for_each_entry(entry, &ws->wait.head, entry) {
+ wait = container_of(entry, struct sbq_wait, wait);
+ if (nr_tags <= wait->nr_tags)
+ break;
+
+ nr++;
+ nr_tags -= wait->nr_tags;
+ }
+ spin_unlock_irq(&ws->wait.lock);
+
+ return nr;
+}
+
static bool __sbq_wake_up(struct sbitmap_queue *sbq)
{
struct sbq_wait_state *ws;
@@ -648,7 +668,7 @@ static bool __sbq_wake_up(struct sbitmap_queue *sbq)
smp_mb__before_atomic();
atomic_set(&ws->wait_cnt, wake_batch);
sbq_update_preemption(sbq, wake_batch);
- wake_up_nr(&ws->wait, wake_batch);
+ wake_up_nr(&ws->wait, get_wake_nr(ws, wake_batch));
return true;
}

An additional comment: my understanding is that __sbq_wake_up() should wake up exactly `wake_batch` waiters. The above patch changes that into waking up at most `wake_batch` waiters. I think that's wrong.

Bart.