Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux...
[cascardo/linux.git] / kernel / sched / wait.c
index 15cab1a..5a62915 100644 (file)
@@ -343,6 +343,18 @@ int __sched out_of_line_wait_on_bit(void *word, int bit,
 }
 EXPORT_SYMBOL(out_of_line_wait_on_bit);
 
+int __sched out_of_line_wait_on_bit_timeout(
+       void *word, int bit, wait_bit_action_f *action,
+       unsigned mode, unsigned long timeout)
+{
+       wait_queue_head_t *wq = bit_waitqueue(word, bit);
+       DEFINE_WAIT_BIT(wait, word, bit);
+
+       wait.key.timeout = jiffies + timeout;
+       return __wait_on_bit(wq, &wait, action, mode);
+}
+EXPORT_SYMBOL_GPL(out_of_line_wait_on_bit_timeout);
+
 int __sched
 __wait_on_bit_lock(wait_queue_head_t *wq, struct wait_bit_queue *q,
                        wait_bit_action_f *action, unsigned mode)
@@ -520,3 +532,27 @@ __sched int bit_wait_io(struct wait_bit_key *word)
        return 0;
 }
 EXPORT_SYMBOL(bit_wait_io);
+
+__sched int bit_wait_timeout(struct wait_bit_key *word)
+{
+       unsigned long now = ACCESS_ONCE(jiffies);
+       if (signal_pending_state(current->state, current))
+               return 1;
+       if (time_after_eq(now, word->timeout))
+               return -EAGAIN;
+       schedule_timeout(word->timeout - now);
+       return 0;
+}
+EXPORT_SYMBOL_GPL(bit_wait_timeout);
+
+__sched int bit_wait_io_timeout(struct wait_bit_key *word)
+{
+       unsigned long now = ACCESS_ONCE(jiffies);
+       if (signal_pending_state(current->state, current))
+               return 1;
+       if (time_after_eq(now, word->timeout))
+               return -EAGAIN;
+       io_schedule_timeout(word->timeout - now);
+       return 0;
+}
+EXPORT_SYMBOL_GPL(bit_wait_io_timeout);