Re: [PATCH 06/12] sched/wait: Add a waitqueue helper for fully exclusive priority waiters

From: K Prateek Nayak
Date: Wed Apr 02 2025 - 14:41:13 EST


Hello Sean,

On 4/2/2025 2:14 AM, Sean Christopherson wrote:
[..snip..]
diff --git a/kernel/sched/wait.c b/kernel/sched/wait.c
index 51e38f5f4701..80d90d1dc24d 100644
--- a/kernel/sched/wait.c
+++ b/kernel/sched/wait.c
@@ -47,6 +47,26 @@ void add_wait_queue_priority(struct wait_queue_head *wq_head, struct wait_queue_
}
EXPORT_SYMBOL_GPL(add_wait_queue_priority);
+int add_wait_queue_priority_exclusive(struct wait_queue_head *wq_head,
+ struct wait_queue_entry *wq_entry)
+{
+ struct list_head *head = &wq_head->head;
+ unsigned long flags;
+ int r = 0;
+
+ wq_entry->flags |= WQ_FLAG_EXCLUSIVE | WQ_FLAG_PRIORITY;
+ spin_lock_irqsave(&wq_head->lock, flags);

nit.

Using "guard(spinlock_irqsave)(&wq_head->lock)" can help you get rid of
both "flags" and "r".

+ if (!list_empty(head) &&
+ (list_first_entry(head, typeof(*wq_entry), entry)->flags & WQ_FLAG_PRIORITY))
+ r = -EBUSY;
+ else
+ list_add(&wq_entry->entry, head);
+ spin_unlock_irqrestore(&wq_head->lock, flags);
+
+ return r;
+}
+EXPORT_SYMBOL(add_wait_queue_priority_exclusive);
+
void remove_wait_queue(struct wait_queue_head *wq_head, struct wait_queue_entry *wq_entry)
{
unsigned long flags;

--
Thanks and Regards,
Prateek