Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 41a1431b authored by Peter Zijlstra's avatar Peter Zijlstra Committed by Ingo Molnar
Browse files

sched/wait: Introduce ___wait_event()



There's far too much duplication in the __wait_event macros; in order
to fix this introduce ___wait_event() a macro with the capability to
replace most other macros.

With the previous patches changing the various __wait_event*()
implementations to be more uniform; we can now collapse the lot
without also changing generated code.

Reviewed-by: default avatarOleg Nesterov <oleg@redhat.com>
Signed-off-by: default avatarPeter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20131002092528.181897111@infradead.org


Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent bb632bc4
Loading
Loading
Loading
Loading
+36 −0
Original line number Diff line number Diff line
@@ -187,6 +187,42 @@ wait_queue_head_t *bit_waitqueue(void *, int);
 	__cond || !ret;							\
})

#define ___wait_signal_pending(state)					\
	((state == TASK_INTERRUPTIBLE && signal_pending(current)) ||	\
	 (state == TASK_KILLABLE && fatal_signal_pending(current)))

#define ___wait_nop_ret		int ret __always_unused

#define ___wait_event(wq, condition, state, exclusive, ret, cmd)	\
do {									\
	__label__ __out;						\
	DEFINE_WAIT(__wait);						\
									\
	for (;;) {							\
		if (exclusive)						\
			prepare_to_wait_exclusive(&wq, &__wait, state); \
		else							\
			prepare_to_wait(&wq, &__wait, state);		\
									\
		if (condition)						\
			break;						\
									\
		if (___wait_signal_pending(state)) {			\
			ret = -ERESTARTSYS;				\
			if (exclusive) {				\
				abort_exclusive_wait(&wq, &__wait, 	\
						     state, NULL); 	\
				goto __out;				\
			}						\
			break;						\
		}							\
									\
		cmd;							\
	}								\
	finish_wait(&wq, &__wait);					\
__out:	;								\
} while (0)

#define __wait_event(wq, condition) 					\
do {									\
	DEFINE_WAIT(__wait);						\