|
@@ -811,6 +811,63 @@ do { \
|
|
|
__ret; \
|
|
|
})
|
|
|
|
|
|
+#define __wait_event_interruptible_lock_irq_timeout(wq, condition, \
|
|
|
+ lock, ret) \
|
|
|
+do { \
|
|
|
+ DEFINE_WAIT(__wait); \
|
|
|
+ \
|
|
|
+ for (;;) { \
|
|
|
+ prepare_to_wait(&wq, &__wait, TASK_INTERRUPTIBLE); \
|
|
|
+ if (condition) \
|
|
|
+ break; \
|
|
|
+ if (signal_pending(current)) { \
|
|
|
+ ret = -ERESTARTSYS; \
|
|
|
+ break; \
|
|
|
+ } \
|
|
|
+ spin_unlock_irq(&lock); \
|
|
|
+ ret = schedule_timeout(ret); \
|
|
|
+ spin_lock_irq(&lock); \
|
|
|
+ if (!ret) \
|
|
|
+ break; \
|
|
|
+ } \
|
|
|
+ finish_wait(&wq, &__wait); \
|
|
|
+} while (0)
|
|
|
+
|
|
|
+/**
|
|
|
+ * wait_event_interruptible_lock_irq_timeout - sleep until a condition gets true or a timeout elapses.
|
|
|
+ * The condition is checked under the lock. This is expected
|
|
|
+ * to be called with the lock taken.
|
|
|
+ * @wq: the waitqueue to wait on
|
|
|
+ * @condition: a C expression for the event to wait for
|
|
|
+ * @lock: a locked spinlock_t, which will be released before schedule()
|
|
|
+ * and reacquired afterwards.
|
|
|
+ * @timeout: timeout, in jiffies
|
|
|
+ *
|
|
|
+ * The process is put to sleep (TASK_INTERRUPTIBLE) until the
|
|
|
+ * @condition evaluates to true or signal is received. The @condition is
|
|
|
+ * checked each time the waitqueue @wq is woken up.
|
|
|
+ *
|
|
|
+ * wake_up() has to be called after changing any variable that could
|
|
|
+ * change the result of the wait condition.
|
|
|
+ *
|
|
|
+ * This is supposed to be called while holding the lock. The lock is
|
|
|
+ * dropped before going to sleep and is reacquired afterwards.
|
|
|
+ *
|
|
|
+ * The function returns 0 if the @timeout elapsed, -ERESTARTSYS if it
|
|
|
+ * was interrupted by a signal, and the remaining jiffies otherwise
|
|
|
+ * if the condition evaluated to true before the timeout elapsed.
|
|
|
+ */
|
|
|
+#define wait_event_interruptible_lock_irq_timeout(wq, condition, lock, \
|
|
|
+ timeout) \
|
|
|
+({ \
|
|
|
+ int __ret = timeout; \
|
|
|
+ \
|
|
|
+ if (!(condition)) \
|
|
|
+ __wait_event_interruptible_lock_irq_timeout( \
|
|
|
+ wq, condition, lock, __ret); \
|
|
|
+ __ret; \
|
|
|
+})
|
|
|
+
|
|
|
|
|
|
/*
|
|
|
* These are the old interfaces to sleep waiting for an event.
|