18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci#include <linux/nodemask.h>
38c2ecf20Sopenharmony_ci#include <linux/module.h>
48c2ecf20Sopenharmony_ci#include <linux/random.h>
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ciunsigned int __next_node_in(int node, const nodemask_t *srcp)
78c2ecf20Sopenharmony_ci{
88c2ecf20Sopenharmony_ci	unsigned int ret = __next_node(node, srcp);
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci	if (ret == MAX_NUMNODES)
118c2ecf20Sopenharmony_ci		ret = __first_node(srcp);
128c2ecf20Sopenharmony_ci	return ret;
138c2ecf20Sopenharmony_ci}
148c2ecf20Sopenharmony_ciEXPORT_SYMBOL(__next_node_in);
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci#ifdef CONFIG_NUMA
178c2ecf20Sopenharmony_ci/*
188c2ecf20Sopenharmony_ci * Return the bit number of a random bit set in the nodemask.
198c2ecf20Sopenharmony_ci * (returns NUMA_NO_NODE if nodemask is empty)
208c2ecf20Sopenharmony_ci */
218c2ecf20Sopenharmony_ciint node_random(const nodemask_t *maskp)
228c2ecf20Sopenharmony_ci{
238c2ecf20Sopenharmony_ci	int w, bit = NUMA_NO_NODE;
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ci	w = nodes_weight(*maskp);
268c2ecf20Sopenharmony_ci	if (w)
278c2ecf20Sopenharmony_ci		bit = bitmap_ord_to_pos(maskp->bits,
288c2ecf20Sopenharmony_ci			get_random_int() % w, MAX_NUMNODES);
298c2ecf20Sopenharmony_ci	return bit;
308c2ecf20Sopenharmony_ci}
318c2ecf20Sopenharmony_ci#endif
32