summaryrefslogtreecommitdiff
path: root/kernel/irq/affinity.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/irq/affinity.c')
-rw-r--r--kernel/irq/affinity.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/kernel/irq/affinity.c b/kernel/irq/affinity.c
index 6fef48033f96..c7cca942bd8a 100644
--- a/kernel/irq/affinity.c
+++ b/kernel/irq/affinity.c
@@ -129,14 +129,26 @@ static int __irq_build_affinity_masks(unsigned int startvec,
for_each_node_mask(n, nodemsk) {
unsigned int ncpus, v, vecs_to_assign, vecs_per_node;
- /* Spread the vectors per node */
- vecs_per_node = (numvecs - (curvec - firstvec)) / nodes;
-
/* Get the cpus on this node which are in the mask */
cpumask_and(nmsk, cpu_mask, node_to_cpumask[n]);
-
- /* Calculate the number of cpus per vector */
ncpus = cpumask_weight(nmsk);
+ if (!ncpus)
+ continue;
+
+ /*
+ * Calculate the number of cpus per vector
+ *
+ * Spread the vectors evenly per node. If the requested
+ * vector number has been reached, simply allocate one
+ * vector for each remaining node so that all nodes can
+ * be covered
+ */
+ if (numvecs > done)
+ vecs_per_node = max_t(unsigned,
+ (numvecs - done) / nodes, 1);
+ else
+ vecs_per_node = 1;
+
vecs_to_assign = min(vecs_per_node, ncpus);
/* Account for rounding errors */
@@ -156,13 +168,11 @@ static int __irq_build_affinity_masks(unsigned int startvec,
}
done += v;
- if (done >= numvecs)
- break;
if (curvec >= last_affv)
curvec = firstvec;
--nodes;
}
- return done;
+ return done < numvecs ? done : numvecs;
}
/*