xref: /openbmc/linux/kernel/sched/wait_bit.c (revision 8238b457)
1457c8996SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
2801c1419SIngo Molnar 
35dd43ce2SIngo Molnar /*
45dd43ce2SIngo Molnar  * The implementation of the wait_bit*() and related waiting APIs:
55dd43ce2SIngo Molnar  */
65822a454SIngo Molnar 
75822a454SIngo Molnar #define WAIT_TABLE_BITS 8
85822a454SIngo Molnar #define WAIT_TABLE_SIZE (1 << WAIT_TABLE_BITS)
95822a454SIngo Molnar 
105822a454SIngo Molnar static wait_queue_head_t bit_wait_table[WAIT_TABLE_SIZE] __cacheline_aligned;
115822a454SIngo Molnar 
bit_waitqueue(void * word,int bit)125822a454SIngo Molnar wait_queue_head_t *bit_waitqueue(void *word, int bit)
135822a454SIngo Molnar {
145822a454SIngo Molnar 	const int shift = BITS_PER_LONG == 32 ? 5 : 6;
155822a454SIngo Molnar 	unsigned long val = (unsigned long)word << shift | bit;
165822a454SIngo Molnar 
175822a454SIngo Molnar 	return bit_wait_table + hash_long(val, WAIT_TABLE_BITS);
185822a454SIngo Molnar }
195822a454SIngo Molnar EXPORT_SYMBOL(bit_waitqueue);
205dd43ce2SIngo Molnar 
wake_bit_function(struct wait_queue_entry * wq_entry,unsigned mode,int sync,void * arg)215dd43ce2SIngo Molnar int wake_bit_function(struct wait_queue_entry *wq_entry, unsigned mode, int sync, void *arg)
225dd43ce2SIngo Molnar {
235dd43ce2SIngo Molnar 	struct wait_bit_key *key = arg;
245dd43ce2SIngo Molnar 	struct wait_bit_queue_entry *wait_bit = container_of(wq_entry, struct wait_bit_queue_entry, wq_entry);
255dd43ce2SIngo Molnar 
265dd43ce2SIngo Molnar 	if (wait_bit->key.flags != key->flags ||
275dd43ce2SIngo Molnar 			wait_bit->key.bit_nr != key->bit_nr ||
285dd43ce2SIngo Molnar 			test_bit(key->bit_nr, key->flags))
295dd43ce2SIngo Molnar 		return 0;
3097fb7a0aSIngo Molnar 
315dd43ce2SIngo Molnar 	return autoremove_wake_function(wq_entry, mode, sync, key);
325dd43ce2SIngo Molnar }
335dd43ce2SIngo Molnar EXPORT_SYMBOL(wake_bit_function);
345dd43ce2SIngo Molnar 
355dd43ce2SIngo Molnar /*
365dd43ce2SIngo Molnar  * To allow interruptible waiting and asynchronous (i.e. nonblocking)
375dd43ce2SIngo Molnar  * waiting, the actions of __wait_on_bit() and __wait_on_bit_lock() are
385dd43ce2SIngo Molnar  * permitted return codes. Nonzero return codes halt waiting and return.
395dd43ce2SIngo Molnar  */
405dd43ce2SIngo Molnar int __sched
__wait_on_bit(struct wait_queue_head * wq_head,struct wait_bit_queue_entry * wbq_entry,wait_bit_action_f * action,unsigned mode)415dd43ce2SIngo Molnar __wait_on_bit(struct wait_queue_head *wq_head, struct wait_bit_queue_entry *wbq_entry,
425dd43ce2SIngo Molnar 	      wait_bit_action_f *action, unsigned mode)
435dd43ce2SIngo Molnar {
445dd43ce2SIngo Molnar 	int ret = 0;
455dd43ce2SIngo Molnar 
465dd43ce2SIngo Molnar 	do {
475dd43ce2SIngo Molnar 		prepare_to_wait(wq_head, &wbq_entry->wq_entry, mode);
485dd43ce2SIngo Molnar 		if (test_bit(wbq_entry->key.bit_nr, wbq_entry->key.flags))
495dd43ce2SIngo Molnar 			ret = (*action)(&wbq_entry->key, mode);
50*8238b457SMikulas Patocka 	} while (test_bit_acquire(wbq_entry->key.bit_nr, wbq_entry->key.flags) && !ret);
5197fb7a0aSIngo Molnar 
525dd43ce2SIngo Molnar 	finish_wait(wq_head, &wbq_entry->wq_entry);
5397fb7a0aSIngo Molnar 
545dd43ce2SIngo Molnar 	return ret;
555dd43ce2SIngo Molnar }
565dd43ce2SIngo Molnar EXPORT_SYMBOL(__wait_on_bit);
575dd43ce2SIngo Molnar 
out_of_line_wait_on_bit(void * word,int bit,wait_bit_action_f * action,unsigned mode)585dd43ce2SIngo Molnar int __sched out_of_line_wait_on_bit(void *word, int bit,
595dd43ce2SIngo Molnar 				    wait_bit_action_f *action, unsigned mode)
605dd43ce2SIngo Molnar {
615dd43ce2SIngo Molnar 	struct wait_queue_head *wq_head = bit_waitqueue(word, bit);
625dd43ce2SIngo Molnar 	DEFINE_WAIT_BIT(wq_entry, word, bit);
635dd43ce2SIngo Molnar 
645dd43ce2SIngo Molnar 	return __wait_on_bit(wq_head, &wq_entry, action, mode);
655dd43ce2SIngo Molnar }
665dd43ce2SIngo Molnar EXPORT_SYMBOL(out_of_line_wait_on_bit);
675dd43ce2SIngo Molnar 
out_of_line_wait_on_bit_timeout(void * word,int bit,wait_bit_action_f * action,unsigned mode,unsigned long timeout)685dd43ce2SIngo Molnar int __sched out_of_line_wait_on_bit_timeout(
695dd43ce2SIngo Molnar 	void *word, int bit, wait_bit_action_f *action,
705dd43ce2SIngo Molnar 	unsigned mode, unsigned long timeout)
715dd43ce2SIngo Molnar {
725dd43ce2SIngo Molnar 	struct wait_queue_head *wq_head = bit_waitqueue(word, bit);
735dd43ce2SIngo Molnar 	DEFINE_WAIT_BIT(wq_entry, word, bit);
745dd43ce2SIngo Molnar 
755dd43ce2SIngo Molnar 	wq_entry.key.timeout = jiffies + timeout;
7697fb7a0aSIngo Molnar 
775dd43ce2SIngo Molnar 	return __wait_on_bit(wq_head, &wq_entry, action, mode);
785dd43ce2SIngo Molnar }
795dd43ce2SIngo Molnar EXPORT_SYMBOL_GPL(out_of_line_wait_on_bit_timeout);
805dd43ce2SIngo Molnar 
815dd43ce2SIngo Molnar int __sched
__wait_on_bit_lock(struct wait_queue_head * wq_head,struct wait_bit_queue_entry * wbq_entry,wait_bit_action_f * action,unsigned mode)825dd43ce2SIngo Molnar __wait_on_bit_lock(struct wait_queue_head *wq_head, struct wait_bit_queue_entry *wbq_entry,
835dd43ce2SIngo Molnar 			wait_bit_action_f *action, unsigned mode)
845dd43ce2SIngo Molnar {
855dd43ce2SIngo Molnar 	int ret = 0;
865dd43ce2SIngo Molnar 
875dd43ce2SIngo Molnar 	for (;;) {
885dd43ce2SIngo Molnar 		prepare_to_wait_exclusive(wq_head, &wbq_entry->wq_entry, mode);
895dd43ce2SIngo Molnar 		if (test_bit(wbq_entry->key.bit_nr, wbq_entry->key.flags)) {
905dd43ce2SIngo Molnar 			ret = action(&wbq_entry->key, mode);
915dd43ce2SIngo Molnar 			/*
925dd43ce2SIngo Molnar 			 * See the comment in prepare_to_wait_event().
935dd43ce2SIngo Molnar 			 * finish_wait() does not necessarily takes wwq_head->lock,
945dd43ce2SIngo Molnar 			 * but test_and_set_bit() implies mb() which pairs with
955dd43ce2SIngo Molnar 			 * smp_mb__after_atomic() before wake_up_page().
965dd43ce2SIngo Molnar 			 */
975dd43ce2SIngo Molnar 			if (ret)
985dd43ce2SIngo Molnar 				finish_wait(wq_head, &wbq_entry->wq_entry);
995dd43ce2SIngo Molnar 		}
1005dd43ce2SIngo Molnar 		if (!test_and_set_bit(wbq_entry->key.bit_nr, wbq_entry->key.flags)) {
1015dd43ce2SIngo Molnar 			if (!ret)
1025dd43ce2SIngo Molnar 				finish_wait(wq_head, &wbq_entry->wq_entry);
1035dd43ce2SIngo Molnar 			return 0;
1045dd43ce2SIngo Molnar 		} else if (ret) {
1055dd43ce2SIngo Molnar 			return ret;
1065dd43ce2SIngo Molnar 		}
1075dd43ce2SIngo Molnar 	}
1085dd43ce2SIngo Molnar }
1095dd43ce2SIngo Molnar EXPORT_SYMBOL(__wait_on_bit_lock);
1105dd43ce2SIngo Molnar 
out_of_line_wait_on_bit_lock(void * word,int bit,wait_bit_action_f * action,unsigned mode)1115dd43ce2SIngo Molnar int __sched out_of_line_wait_on_bit_lock(void *word, int bit,
1125dd43ce2SIngo Molnar 					 wait_bit_action_f *action, unsigned mode)
1135dd43ce2SIngo Molnar {
1145dd43ce2SIngo Molnar 	struct wait_queue_head *wq_head = bit_waitqueue(word, bit);
1155dd43ce2SIngo Molnar 	DEFINE_WAIT_BIT(wq_entry, word, bit);
1165dd43ce2SIngo Molnar 
1175dd43ce2SIngo Molnar 	return __wait_on_bit_lock(wq_head, &wq_entry, action, mode);
1185dd43ce2SIngo Molnar }
1195dd43ce2SIngo Molnar EXPORT_SYMBOL(out_of_line_wait_on_bit_lock);
1205dd43ce2SIngo Molnar 
__wake_up_bit(struct wait_queue_head * wq_head,void * word,int bit)1215dd43ce2SIngo Molnar void __wake_up_bit(struct wait_queue_head *wq_head, void *word, int bit)
1225dd43ce2SIngo Molnar {
1235dd43ce2SIngo Molnar 	struct wait_bit_key key = __WAIT_BIT_KEY_INITIALIZER(word, bit);
12497fb7a0aSIngo Molnar 
1255dd43ce2SIngo Molnar 	if (waitqueue_active(wq_head))
1265dd43ce2SIngo Molnar 		__wake_up(wq_head, TASK_NORMAL, 1, &key);
1275dd43ce2SIngo Molnar }
1285dd43ce2SIngo Molnar EXPORT_SYMBOL(__wake_up_bit);
1295dd43ce2SIngo Molnar 
1305dd43ce2SIngo Molnar /**
1315dd43ce2SIngo Molnar  * wake_up_bit - wake up a waiter on a bit
1325dd43ce2SIngo Molnar  * @word: the word being waited on, a kernel virtual address
1335dd43ce2SIngo Molnar  * @bit: the bit of the word being waited on
1345dd43ce2SIngo Molnar  *
1355dd43ce2SIngo Molnar  * There is a standard hashed waitqueue table for generic use. This
1365dd43ce2SIngo Molnar  * is the part of the hashtable's accessor API that wakes up waiters
1375dd43ce2SIngo Molnar  * on a bit. For instance, if one were to have waiters on a bitflag,
1385dd43ce2SIngo Molnar  * one would call wake_up_bit() after clearing the bit.
1395dd43ce2SIngo Molnar  *
1405dd43ce2SIngo Molnar  * In order for this to function properly, as it uses waitqueue_active()
1415dd43ce2SIngo Molnar  * internally, some kind of memory barrier must be done prior to calling
1425dd43ce2SIngo Molnar  * this. Typically, this will be smp_mb__after_atomic(), but in some
1435dd43ce2SIngo Molnar  * cases where bitflags are manipulated non-atomically under a lock, one
1445dd43ce2SIngo Molnar  * may need to use a less regular barrier, such fs/inode.c's smp_mb(),
1455dd43ce2SIngo Molnar  * because spin_unlock() does not guarantee a memory barrier.
1465dd43ce2SIngo Molnar  */
wake_up_bit(void * word,int bit)1475dd43ce2SIngo Molnar void wake_up_bit(void *word, int bit)
1485dd43ce2SIngo Molnar {
1495dd43ce2SIngo Molnar 	__wake_up_bit(bit_waitqueue(word, bit), word, bit);
1505dd43ce2SIngo Molnar }
1515dd43ce2SIngo Molnar EXPORT_SYMBOL(wake_up_bit);
1525dd43ce2SIngo Molnar 
__var_waitqueue(void * p)1536b2bb726SPeter Zijlstra wait_queue_head_t *__var_waitqueue(void *p)
1546b2bb726SPeter Zijlstra {
155b3fc5c9bSPeter Zijlstra 	return bit_wait_table + hash_ptr(p, WAIT_TABLE_BITS);
1566b2bb726SPeter Zijlstra }
1576b2bb726SPeter Zijlstra EXPORT_SYMBOL(__var_waitqueue);
1586b2bb726SPeter Zijlstra 
1596b2bb726SPeter Zijlstra static int
var_wake_function(struct wait_queue_entry * wq_entry,unsigned int mode,int sync,void * arg)1606b2bb726SPeter Zijlstra var_wake_function(struct wait_queue_entry *wq_entry, unsigned int mode,
1616b2bb726SPeter Zijlstra 		  int sync, void *arg)
1626b2bb726SPeter Zijlstra {
1636b2bb726SPeter Zijlstra 	struct wait_bit_key *key = arg;
1646b2bb726SPeter Zijlstra 	struct wait_bit_queue_entry *wbq_entry =
1656b2bb726SPeter Zijlstra 		container_of(wq_entry, struct wait_bit_queue_entry, wq_entry);
1666b2bb726SPeter Zijlstra 
1676b2bb726SPeter Zijlstra 	if (wbq_entry->key.flags != key->flags ||
1686b2bb726SPeter Zijlstra 	    wbq_entry->key.bit_nr != key->bit_nr)
1696b2bb726SPeter Zijlstra 		return 0;
1706b2bb726SPeter Zijlstra 
1716b2bb726SPeter Zijlstra 	return autoremove_wake_function(wq_entry, mode, sync, key);
1726b2bb726SPeter Zijlstra }
1736b2bb726SPeter Zijlstra 
init_wait_var_entry(struct wait_bit_queue_entry * wbq_entry,void * var,int flags)1746b2bb726SPeter Zijlstra void init_wait_var_entry(struct wait_bit_queue_entry *wbq_entry, void *var, int flags)
1756b2bb726SPeter Zijlstra {
1766b2bb726SPeter Zijlstra 	*wbq_entry = (struct wait_bit_queue_entry){
1776b2bb726SPeter Zijlstra 		.key = {
1786b2bb726SPeter Zijlstra 			.flags	= (var),
1796b2bb726SPeter Zijlstra 			.bit_nr = -1,
1806b2bb726SPeter Zijlstra 		},
1816b2bb726SPeter Zijlstra 		.wq_entry = {
182cde65194SOleg Nesterov 			.flags	 = flags,
1836b2bb726SPeter Zijlstra 			.private = current,
1846b2bb726SPeter Zijlstra 			.func	 = var_wake_function,
1856b2bb726SPeter Zijlstra 			.entry	 = LIST_HEAD_INIT(wbq_entry->wq_entry.entry),
1866b2bb726SPeter Zijlstra 		},
1876b2bb726SPeter Zijlstra 	};
1886b2bb726SPeter Zijlstra }
1896b2bb726SPeter Zijlstra EXPORT_SYMBOL(init_wait_var_entry);
1906b2bb726SPeter Zijlstra 
wake_up_var(void * var)1916b2bb726SPeter Zijlstra void wake_up_var(void *var)
1926b2bb726SPeter Zijlstra {
1936b2bb726SPeter Zijlstra 	__wake_up_bit(__var_waitqueue(var), var, -1);
1946b2bb726SPeter Zijlstra }
1956b2bb726SPeter Zijlstra EXPORT_SYMBOL(wake_up_var);
1966b2bb726SPeter Zijlstra 
bit_wait(struct wait_bit_key * word,int mode)1975dd43ce2SIngo Molnar __sched int bit_wait(struct wait_bit_key *word, int mode)
1985dd43ce2SIngo Molnar {
1995dd43ce2SIngo Molnar 	schedule();
2005dd43ce2SIngo Molnar 	if (signal_pending_state(mode, current))
2015dd43ce2SIngo Molnar 		return -EINTR;
20297fb7a0aSIngo Molnar 
2035dd43ce2SIngo Molnar 	return 0;
2045dd43ce2SIngo Molnar }
2055dd43ce2SIngo Molnar EXPORT_SYMBOL(bit_wait);
2065dd43ce2SIngo Molnar 
bit_wait_io(struct wait_bit_key * word,int mode)2075dd43ce2SIngo Molnar __sched int bit_wait_io(struct wait_bit_key *word, int mode)
2085dd43ce2SIngo Molnar {
2095dd43ce2SIngo Molnar 	io_schedule();
2105dd43ce2SIngo Molnar 	if (signal_pending_state(mode, current))
2115dd43ce2SIngo Molnar 		return -EINTR;
21297fb7a0aSIngo Molnar 
2135dd43ce2SIngo Molnar 	return 0;
2145dd43ce2SIngo Molnar }
2155dd43ce2SIngo Molnar EXPORT_SYMBOL(bit_wait_io);
2165dd43ce2SIngo Molnar 
bit_wait_timeout(struct wait_bit_key * word,int mode)2175dd43ce2SIngo Molnar __sched int bit_wait_timeout(struct wait_bit_key *word, int mode)
2185dd43ce2SIngo Molnar {
2195dd43ce2SIngo Molnar 	unsigned long now = READ_ONCE(jiffies);
22097fb7a0aSIngo Molnar 
2215dd43ce2SIngo Molnar 	if (time_after_eq(now, word->timeout))
2225dd43ce2SIngo Molnar 		return -EAGAIN;
2235dd43ce2SIngo Molnar 	schedule_timeout(word->timeout - now);
2245dd43ce2SIngo Molnar 	if (signal_pending_state(mode, current))
2255dd43ce2SIngo Molnar 		return -EINTR;
22697fb7a0aSIngo Molnar 
2275dd43ce2SIngo Molnar 	return 0;
2285dd43ce2SIngo Molnar }
2295dd43ce2SIngo Molnar EXPORT_SYMBOL_GPL(bit_wait_timeout);
2305dd43ce2SIngo Molnar 
bit_wait_io_timeout(struct wait_bit_key * word,int mode)2315dd43ce2SIngo Molnar __sched int bit_wait_io_timeout(struct wait_bit_key *word, int mode)
2325dd43ce2SIngo Molnar {
2335dd43ce2SIngo Molnar 	unsigned long now = READ_ONCE(jiffies);
23497fb7a0aSIngo Molnar 
2355dd43ce2SIngo Molnar 	if (time_after_eq(now, word->timeout))
2365dd43ce2SIngo Molnar 		return -EAGAIN;
2375dd43ce2SIngo Molnar 	io_schedule_timeout(word->timeout - now);
2385dd43ce2SIngo Molnar 	if (signal_pending_state(mode, current))
2395dd43ce2SIngo Molnar 		return -EINTR;
24097fb7a0aSIngo Molnar 
2415dd43ce2SIngo Molnar 	return 0;
2425dd43ce2SIngo Molnar }
2435dd43ce2SIngo Molnar EXPORT_SYMBOL_GPL(bit_wait_io_timeout);
2445822a454SIngo Molnar 
wait_bit_init(void)2455822a454SIngo Molnar void __init wait_bit_init(void)
2465822a454SIngo Molnar {
2475822a454SIngo Molnar 	int i;
2485822a454SIngo Molnar 
2495822a454SIngo Molnar 	for (i = 0; i < WAIT_TABLE_SIZE; i++)
2505822a454SIngo Molnar 		init_waitqueue_head(bit_wait_table + i);
2515822a454SIngo Molnar }
252