Hi ,
__wait_event_interruptible  is defined in include/linux/wait.h as :
#define __wait_event_interruptible(wq, condition, ret)                  \
do {                                                                    \
        DEFINE_WAIT(__wait);                                            \
                                                                        \
        for (;;) {                                                      \
                prepare_to_wait(&wq, &__wait, TASK_INTERRUPTIBLE);      \
                if (condition)                                          \
                        break;                                          \
                if (!signal_pending(current)) {                         \
                        schedule();                                     \
                        continue;                                       \
                }                                                       \
                ret = -ERESTARTSYS;                                     \
                break;                                                  \
        }                                                               \
        finish_wait(&wq, &__wait);                                      \
} while (0)
here , can  i be guided why in every for loop iteration , we need to
call prepare_to_wait ?
instead why not prepare_to_wait() be used once only like finish_wait()
above and after schedule() call returns ,
set the current state = TASK_INTERRUPTIBLE (before continue statement
) something like below :
#define __wait_event_interruptible(wq, condition, ret)                  \
do {                                                                    \
        DEFINE_WAIT(__wait);                                            \
        prepare_to_wait(&wq, &__wait, TASK_INTERRUPTIBLE);      	\
                                                                        \
        for (;;) {                                                      \
                if (condition)                                          \
                        break;                                          \
                if (!signal_pending(current)) {                         \
                        schedule();                                     \
	        set_current_state(TASK_INTERRUPTIBLE)		\
                        continue;                                       \
                }                                                       \
                ret = -ERESTARTSYS;                                     \
                break;                                                  \
        }                                                               \
        finish_wait(&wq, &__wait);                                      \
} while (0)
kindly share facts related to above .
Regards
Amit Nagal