|
@@ -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);
|