b24413180f560 (Greg Kroah-Hartman 2017-11-01 15:07:57 +0100 1) // SPDX-License-Identifier: GPL-2.0
0edaf86cf1a6a (Andrew Morton 2016-05-19 17:10:58 -0700 2) #include <linux/nodemask.h>
0edaf86cf1a6a (Andrew Morton 2016-05-19 17:10:58 -0700 3) #include <linux/module.h>
0edaf86cf1a6a (Andrew Morton 2016-05-19 17:10:58 -0700 4) #include <linux/random.h>
0edaf86cf1a6a (Andrew Morton 2016-05-19 17:10:58 -0700 5)
0edaf86cf1a6a (Andrew Morton 2016-05-19 17:10:58 -0700 6) int __next_node_in(int node, const nodemask_t *srcp)
0edaf86cf1a6a (Andrew Morton 2016-05-19 17:10:58 -0700 7) {
0edaf86cf1a6a (Andrew Morton 2016-05-19 17:10:58 -0700 8) int ret = __next_node(node, srcp);
0edaf86cf1a6a (Andrew Morton 2016-05-19 17:10:58 -0700 9)
0edaf86cf1a6a (Andrew Morton 2016-05-19 17:10:58 -0700 10) if (ret == MAX_NUMNODES)
0edaf86cf1a6a (Andrew Morton 2016-05-19 17:10:58 -0700 11) ret = __first_node(srcp);
0edaf86cf1a6a (Andrew Morton 2016-05-19 17:10:58 -0700 12) return ret;
0edaf86cf1a6a (Andrew Morton 2016-05-19 17:10:58 -0700 13) }
0edaf86cf1a6a (Andrew Morton 2016-05-19 17:10:58 -0700 14) EXPORT_SYMBOL(__next_node_in);
0edaf86cf1a6a (Andrew Morton 2016-05-19 17:10:58 -0700 15)
0edaf86cf1a6a (Andrew Morton 2016-05-19 17:10:58 -0700 16) #ifdef CONFIG_NUMA
0edaf86cf1a6a (Andrew Morton 2016-05-19 17:10:58 -0700 17) /*
0edaf86cf1a6a (Andrew Morton 2016-05-19 17:10:58 -0700 18) * Return the bit number of a random bit set in the nodemask.
0edaf86cf1a6a (Andrew Morton 2016-05-19 17:10:58 -0700 19) * (returns NUMA_NO_NODE if nodemask is empty)
0edaf86cf1a6a (Andrew Morton 2016-05-19 17:10:58 -0700 20) */
0edaf86cf1a6a (Andrew Morton 2016-05-19 17:10:58 -0700 21) int node_random(const nodemask_t *maskp)
0edaf86cf1a6a (Andrew Morton 2016-05-19 17:10:58 -0700 22) {
0edaf86cf1a6a (Andrew Morton 2016-05-19 17:10:58 -0700 23) int w, bit = NUMA_NO_NODE;
0edaf86cf1a6a (Andrew Morton 2016-05-19 17:10:58 -0700 24)
0edaf86cf1a6a (Andrew Morton 2016-05-19 17:10:58 -0700 25) w = nodes_weight(*maskp);
0edaf86cf1a6a (Andrew Morton 2016-05-19 17:10:58 -0700 26) if (w)
0edaf86cf1a6a (Andrew Morton 2016-05-19 17:10:58 -0700 27) bit = bitmap_ord_to_pos(maskp->bits,
0edaf86cf1a6a (Andrew Morton 2016-05-19 17:10:58 -0700 28) get_random_int() % w, MAX_NUMNODES);
0edaf86cf1a6a (Andrew Morton 2016-05-19 17:10:58 -0700 29) return bit;
0edaf86cf1a6a (Andrew Morton 2016-05-19 17:10:58 -0700 30) }
0edaf86cf1a6a (Andrew Morton 2016-05-19 17:10:58 -0700 31) #endif