diff options
author | Daniel Jordan <daniel.m.jordan@oracle.com> | 2019-09-05 21:40:26 -0400 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2019-09-13 07:15:40 -0400 |
commit | cc491d8e6486c56e07e60d9992cd56f63dc9fd6c (patch) | |
tree | e8564355420beff9baaeeffe853585e9f90b7ddc /kernel/padata.c | |
parent | 63d3578892dc00d165623184b793045257e01083 (diff) |
padata, pcrypt: take CPU hotplug lock internally in padata_alloc_possible
With pcrypt's cpumask no longer used, take the CPU hotplug lock inside
padata_alloc_possible.
Useful later in the series for avoiding nested acquisition of the CPU
hotplug lock in padata when padata_alloc_possible is allocating an
unbound workqueue.
Without this patch, this nested acquisition would happen later in the
series:
pcrypt_init_padata
get_online_cpus
alloc_padata_possible
alloc_padata
alloc_workqueue(WQ_UNBOUND) // later in the series
alloc_and_link_pwqs
apply_wqattrs_lock
get_online_cpus // recursive rwsem acquisition
Signed-off-by: Daniel Jordan <daniel.m.jordan@oracle.com>
Acked-by: Steffen Klassert <steffen.klassert@secunet.com>
Cc: Herbert Xu <herbert@gondor.apana.org.au>
Cc: Lai Jiangshan <jiangshanlai@gmail.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Tejun Heo <tj@kernel.org>
Cc: linux-crypto@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'kernel/padata.c')
-rw-r--r-- | kernel/padata.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/kernel/padata.c b/kernel/padata.c index 9a17922ec436..8a362923c488 100644 --- a/kernel/padata.c +++ b/kernel/padata.c | |||
@@ -955,8 +955,6 @@ static struct kobj_type padata_attr_type = { | |||
955 | * @name: used to identify the instance | 955 | * @name: used to identify the instance |
956 | * @pcpumask: cpumask that will be used for padata parallelization | 956 | * @pcpumask: cpumask that will be used for padata parallelization |
957 | * @cbcpumask: cpumask that will be used for padata serialization | 957 | * @cbcpumask: cpumask that will be used for padata serialization |
958 | * | ||
959 | * Must be called from a cpus_read_lock() protected region | ||
960 | */ | 958 | */ |
961 | static struct padata_instance *padata_alloc(const char *name, | 959 | static struct padata_instance *padata_alloc(const char *name, |
962 | const struct cpumask *pcpumask, | 960 | const struct cpumask *pcpumask, |
@@ -974,11 +972,13 @@ static struct padata_instance *padata_alloc(const char *name, | |||
974 | if (!pinst->wq) | 972 | if (!pinst->wq) |
975 | goto err_free_inst; | 973 | goto err_free_inst; |
976 | 974 | ||
975 | get_online_cpus(); | ||
976 | |||
977 | if (!alloc_cpumask_var(&pinst->cpumask.pcpu, GFP_KERNEL)) | 977 | if (!alloc_cpumask_var(&pinst->cpumask.pcpu, GFP_KERNEL)) |
978 | goto err_free_wq; | 978 | goto err_put_cpus; |
979 | if (!alloc_cpumask_var(&pinst->cpumask.cbcpu, GFP_KERNEL)) { | 979 | if (!alloc_cpumask_var(&pinst->cpumask.cbcpu, GFP_KERNEL)) { |
980 | free_cpumask_var(pinst->cpumask.pcpu); | 980 | free_cpumask_var(pinst->cpumask.pcpu); |
981 | goto err_free_wq; | 981 | goto err_put_cpus; |
982 | } | 982 | } |
983 | if (!padata_validate_cpumask(pinst, pcpumask) || | 983 | if (!padata_validate_cpumask(pinst, pcpumask) || |
984 | !padata_validate_cpumask(pinst, cbcpumask)) | 984 | !padata_validate_cpumask(pinst, cbcpumask)) |
@@ -1002,12 +1002,16 @@ static struct padata_instance *padata_alloc(const char *name, | |||
1002 | #ifdef CONFIG_HOTPLUG_CPU | 1002 | #ifdef CONFIG_HOTPLUG_CPU |
1003 | cpuhp_state_add_instance_nocalls_cpuslocked(hp_online, &pinst->node); | 1003 | cpuhp_state_add_instance_nocalls_cpuslocked(hp_online, &pinst->node); |
1004 | #endif | 1004 | #endif |
1005 | |||
1006 | put_online_cpus(); | ||
1007 | |||
1005 | return pinst; | 1008 | return pinst; |
1006 | 1009 | ||
1007 | err_free_masks: | 1010 | err_free_masks: |
1008 | free_cpumask_var(pinst->cpumask.pcpu); | 1011 | free_cpumask_var(pinst->cpumask.pcpu); |
1009 | free_cpumask_var(pinst->cpumask.cbcpu); | 1012 | free_cpumask_var(pinst->cpumask.cbcpu); |
1010 | err_free_wq: | 1013 | err_put_cpus: |
1014 | put_online_cpus(); | ||
1011 | destroy_workqueue(pinst->wq); | 1015 | destroy_workqueue(pinst->wq); |
1012 | err_free_inst: | 1016 | err_free_inst: |
1013 | kfree(pinst); | 1017 | kfree(pinst); |
@@ -1021,12 +1025,9 @@ err: | |||
1021 | * parallel workers. | 1025 | * parallel workers. |
1022 | * | 1026 | * |
1023 | * @name: used to identify the instance | 1027 | * @name: used to identify the instance |
1024 | * | ||
1025 | * Must be called from a cpus_read_lock() protected region | ||
1026 | */ | 1028 | */ |
1027 | struct padata_instance *padata_alloc_possible(const char *name) | 1029 | struct padata_instance *padata_alloc_possible(const char *name) |
1028 | { | 1030 | { |
1029 | lockdep_assert_cpus_held(); | ||
1030 | return padata_alloc(name, cpu_possible_mask, cpu_possible_mask); | 1031 | return padata_alloc(name, cpu_possible_mask, cpu_possible_mask); |
1031 | } | 1032 | } |
1032 | EXPORT_SYMBOL(padata_alloc_possible); | 1033 | EXPORT_SYMBOL(padata_alloc_possible); |