summaryrefslogtreecommitdiffstats
path: root/lib/nodemask.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/nodemask.c')
-rw-r--r--lib/nodemask.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/lib/nodemask.c b/lib/nodemask.c
new file mode 100644
index 000000000..e22647f51
--- /dev/null
+++ b/lib/nodemask.c
@@ -0,0 +1,31 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <linux/nodemask.h>
+#include <linux/module.h>
+#include <linux/random.h>
+
+unsigned int __next_node_in(int node, const nodemask_t *srcp)
+{
+ unsigned int ret = __next_node(node, srcp);
+
+ if (ret == MAX_NUMNODES)
+ ret = __first_node(srcp);
+ return ret;
+}
+EXPORT_SYMBOL(__next_node_in);
+
+#ifdef CONFIG_NUMA
+/*
+ * Return the bit number of a random bit set in the nodemask.
+ * (returns NUMA_NO_NODE if nodemask is empty)
+ */
+int node_random(const nodemask_t *maskp)
+{
+ int w, bit = NUMA_NO_NODE;
+
+ w = nodes_weight(*maskp);
+ if (w)
+ bit = bitmap_ord_to_pos(maskp->bits,
+ get_random_int() % w, MAX_NUMNODES);
+ return bit;
+}
+#endif