compat-3.16: Mask cpumask_set_cpu_local_first as RHEL7.1 backports this symbol
[compat-rdma/compat.git] / compat / compat-3.16.c
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>
7
8 /**
9  * cpumask_set_cpu_local_first - set i'th cpu with local numa cpu's first
10  *
11  * @i: index number
12  * @numa_node: local numa_node
13  * @dstp: cpumask with the relevant cpu bit set according to the policy
14  *
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
18  * first.
19  *
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.
22  */
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)
25 {
26         cpumask_var_t mask;
27         int cpu;
28         int ret = 0;
29
30         if (!zalloc_cpumask_var(&mask, GFP_KERNEL))
31                 return -ENOMEM;
32
33         i %= num_online_cpus();
34
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);
38         } else {
39                 int n;
40
41                 cpumask_and(mask,
42                             cpumask_of_node(numa_node), cpu_online_mask);
43
44                 n = cpumask_weight(mask);
45                 if (i >= n) {
46                         i -= n;
47
48                         /* If index > number of local cpu's, mask out local
49                          * cpu's
50                          */
51                         cpumask_andnot(mask, cpu_online_mask, mask);
52                 }
53         }
54
55         for_each_cpu(cpu, mask) {
56                 if (--i < 0)
57                         goto out;
58         }
59
60         ret = -EAGAIN;
61
62 out:
63         free_cpumask_var(mask);
64
65         if (!ret)
66                 cpumask_set_cpu(cpu, dstp);
67
68         return ret;
69 }
70 EXPORT_SYMBOL(cpumask_set_cpu_local_first);