Placing yourself in the waitqueue is fairly complex, because you must put yourself in the queue before checking the condition. There is a macro to do this: wait_event_interruptible() include/linux/wait.h The first argument is the wait queue head, and the second is an expression which is evaluated; the macro returns 0 when this expression is true, or -ERESTARTSYS if a signal is received. The wait_event() version ignores signals.

Do not use the sleep_on() function family - it is very easy to accidentally introduce races; almost certainly one of the wait_event() family will do, or a loop around schedule_timeout(). If you choose to loop around schedule_timeout() remember you must set the task state (with set_current_state()) on each iteration to avoid busy-looping.