Lines Matching +full:interrupt +full:- +full:affinity
1 // SPDX-License-Identifier: GPL-2.0
4 * Copyright (C) 2016-2017 Christoph Hellwig.
6 #include <linux/interrupt.h>
27 cpus_per_vec--; in irq_spread_init_one()
31 for (sibl = -1; cpus_per_vec > 0; ) { in irq_spread_init_one()
38 cpus_per_vec--; in irq_spread_init_one()
60 while (--node >= 0) in alloc_node_to_cpumask()
88 /* Calculate the number of nodes in the supplied affinity mask */ in get_nodes_in_cpumask()
112 return ln->ncpus - rn->ncpus; in ncpus_cmp_func()
161 * node's nr_cpus to remaining un-assigned ncpus. 'numvecs' is in alloc_nodes_vectors()
166 * least one vector, and the theory is simple: over-allocation in alloc_nodes_vectors()
184 * vecs(B) = V - vecs(A) in alloc_nodes_vectors()
187 * V = N - delta, and 0 <= delta <= N - 2 in alloc_nodes_vectors()
200 * over-allocated, so vecs(B) <= ncpu(B), in alloc_nodes_vectors()
206 * round_down((N - delta) * ncpu(A) / N) = in alloc_nodes_vectors()
207 * round_down((N * ncpu(A) - delta * ncpu(A)) / N) >= in alloc_nodes_vectors()
208 * round_down((N * ncpu(A) - delta * N) / N) = in alloc_nodes_vectors()
209 * cpu(A) - delta in alloc_nodes_vectors()
213 * vecs(A) - V >= ncpu(A) - delta - V in alloc_nodes_vectors()
215 * V - vecs(A) <= V + delta - ncpu(A) in alloc_nodes_vectors()
217 * vecs(B) <= N - ncpu(A) in alloc_nodes_vectors()
223 * and we always re-calculate 'remaining_ncpus' & 'numvecs', and in alloc_nodes_vectors()
242 remaining_ncpus -= ncpus; in alloc_nodes_vectors()
243 numvecs -= nvectors; in alloc_nodes_vectors()
284 return -ENOMEM; in __irq_build_affinity_masks()
294 if (nv->nvectors == UINT_MAX) in __irq_build_affinity_masks()
298 cpumask_and(nmsk, cpu_mask, node_to_cpumask[nv->id]); in __irq_build_affinity_masks()
303 WARN_ON_ONCE(nv->nvectors > ncpus); in __irq_build_affinity_masks()
306 extra_vecs = ncpus - nv->nvectors * (ncpus / nv->nvectors); in __irq_build_affinity_masks()
309 for (v = 0; v < nv->nvectors; v++, curvec++) { in __irq_build_affinity_masks()
310 cpus_per_vec = ncpus / nv->nvectors; in __irq_build_affinity_masks()
315 --extra_vecs; in __irq_build_affinity_masks()
327 done += nv->nvectors; in __irq_build_affinity_masks()
334 * build affinity in two stages:
345 int ret = -ENOMEM; in irq_build_affinity_masks()
361 /* Spread on present CPUs starting from affd->pre_vectors */ in irq_build_affinity_masks()
404 affd->nr_sets = 1; in default_calc_sets()
405 affd->set_size[0] = affvecs; in default_calc_sets()
409 * irq_create_affinity_masks - Create affinity masks for multiqueue spreading
411 * @affd: Description of the affinity requirements
422 * Determine the number of vectors which need interrupt affinities in irq_create_affinity_masks()
427 if (nvecs > affd->pre_vectors + affd->post_vectors) in irq_create_affinity_masks()
428 affvecs = nvecs - affd->pre_vectors - affd->post_vectors; in irq_create_affinity_masks()
436 if (!affd->calc_sets) in irq_create_affinity_masks()
437 affd->calc_sets = default_calc_sets; in irq_create_affinity_masks()
440 affd->calc_sets(affd, affvecs); in irq_create_affinity_masks()
442 if (WARN_ON_ONCE(affd->nr_sets > IRQ_AFFINITY_MAX_SETS)) in irq_create_affinity_masks()
453 /* Fill out vectors at the beginning that don't need affinity */ in irq_create_affinity_masks()
454 for (curvec = 0; curvec < affd->pre_vectors; curvec++) in irq_create_affinity_masks()
458 * Spread on present CPUs starting from affd->pre_vectors. If we in irq_create_affinity_masks()
459 * have multiple sets, build each sets affinity mask separately. in irq_create_affinity_masks()
461 for (i = 0, usedvecs = 0; i < affd->nr_sets; i++) { in irq_create_affinity_masks()
462 unsigned int this_vecs = affd->set_size[i]; in irq_create_affinity_masks()
475 /* Fill out vectors at the end that don't need affinity */ in irq_create_affinity_masks()
477 curvec = affd->pre_vectors + affvecs; in irq_create_affinity_masks()
479 curvec = affd->pre_vectors + usedvecs; in irq_create_affinity_masks()
484 for (i = affd->pre_vectors; i < nvecs - affd->post_vectors; i++) in irq_create_affinity_masks()
491 * irq_calc_affinity_vectors - Calculate the optimal number of vectors
494 * @affd: Description of the affinity requirements
499 unsigned int resv = affd->pre_vectors + affd->post_vectors; in irq_calc_affinity_vectors()
505 if (affd->calc_sets) { in irq_calc_affinity_vectors()
506 set_vecs = maxvec - resv; in irq_calc_affinity_vectors()
513 return resv + min(set_vecs, maxvec - resv); in irq_calc_affinity_vectors()