Commit 1f962d91 authored by Ming Lei's avatar Ming Lei Committed by Thomas Gleixner

genirq/affinity: Pass affinity managed mask array to irq_build_affinity_masks

Pass affinity managed mask array to irq_build_affinity_masks() so that the
index of the first affinity managed vector is always zero.

This allows to simplify the implementation a bit.
Signed-off-by: default avatarMing Lei <ming.lei@redhat.com>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarJohn Garry <john.g.garry@oracle.com>
Reviewed-by: Jens Axboe <axboe@kernel.dk>                                                                                                                                                                                                    
Link: https://lore.kernel.org/r/20221227022905.352674-3-ming.lei@redhat.com
parent cdf07f0e
...@@ -246,14 +246,13 @@ static void alloc_nodes_vectors(unsigned int numvecs, ...@@ -246,14 +246,13 @@ static void alloc_nodes_vectors(unsigned int numvecs,
static int __irq_build_affinity_masks(unsigned int startvec, static int __irq_build_affinity_masks(unsigned int startvec,
unsigned int numvecs, unsigned int numvecs,
unsigned int firstvec,
cpumask_var_t *node_to_cpumask, cpumask_var_t *node_to_cpumask,
const struct cpumask *cpu_mask, const struct cpumask *cpu_mask,
struct cpumask *nmsk, struct cpumask *nmsk,
struct irq_affinity_desc *masks) struct irq_affinity_desc *masks)
{ {
unsigned int i, n, nodes, cpus_per_vec, extra_vecs, done = 0; unsigned int i, n, nodes, cpus_per_vec, extra_vecs, done = 0;
unsigned int last_affv = firstvec + numvecs; unsigned int last_affv = numvecs;
unsigned int curvec = startvec; unsigned int curvec = startvec;
nodemask_t nodemsk = NODE_MASK_NONE; nodemask_t nodemsk = NODE_MASK_NONE;
struct node_vectors *node_vectors; struct node_vectors *node_vectors;
...@@ -273,7 +272,7 @@ static int __irq_build_affinity_masks(unsigned int startvec, ...@@ -273,7 +272,7 @@ static int __irq_build_affinity_masks(unsigned int startvec,
cpumask_and(nmsk, cpu_mask, node_to_cpumask[n]); cpumask_and(nmsk, cpu_mask, node_to_cpumask[n]);
cpumask_or(&masks[curvec].mask, &masks[curvec].mask, nmsk); cpumask_or(&masks[curvec].mask, &masks[curvec].mask, nmsk);
if (++curvec == last_affv) if (++curvec == last_affv)
curvec = firstvec; curvec = 0;
} }
return numvecs; return numvecs;
} }
...@@ -321,7 +320,7 @@ static int __irq_build_affinity_masks(unsigned int startvec, ...@@ -321,7 +320,7 @@ static int __irq_build_affinity_masks(unsigned int startvec,
* may start anywhere * may start anywhere
*/ */
if (curvec >= last_affv) if (curvec >= last_affv)
curvec = firstvec; curvec = 0;
irq_spread_init_one(&masks[curvec].mask, nmsk, irq_spread_init_one(&masks[curvec].mask, nmsk,
cpus_per_vec); cpus_per_vec);
} }
...@@ -336,11 +335,10 @@ static int __irq_build_affinity_masks(unsigned int startvec, ...@@ -336,11 +335,10 @@ static int __irq_build_affinity_masks(unsigned int startvec,
* 1) spread present CPU on these vectors * 1) spread present CPU on these vectors
* 2) spread other possible CPUs on these vectors * 2) spread other possible CPUs on these vectors
*/ */
static int irq_build_affinity_masks(unsigned int startvec, unsigned int numvecs, static int irq_build_affinity_masks(unsigned int numvecs,
struct irq_affinity_desc *masks) struct irq_affinity_desc *masks)
{ {
unsigned int curvec = startvec, nr_present = 0, nr_others = 0; unsigned int curvec = 0, nr_present = 0, nr_others = 0;
unsigned int firstvec = startvec;
cpumask_var_t *node_to_cpumask; cpumask_var_t *node_to_cpumask;
cpumask_var_t nmsk, npresmsk; cpumask_var_t nmsk, npresmsk;
int ret = -ENOMEM; int ret = -ENOMEM;
...@@ -360,9 +358,8 @@ static int irq_build_affinity_masks(unsigned int startvec, unsigned int numvecs, ...@@ -360,9 +358,8 @@ static int irq_build_affinity_masks(unsigned int startvec, unsigned int numvecs,
build_node_to_cpumask(node_to_cpumask); build_node_to_cpumask(node_to_cpumask);
/* Spread on present CPUs starting from affd->pre_vectors */ /* Spread on present CPUs starting from affd->pre_vectors */
ret = __irq_build_affinity_masks(curvec, numvecs, firstvec, ret = __irq_build_affinity_masks(curvec, numvecs, node_to_cpumask,
node_to_cpumask, cpu_present_mask, cpu_present_mask, nmsk, masks);
nmsk, masks);
if (ret < 0) if (ret < 0)
goto fail_build_affinity; goto fail_build_affinity;
nr_present = ret; nr_present = ret;
...@@ -374,13 +371,12 @@ static int irq_build_affinity_masks(unsigned int startvec, unsigned int numvecs, ...@@ -374,13 +371,12 @@ static int irq_build_affinity_masks(unsigned int startvec, unsigned int numvecs,
* out vectors. * out vectors.
*/ */
if (nr_present >= numvecs) if (nr_present >= numvecs)
curvec = firstvec; curvec = 0;
else else
curvec = firstvec + nr_present; curvec = nr_present;
cpumask_andnot(npresmsk, cpu_possible_mask, cpu_present_mask); cpumask_andnot(npresmsk, cpu_possible_mask, cpu_present_mask);
ret = __irq_build_affinity_masks(curvec, numvecs, firstvec, ret = __irq_build_affinity_masks(curvec, numvecs, node_to_cpumask,
node_to_cpumask, npresmsk, nmsk, npresmsk, nmsk, masks);
masks);
if (ret >= 0) if (ret >= 0)
nr_others = ret; nr_others = ret;
...@@ -463,7 +459,7 @@ irq_create_affinity_masks(unsigned int nvecs, struct irq_affinity *affd) ...@@ -463,7 +459,7 @@ irq_create_affinity_masks(unsigned int nvecs, struct irq_affinity *affd)
unsigned int this_vecs = affd->set_size[i]; unsigned int this_vecs = affd->set_size[i];
int ret; int ret;
ret = irq_build_affinity_masks(curvec, this_vecs, masks); ret = irq_build_affinity_masks(this_vecs, &masks[curvec]);
if (ret) { if (ret) {
kfree(masks); kfree(masks);
return NULL; return NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment