1 #include <linux/slab.h>
2 #include <linux/kernel.h>
3 #include <linux/bitops.h>
4 #include <linux/cpumask.h>
5 #include <linux/export.h>
6 #include <linux/bootmem.h>
9 * cpumask_set_cpu_local_first - set i'th cpu with local numa cpu's first
12 * @numa_node: local numa_node
13 * @dstp: cpumask with the relevant cpu bit set according to the policy
15 * This function sets the cpumask according to a numa aware policy.
16 * cpumask could be used as an affinity hint for the IRQ related to a
17 * queue. When the policy is to spread queues across cores - local cores
20 * Returns 0 on success, -ENOMEM for no memory, and -EAGAIN when failed to set
21 * the cpu bit and need to re-call the function.
23 #define cpumask_set_cpu_local_first LINUX_BACKPORT(cpumask_set_cpu_local_first)
24 int cpumask_set_cpu_local_first(int i, int numa_node, cpumask_t *dstp)
30 if (!zalloc_cpumask_var(&mask, GFP_KERNEL))
33 i %= num_online_cpus();
35 if (numa_node == -1 || !cpumask_of_node(numa_node)) {
36 /* Use all online cpu's for non numa aware system */
37 cpumask_copy(mask, cpu_online_mask);
42 cpumask_of_node(numa_node), cpu_online_mask);
44 n = cpumask_weight(mask);
48 /* If index > number of local cpu's, mask out local
51 cpumask_andnot(mask, cpu_online_mask, mask);
55 for_each_cpu(cpu, mask) {
63 free_cpumask_var(mask);
66 cpumask_set_cpu(cpu, dstp);
70 EXPORT_SYMBOL(cpumask_set_cpu_local_first);