/* * Just like DRM_WAIT_ON, but waits for the wakeup, rather than * polling at HZ/100 */ #define DRM_WAIT_ON_BLOCK( ret, queue, timeout, condition ) \ do { \ long _time_remaining = timeout; \ DECLARE_WAITQUEUE(entry, current); \ add_wait_queue(&(queue), &entry); \ \ for (;;) { \ __set_current_state(TASK_INTERRUPTIBLE); \ if (condition) \ break; \ if (_time_remaining <= 0) { \ ret = -EBUSY; \ break; \ } \ if (signal_pending(current)) { \ ret = -EINTR; \ break; \ } \ _time_remaining = schedule_timeout(_time_remaining); \ } \ remove_wait_queue(&(queue), &entry); \ __set_current_state(TASK_RUNNING); \ } while (0)