diff options
| author | Hui Su <sh_def@163.com> | 2026-10-11 10:50:19 +0900 |
|---|---|---|
| committer | Peter Zijlstra <peterz@infradead.org> | 2026-10-13 13:51:28 +0200 |
| commit | 159b172906110f736fdbd7af8a21d0e0b469f671 (patch) | |
| tree | 3d134a3d8c5268ff4e588c8b71f81ae13a22c6c5 /kernel | |
| parent | cc459ecd9388d96dc20404b157f5a4eedb66c355 (diff) | |
| download | linux-159b172906110f736fdbd7af8a21d0e0b469f671.tar.gz linux-159b172906110f736fdbd7af8a21d0e0b469f671.zip | |
sched/wait: Avoid modifying entry on failed priority registration
add_wait_queue_priority_exclusive() sets WQ_FLAG_EXCLUSIVE and
WQ_FLAG_PRIORITY before checking whether another priority waiter is
already present. Thus, when registration fails with -EBUSY, the entry
is left unqueued but with modified flags.
There is no need to modify the entry before the failure check. Move the
flag update after the check so that a rejected registration does not
unnecessarily alter the entry.
Signed-off-by: Hui Su <sh_def@163.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Sean Christopherson <seanjc@google.com>
Link: https://patch.msgid.link/20261011015019.4056529-1-sh_def@163.com
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/sched/wait.c | 3 |
1 files changed, 1 insertions, 2 deletions
diff --git a/kernel/sched/wait.c b/kernel/sched/wait.c index 477e4bf9c01e..f8d6d8b9d03e 100644 --- a/kernel/sched/wait.c +++ b/kernel/sched/wait.c @@ -54,14 +54,13 @@ int add_wait_queue_priority_exclusive(struct wait_queue_head *wq_head, { struct list_head *head = &wq_head->head; - wq_entry->flags |= WQ_FLAG_EXCLUSIVE | WQ_FLAG_PRIORITY; - guard(spinlock_irqsave)(&wq_head->lock); if (!list_empty(head) && (list_first_entry(head, typeof(*wq_entry), entry)->flags & WQ_FLAG_PRIORITY)) return -EBUSY; + wq_entry->flags |= WQ_FLAG_EXCLUSIVE | WQ_FLAG_PRIORITY; list_add(&wq_entry->entry, head); return 0; } |
