Commit 65ff577e6b6e482ee9de3569e058edebdc02f069

Authored by Steffen Klassert
Committed by Herbert Xu
1 parent e6cc117076

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);
... ... @@ -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 {