Messages in this thread | | | From | Thomas Gleixner <> | Subject | Re: [PATCH] irq: consider cpus on nodes are unbalanced | Date | Wed, 24 Nov 2021 20:33:49 +0100 |
| |
Rei,
On Fri, Oct 29 2021 at 17:27, Rei Yamamoto wrote:
Cc'ing a few people who worked on this code.
> If cpus on a node are offline at boot time, there are > difference in the number of nodes between when building affinity > masks for present cpus and when building affinity masks for possible > cpus. This patch fixes 2 problems caused by the difference of the > number of nodes: > > - If some unused vectors remain after building masks for present cpus, > remained vectors are assigned for building masks for possible cpus. > Therefore "numvecs <= nodes" condition must be > "vecs_to_assign <= nodes_to_assign". Fix this problem by making this > condition appropriate. > > - The routine of "numvecs <= nodes" condition can overwrite bits of > masks for present cpus in building masks for possible cpus. Fix this > problem by making CPU bits, which is not target, not changing. > > Signed-off-by: Rei Yamamoto <yamamoto.rei@jp.fujitsu.com> > --- > kernel/irq/affinity.c | 10 ++++++++-- > 1 file changed, 8 insertions(+), 2 deletions(-) > > diff --git a/kernel/irq/affinity.c b/kernel/irq/affinity.c > index f7ff8919dc9b..1cdf89e5e2fb 100644 > --- a/kernel/irq/affinity.c > +++ b/kernel/irq/affinity.c > @@ -267,10 +267,16 @@ static int __irq_build_affinity_masks(unsigned int startvec, > * If the number of nodes in the mask is greater than or equal the > * number of vectors we just spread the vectors across the nodes. > */ > - if (numvecs <= nodes) { > + if (numvecs - (curvec - firstvec) <= nodes) { > for_each_node_mask(n, nodemsk) { > + unsigned int ncpus; > + > + cpumask_and(nmsk, cpu_mask, node_to_cpumask[n]); > + ncpus = cpumask_weight(nmsk); > + if (!ncpus) > + continue; > cpumask_or(&masks[curvec].mask, &masks[curvec].mask, > - node_to_cpumask[n]); > + nmsk); > if (++curvec == last_affv) > curvec = firstvec; > }
| |