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

From: yukuai (C)
Date: Fri Apr 08 2022 - 22:17:44 EST


在 2022/04/09 5:13, Bart Van Assche 写道:
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.
Hi,

I think the reason to wake up 'wake_batch' waiters is to make sure
wakers will use up 'wake_batch' tags that is just freed, because each
wakers should aquire at least one tag. Thus I think if we can make sure
wakers will use up 'wake_batch' tags, it's ok to wake up less waiters.

Please kindly correct me if I'm wrong.

Thanks,
Kuai

Bart.
.