diff options
author | David S. Miller <davem@davemloft.net> | 2015-06-02 01:33:25 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-06-02 01:51:30 -0400 |
commit | dda922c831d1661c11a3ae1051b7160236f6ffb0 (patch) | |
tree | 2fe588dbc4dc90addaabf303713fb2c6af0dc19b /lib | |
parent | db3397b9aa30d334be237170e048dcd96e1e951d (diff) | |
parent | c46a024ea5eb0165114dbbc8c82c29b7bcf66e71 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts:
drivers/net/phy/amd-xgbe-phy.c
drivers/net/wireless/iwlwifi/Kconfig
include/net/mac80211.h
iwlwifi/Kconfig and mac80211.h were both trivial overlapping
changes.
The drivers/net/phy/amd-xgbe-phy.c file got removed in 'net-next' and
the bug fix that happened on the 'net' side is already integrated
into the rest of the amd-xgbe driver.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/cpumask.c | 74 | ||||
-rw-r--r-- | lib/percpu_counter.c | 6 |
2 files changed, 29 insertions, 51 deletions
diff --git a/lib/cpumask.c b/lib/cpumask.c index 830dd5dec40f..5f627084f2e9 100644 --- a/lib/cpumask.c +++ b/lib/cpumask.c | |||
@@ -139,64 +139,42 @@ void __init free_bootmem_cpumask_var(cpumask_var_t mask) | |||
139 | #endif | 139 | #endif |
140 | 140 | ||
141 | /** | 141 | /** |
142 | * cpumask_set_cpu_local_first - set i'th cpu with local numa cpu's first | 142 | * cpumask_local_spread - select the i'th cpu with local numa cpu's first |
143 | * | ||
144 | * @i: index number | 143 | * @i: index number |
145 | * @numa_node: local numa_node | 144 | * @node: local numa_node |
146 | * @dstp: cpumask with the relevant cpu bit set according to the policy | ||
147 | * | 145 | * |
148 | * This function sets the cpumask according to a numa aware policy. | 146 | * This function selects an online CPU according to a numa aware policy; |
149 | * cpumask could be used as an affinity hint for the IRQ related to a | 147 | * local cpus are returned first, followed by non-local ones, then it |
150 | * queue. When the policy is to spread queues across cores - local cores | 148 | * wraps around. |
151 | * first. | ||
152 | * | 149 | * |
153 | * Returns 0 on success, -ENOMEM for no memory, and -EAGAIN when failed to set | 150 | * It's not very efficient, but useful for setup. |
154 | * the cpu bit and need to re-call the function. | ||
155 | */ | 151 | */ |
156 | int cpumask_set_cpu_local_first(int i, int numa_node, cpumask_t *dstp) | 152 | unsigned int cpumask_local_spread(unsigned int i, int node) |
157 | { | 153 | { |
158 | cpumask_var_t mask; | ||
159 | int cpu; | 154 | int cpu; |
160 | int ret = 0; | ||
161 | |||
162 | if (!zalloc_cpumask_var(&mask, GFP_KERNEL)) | ||
163 | return -ENOMEM; | ||
164 | 155 | ||
156 | /* Wrap: we always want a cpu. */ | ||
165 | i %= num_online_cpus(); | 157 | i %= num_online_cpus(); |
166 | 158 | ||
167 | if (numa_node == -1 || !cpumask_of_node(numa_node)) { | 159 | if (node == -1) { |
168 | /* Use all online cpu's for non numa aware system */ | 160 | for_each_cpu(cpu, cpu_online_mask) |
169 | cpumask_copy(mask, cpu_online_mask); | 161 | if (i-- == 0) |
162 | return cpu; | ||
170 | } else { | 163 | } else { |
171 | int n; | 164 | /* NUMA first. */ |
172 | 165 | for_each_cpu_and(cpu, cpumask_of_node(node), cpu_online_mask) | |
173 | cpumask_and(mask, | 166 | if (i-- == 0) |
174 | cpumask_of_node(numa_node), cpu_online_mask); | 167 | return cpu; |
175 | 168 | ||
176 | n = cpumask_weight(mask); | 169 | for_each_cpu(cpu, cpu_online_mask) { |
177 | if (i >= n) { | 170 | /* Skip NUMA nodes, done above. */ |
178 | i -= n; | 171 | if (cpumask_test_cpu(cpu, cpumask_of_node(node))) |
179 | 172 | continue; | |
180 | /* If index > number of local cpu's, mask out local | 173 | |
181 | * cpu's | 174 | if (i-- == 0) |
182 | */ | 175 | return cpu; |
183 | cpumask_andnot(mask, cpu_online_mask, mask); | ||
184 | } | 176 | } |
185 | } | 177 | } |
186 | 178 | BUG(); | |
187 | for_each_cpu(cpu, mask) { | ||
188 | if (--i < 0) | ||
189 | goto out; | ||
190 | } | ||
191 | |||
192 | ret = -EAGAIN; | ||
193 | |||
194 | out: | ||
195 | free_cpumask_var(mask); | ||
196 | |||
197 | if (!ret) | ||
198 | cpumask_set_cpu(cpu, dstp); | ||
199 | |||
200 | return ret; | ||
201 | } | 179 | } |
202 | EXPORT_SYMBOL(cpumask_set_cpu_local_first); | 180 | EXPORT_SYMBOL(cpumask_local_spread); |
diff --git a/lib/percpu_counter.c b/lib/percpu_counter.c index 48144cdae819..f051d69f0910 100644 --- a/lib/percpu_counter.c +++ b/lib/percpu_counter.c | |||
@@ -197,13 +197,13 @@ static int percpu_counter_hotcpu_callback(struct notifier_block *nb, | |||
197 | * Compare counter against given value. | 197 | * Compare counter against given value. |
198 | * Return 1 if greater, 0 if equal and -1 if less | 198 | * Return 1 if greater, 0 if equal and -1 if less |
199 | */ | 199 | */ |
200 | int percpu_counter_compare(struct percpu_counter *fbc, s64 rhs) | 200 | int __percpu_counter_compare(struct percpu_counter *fbc, s64 rhs, s32 batch) |
201 | { | 201 | { |
202 | s64 count; | 202 | s64 count; |
203 | 203 | ||
204 | count = percpu_counter_read(fbc); | 204 | count = percpu_counter_read(fbc); |
205 | /* Check to see if rough count will be sufficient for comparison */ | 205 | /* Check to see if rough count will be sufficient for comparison */ |
206 | if (abs(count - rhs) > (percpu_counter_batch*num_online_cpus())) { | 206 | if (abs(count - rhs) > (batch * num_online_cpus())) { |
207 | if (count > rhs) | 207 | if (count > rhs) |
208 | return 1; | 208 | return 1; |
209 | else | 209 | else |
@@ -218,7 +218,7 @@ int percpu_counter_compare(struct percpu_counter *fbc, s64 rhs) | |||
218 | else | 218 | else |
219 | return 0; | 219 | return 0; |
220 | } | 220 | } |
221 | EXPORT_SYMBOL(percpu_counter_compare); | 221 | EXPORT_SYMBOL(__percpu_counter_compare); |
222 | 222 | ||
223 | static int __init percpu_counter_startup(void) | 223 | static int __init percpu_counter_startup(void) |
224 | { | 224 | { |