From: Greg Kroah-Hartman Date: Sat, 14 Jul 2018 19:10:51 +0000 (+0200) Subject: 4.14-stable patches X-Git-Tag: v4.4.141~22 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ee8ec80391813a7f6013962ea04d7fe48205d3c8;p=thirdparty%2Fkernel%2Fstable-queue.git 4.14-stable patches added patches: genirq-affinity-assign-vectors-to-all-possible-cpus.patch --- diff --git a/queue-4.14/genirq-affinity-assign-vectors-to-all-possible-cpus.patch b/queue-4.14/genirq-affinity-assign-vectors-to-all-possible-cpus.patch new file mode 100644 index 00000000000..a6758fea47e --- /dev/null +++ b/queue-4.14/genirq-affinity-assign-vectors-to-all-possible-cpus.patch @@ -0,0 +1,145 @@ +From 84676c1f21e8ff54befe985f4f14dc1edc10046b Mon Sep 17 00:00:00 2001 +From: Christoph Hellwig +Date: Fri, 12 Jan 2018 10:53:05 +0800 +Subject: genirq/affinity: assign vectors to all possible CPUs + +From: Christoph Hellwig + +commit 84676c1f21e8ff54befe985f4f14dc1edc10046b upstream. + +Currently we assign managed interrupt vectors to all present CPUs. This +works fine for systems were we only online/offline CPUs. But in case of +systems that support physical CPU hotplug (or the virtualized version of +it) this means the additional CPUs covered for in the ACPI tables or on +the command line are not catered for. To fix this we'd either need to +introduce new hotplug CPU states just for this case, or we can start +assining vectors to possible but not present CPUs. + +Reported-by: Christian Borntraeger +Tested-by: Christian Borntraeger +Tested-by: Stefan Haberland +Fixes: 4b855ad37194 ("blk-mq: Create hctx for each present CPU") +Cc: linux-kernel@vger.kernel.org +Cc: Thomas Gleixner +Signed-off-by: Christoph Hellwig +Signed-off-by: Jens Axboe +Signed-off-by: Greg Kroah-Hartman + +--- + kernel/irq/affinity.c | 30 +++++++++++++++--------------- + 1 file changed, 15 insertions(+), 15 deletions(-) + +--- a/kernel/irq/affinity.c ++++ b/kernel/irq/affinity.c +@@ -39,7 +39,7 @@ static void irq_spread_init_one(struct c + } + } + +-static cpumask_var_t *alloc_node_to_present_cpumask(void) ++static cpumask_var_t *alloc_node_to_possible_cpumask(void) + { + cpumask_var_t *masks; + int node; +@@ -62,7 +62,7 @@ out_unwind: + return NULL; + } + +-static void free_node_to_present_cpumask(cpumask_var_t *masks) ++static void free_node_to_possible_cpumask(cpumask_var_t *masks) + { + int node; + +@@ -71,22 +71,22 @@ static void free_node_to_present_cpumask + kfree(masks); + } + +-static void build_node_to_present_cpumask(cpumask_var_t *masks) ++static void build_node_to_possible_cpumask(cpumask_var_t *masks) + { + int cpu; + +- for_each_present_cpu(cpu) ++ for_each_possible_cpu(cpu) + cpumask_set_cpu(cpu, masks[cpu_to_node(cpu)]); + } + +-static int get_nodes_in_cpumask(cpumask_var_t *node_to_present_cpumask, ++static int get_nodes_in_cpumask(cpumask_var_t *node_to_possible_cpumask, + const struct cpumask *mask, nodemask_t *nodemsk) + { + int n, nodes = 0; + + /* Calculate the number of nodes in the supplied affinity mask */ + for_each_node(n) { +- if (cpumask_intersects(mask, node_to_present_cpumask[n])) { ++ if (cpumask_intersects(mask, node_to_possible_cpumask[n])) { + node_set(n, *nodemsk); + nodes++; + } +@@ -109,7 +109,7 @@ irq_create_affinity_masks(int nvecs, con + int last_affv = affv + affd->pre_vectors; + nodemask_t nodemsk = NODE_MASK_NONE; + struct cpumask *masks; +- cpumask_var_t nmsk, *node_to_present_cpumask; ++ cpumask_var_t nmsk, *node_to_possible_cpumask; + + /* + * If there aren't any vectors left after applying the pre/post +@@ -125,8 +125,8 @@ irq_create_affinity_masks(int nvecs, con + if (!masks) + goto out; + +- node_to_present_cpumask = alloc_node_to_present_cpumask(); +- if (!node_to_present_cpumask) ++ node_to_possible_cpumask = alloc_node_to_possible_cpumask(); ++ if (!node_to_possible_cpumask) + goto out; + + /* Fill out vectors at the beginning that don't need affinity */ +@@ -135,8 +135,8 @@ irq_create_affinity_masks(int nvecs, con + + /* Stabilize the cpumasks */ + get_online_cpus(); +- build_node_to_present_cpumask(node_to_present_cpumask); +- nodes = get_nodes_in_cpumask(node_to_present_cpumask, cpu_present_mask, ++ build_node_to_possible_cpumask(node_to_possible_cpumask); ++ nodes = get_nodes_in_cpumask(node_to_possible_cpumask, cpu_possible_mask, + &nodemsk); + + /* +@@ -146,7 +146,7 @@ irq_create_affinity_masks(int nvecs, con + if (affv <= nodes) { + for_each_node_mask(n, nodemsk) { + cpumask_copy(masks + curvec, +- node_to_present_cpumask[n]); ++ node_to_possible_cpumask[n]); + if (++curvec == last_affv) + break; + } +@@ -160,7 +160,7 @@ irq_create_affinity_masks(int nvecs, con + vecs_per_node = (affv - (curvec - affd->pre_vectors)) / nodes; + + /* Get the cpus on this node which are in the mask */ +- cpumask_and(nmsk, cpu_present_mask, node_to_present_cpumask[n]); ++ cpumask_and(nmsk, cpu_possible_mask, node_to_possible_cpumask[n]); + + /* Calculate the number of cpus per vector */ + ncpus = cpumask_weight(nmsk); +@@ -192,7 +192,7 @@ done: + /* Fill out vectors at the end that don't need affinity */ + for (; curvec < nvecs; curvec++) + cpumask_copy(masks + curvec, irq_default_affinity); +- free_node_to_present_cpumask(node_to_present_cpumask); ++ free_node_to_possible_cpumask(node_to_possible_cpumask); + out: + free_cpumask_var(nmsk); + return masks; +@@ -214,7 +214,7 @@ int irq_calc_affinity_vectors(int minvec + return 0; + + get_online_cpus(); +- ret = min_t(int, cpumask_weight(cpu_present_mask), vecs) + resv; ++ ret = min_t(int, cpumask_weight(cpu_possible_mask), vecs) + resv; + put_online_cpus(); + return ret; + } diff --git a/queue-4.14/series b/queue-4.14/series index b956350d7ea..dba90c82120 100644 --- a/queue-4.14/series +++ b/queue-4.14/series @@ -22,3 +22,4 @@ xhci-xhci-mem-off-by-one-in-xhci_stream_id_to_ring.patch devpts-hoist-out-check-for-devpts_super_magic.patch devpts-resolve-devpts-bind-mounts.patch fix-up-non-directory-creation-in-sgid-directories.patch +genirq-affinity-assign-vectors-to-all-possible-cpus.patch