sched/wait: Introduce init_wait_entry()
authorOleg Nesterov <[email protected]>
Tue, 6 Sep 2016 14:00:55 +0000 (16:00 +0200)
committerIngo Molnar <[email protected]>
Fri, 30 Sep 2016 08:54:03 +0000 (10:54 +0200)
The partial initialization of wait_queue_t in prepare_to_wait_event() looks
ugly. This was done to shrink .text, but we can simply add the new helper
which does the full initialization and shrink the compiled code a bit more.

And. This way prepare_to_wait_event() can have more users. In particular we
are ready to remove the signal_pending_state() checks from wait_bit_action_f
helpers and change __wait_on_bit_lock() to use prepare_to_wait_event().

Signed-off-by: Oleg Nesterov <[email protected]>
Signed-off-by: Peter Zijlstra (Intel) <[email protected]>
Cc: Al Viro <[email protected]>
Cc: Bart Van Assche <[email protected]>
Cc: Johannes Weiner <[email protected]>
Cc: Linus Torvalds <[email protected]>
Cc: Mike Galbraith <[email protected]>
Cc: Neil Brown <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Ingo Molnar <[email protected]>
include/linux/wait.h
kernel/sched/wait.c

index 19c75f9545cef5f2e56ce9fa8ebd9ac9ceeaffc4..2408e8d5c05ccbfc50713416f0473a478fa26bc4 100644 (file)
@@ -248,6 +248,8 @@ wait_queue_head_t *bit_waitqueue(void *, int);
        (!__builtin_constant_p(state) ||                                \
                state == TASK_INTERRUPTIBLE || state == TASK_KILLABLE)  \
 
+extern void init_wait_entry(wait_queue_t *__wait, int flags);
+
 /*
  * The below macro ___wait_event() has an explicit shadow of the __ret
  * variable when used from the wait_event_*() macros.
@@ -266,12 +268,7 @@ wait_queue_head_t *bit_waitqueue(void *, int);
        wait_queue_t __wait;                                            \
        long __ret = ret;       /* explicit shadow */                   \
                                                                        \
-       INIT_LIST_HEAD(&__wait.task_list);                              \
-       if (exclusive)                                                  \
-               __wait.flags = WQ_FLAG_EXCLUSIVE;                       \
-       else                                                            \
-               __wait.flags = 0;                                       \
-                                                                       \
+       init_wait_entry(&__wait, exclusive ? WQ_FLAG_EXCLUSIVE : 0);    \
        for (;;) {                                                      \
                long __int = prepare_to_wait_event(&wq, &__wait, state);\
                                                                        \
index 0cb615d6901357412e0d40fa12d42470a84da87b..4f7053579fe3c9e473bfb9854f959a874e9566ea 100644 (file)
@@ -196,14 +196,20 @@ prepare_to_wait_exclusive(wait_queue_head_t *q, wait_queue_t *wait, int state)
 }
 EXPORT_SYMBOL(prepare_to_wait_exclusive);
 
+void init_wait_entry(wait_queue_t *wait, int flags)
+{
+       wait->flags = flags;
+       wait->private = current;
+       wait->func = autoremove_wake_function;
+       INIT_LIST_HEAD(&wait->task_list);
+}
+EXPORT_SYMBOL(init_wait_entry);
+
 long prepare_to_wait_event(wait_queue_head_t *q, wait_queue_t *wait, int state)
 {
        unsigned long flags;
        long ret = 0;
 
-       wait->private = current;
-       wait->func = autoremove_wake_function;
-
        spin_lock_irqsave(&q->lock, flags);
        if (unlikely(signal_pending_state(state, current))) {
                /*