Commit 65ff577e6b6e482ee9de3569e058edebdc02f069
Committed by
Herbert Xu
1 parent
e6cc117076
Exists in
master
and in
4 other branches
padata: Rearrange set_cpumask functions
padata_set_cpumask needs to be protected by a lock. We make __padata_set_cpumasks unlocked and static. So this function can be used by the exported and locked padata_set_cpumask and padata_set_cpumasks functions. Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Showing 2 changed files with 70 additions and 53 deletions Side-by-side Diff
include/linux/padata.h
... | ... | @@ -178,9 +178,9 @@ |
178 | 178 | int cpumask_type, struct cpumask *out_mask); |
179 | 179 | extern int padata_set_cpumask(struct padata_instance *pinst, int cpumask_type, |
180 | 180 | cpumask_var_t cpumask); |
181 | -extern int __padata_set_cpumasks(struct padata_instance *pinst, | |
182 | - cpumask_var_t pcpumask, | |
183 | - cpumask_var_t cbcpumask); | |
181 | +extern int padata_set_cpumasks(struct padata_instance *pinst, | |
182 | + cpumask_var_t pcpumask, | |
183 | + cpumask_var_t cbcpumask); | |
184 | 184 | extern int padata_add_cpu(struct padata_instance *pinst, int cpu, int mask); |
185 | 185 | extern int padata_remove_cpu(struct padata_instance *pinst, int cpu, int mask); |
186 | 186 | extern int padata_start(struct padata_instance *pinst); |
kernel/padata.c
... | ... | @@ -623,7 +623,67 @@ |
623 | 623 | } |
624 | 624 | EXPORT_SYMBOL(padata_get_cpumask); |
625 | 625 | |
626 | +static int __padata_set_cpumasks(struct padata_instance *pinst, | |
627 | + cpumask_var_t pcpumask, | |
628 | + cpumask_var_t cbcpumask) | |
629 | +{ | |
630 | + int valid; | |
631 | + struct parallel_data *pd; | |
632 | + | |
633 | + valid = padata_validate_cpumask(pinst, pcpumask); | |
634 | + if (!valid) { | |
635 | + __padata_stop(pinst); | |
636 | + goto out_replace; | |
637 | + } | |
638 | + | |
639 | + valid = padata_validate_cpumask(pinst, cbcpumask); | |
640 | + if (!valid) | |
641 | + __padata_stop(pinst); | |
642 | + | |
643 | +out_replace: | |
644 | + pd = padata_alloc_pd(pinst, pcpumask, cbcpumask); | |
645 | + if (!pd) | |
646 | + return -ENOMEM; | |
647 | + | |
648 | + cpumask_copy(pinst->cpumask.pcpu, pcpumask); | |
649 | + cpumask_copy(pinst->cpumask.cbcpu, cbcpumask); | |
650 | + | |
651 | + padata_replace(pinst, pd); | |
652 | + | |
653 | + if (valid) | |
654 | + __padata_start(pinst); | |
655 | + | |
656 | + return 0; | |
657 | +} | |
658 | + | |
626 | 659 | /** |
660 | + * padata_set_cpumasks - Set both parallel and serial cpumasks. The first | |
661 | + * one is used by parallel workers and the second one | |
662 | + * by the wokers doing serialization. | |
663 | + * | |
664 | + * @pinst: padata instance | |
665 | + * @pcpumask: the cpumask to use for parallel workers | |
666 | + * @cbcpumask: the cpumsak to use for serial workers | |
667 | + */ | |
668 | +int padata_set_cpumasks(struct padata_instance *pinst, cpumask_var_t pcpumask, | |
669 | + cpumask_var_t cbcpumask) | |
670 | +{ | |
671 | + int err; | |
672 | + | |
673 | + mutex_lock(&pinst->lock); | |
674 | + get_online_cpus(); | |
675 | + | |
676 | + err = __padata_set_cpumasks(pinst, pcpumask, cbcpumask); | |
677 | + | |
678 | + put_online_cpus(); | |
679 | + mutex_unlock(&pinst->lock); | |
680 | + | |
681 | + return err; | |
682 | + | |
683 | +} | |
684 | +EXPORT_SYMBOL(padata_set_cpumasks); | |
685 | + | |
686 | +/** | |
627 | 687 | * padata_set_cpumask: Sets specified by @cpumask_type cpumask to the value |
628 | 688 | * equivalent to @cpumask. |
629 | 689 | * |
630 | 690 | |
... | ... | @@ -636,7 +696,11 @@ |
636 | 696 | cpumask_var_t cpumask) |
637 | 697 | { |
638 | 698 | struct cpumask *serial_mask, *parallel_mask; |
699 | + int err = -EINVAL; | |
639 | 700 | |
701 | + mutex_lock(&pinst->lock); | |
702 | + get_online_cpus(); | |
703 | + | |
640 | 704 | switch (cpumask_type) { |
641 | 705 | case PADATA_CPU_PARALLEL: |
642 | 706 | serial_mask = pinst->cpumask.cbcpu; |
643 | 707 | |
644 | 708 | |
645 | 709 | |
646 | 710 | |
... | ... | @@ -647,65 +711,18 @@ |
647 | 711 | serial_mask = cpumask; |
648 | 712 | break; |
649 | 713 | default: |
650 | - return -EINVAL; | |
714 | + goto out; | |
651 | 715 | } |
652 | 716 | |
653 | - return __padata_set_cpumasks(pinst, parallel_mask, serial_mask); | |
654 | -} | |
655 | -EXPORT_SYMBOL(padata_set_cpumask); | |
717 | + err = __padata_set_cpumasks(pinst, parallel_mask, serial_mask); | |
656 | 718 | |
657 | -/** | |
658 | - * __padata_set_cpumasks - Set both parallel and serial cpumasks. The first | |
659 | - * one is used by parallel workers and the second one | |
660 | - * by the wokers doing serialization. | |
661 | - * | |
662 | - * @pinst: padata instance | |
663 | - * @pcpumask: the cpumask to use for parallel workers | |
664 | - * @cbcpumask: the cpumsak to use for serial workers | |
665 | - */ | |
666 | -int __padata_set_cpumasks(struct padata_instance *pinst, | |
667 | - cpumask_var_t pcpumask, cpumask_var_t cbcpumask) | |
668 | -{ | |
669 | - int valid; | |
670 | - int err = 0; | |
671 | - struct parallel_data *pd = NULL; | |
672 | - | |
673 | - mutex_lock(&pinst->lock); | |
674 | - get_online_cpus(); | |
675 | - | |
676 | - valid = padata_validate_cpumask(pinst, pcpumask); | |
677 | - if (!valid) { | |
678 | - __padata_stop(pinst); | |
679 | - goto out_replace; | |
680 | - } | |
681 | - | |
682 | - valid = padata_validate_cpumask(pinst, cbcpumask); | |
683 | - if (!valid) | |
684 | - __padata_stop(pinst); | |
685 | - | |
686 | -out_replace: | |
687 | - pd = padata_alloc_pd(pinst, pcpumask, cbcpumask); | |
688 | - if (!pd) { | |
689 | - err = -ENOMEM; | |
690 | - goto out; | |
691 | - } | |
692 | - | |
693 | - cpumask_copy(pinst->cpumask.pcpu, pcpumask); | |
694 | - cpumask_copy(pinst->cpumask.cbcpu, cbcpumask); | |
695 | - | |
696 | - padata_replace(pinst, pd); | |
697 | - | |
698 | - if (valid) | |
699 | - __padata_start(pinst); | |
700 | - | |
701 | 719 | out: |
702 | 720 | put_online_cpus(); |
703 | 721 | mutex_unlock(&pinst->lock); |
704 | 722 | |
705 | 723 | return err; |
706 | - | |
707 | 724 | } |
708 | -EXPORT_SYMBOL(__padata_set_cpumasks); | |
725 | +EXPORT_SYMBOL(padata_set_cpumask); | |
709 | 726 | |
710 | 727 | static int __padata_add_cpu(struct padata_instance *pinst, int cpu) |
711 | 728 | { |