From 6853dd806f7766067050652757596a678dd847e7 Mon Sep 17 00:00:00 2001 From: Josef Bacik Date: Mon, 16 Sep 2019 17:20:45 +0800 Subject: [PATCH] wait: add wq_has_single_sleeper helper mainline inclusion from mainline-5.3-rc2 commit a6d81d30d3cd87f85bfd922358eb18b8146c4925 category: bugfix bugzilla: 21211 CVE: NA --------------------------- rq-qos sits in the io path so we want to take locks as sparingly as possible. To accomplish this we try not to take the waitqueue head lock unless we are sure we need to go to sleep, and we have an optimization to make sure that we don't starve out existing waiters. Since we check if there are existing waiters locklessly we need to be able to update our view of the waitqueue list after we've added ourselves to the waitqueue. Accomplish this by adding this helper to see if there is more than just ourselves on the list. Reviewed-by: Oleg Nesterov Signed-off-by: Josef Bacik Signed-off-by: Jens Axboe Signed-off-by: Jason Yan Reviewed-by: Yufen Yu Signed-off-by: Yang Yingliang --- include/linux/wait.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/include/linux/wait.h b/include/linux/wait.h index ed7c122cb31f..29d28c2084ce 100644 --- a/include/linux/wait.h +++ b/include/linux/wait.h @@ -126,6 +126,19 @@ static inline int waitqueue_active(struct wait_queue_head *wq_head) return !list_empty(&wq_head->head); } +/** + * wq_has_single_sleeper - check if there is only one sleeper + * @wq_head: wait queue head + * + * Returns true of wq_head has only one sleeper on the list. + * + * Please refer to the comment for waitqueue_active. + */ +static inline bool wq_has_single_sleeper(struct wait_queue_head *wq_head) +{ + return list_is_singular(&wq_head->head); +} + /** * wq_has_sleeper - check if there are any waiting processes * @wq_head: wait queue head -- GitLab