diff options
Diffstat (limited to 'kernel/smp.c')
-rw-r--r-- | kernel/smp.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/kernel/smp.c b/kernel/smp.c index d86eec5f51c1..163c451af42e 100644 --- a/kernel/smp.c +++ b/kernel/smp.c | |||
@@ -669,9 +669,9 @@ EXPORT_SYMBOL(on_each_cpu_mask); | |||
669 | * You must not call this function with disabled interrupts or | 669 | * You must not call this function with disabled interrupts or |
670 | * from a hardware interrupt handler or from a bottom half handler. | 670 | * from a hardware interrupt handler or from a bottom half handler. |
671 | */ | 671 | */ |
672 | void on_each_cpu_cond(bool (*cond_func)(int cpu, void *info), | 672 | void on_each_cpu_cond_mask(bool (*cond_func)(int cpu, void *info), |
673 | smp_call_func_t func, void *info, bool wait, | 673 | smp_call_func_t func, void *info, bool wait, |
674 | gfp_t gfp_flags) | 674 | gfp_t gfp_flags, const struct cpumask *mask) |
675 | { | 675 | { |
676 | cpumask_var_t cpus; | 676 | cpumask_var_t cpus; |
677 | int cpu, ret; | 677 | int cpu, ret; |
@@ -680,9 +680,9 @@ void on_each_cpu_cond(bool (*cond_func)(int cpu, void *info), | |||
680 | 680 | ||
681 | if (likely(zalloc_cpumask_var(&cpus, (gfp_flags|__GFP_NOWARN)))) { | 681 | if (likely(zalloc_cpumask_var(&cpus, (gfp_flags|__GFP_NOWARN)))) { |
682 | preempt_disable(); | 682 | preempt_disable(); |
683 | for_each_online_cpu(cpu) | 683 | for_each_cpu(cpu, mask) |
684 | if (cond_func(cpu, info)) | 684 | if (cond_func(cpu, info)) |
685 | cpumask_set_cpu(cpu, cpus); | 685 | __cpumask_set_cpu(cpu, cpus); |
686 | on_each_cpu_mask(cpus, func, info, wait); | 686 | on_each_cpu_mask(cpus, func, info, wait); |
687 | preempt_enable(); | 687 | preempt_enable(); |
688 | free_cpumask_var(cpus); | 688 | free_cpumask_var(cpus); |
@@ -692,7 +692,7 @@ void on_each_cpu_cond(bool (*cond_func)(int cpu, void *info), | |||
692 | * just have to IPI them one by one. | 692 | * just have to IPI them one by one. |
693 | */ | 693 | */ |
694 | preempt_disable(); | 694 | preempt_disable(); |
695 | for_each_online_cpu(cpu) | 695 | for_each_cpu(cpu, mask) |
696 | if (cond_func(cpu, info)) { | 696 | if (cond_func(cpu, info)) { |
697 | ret = smp_call_function_single(cpu, func, | 697 | ret = smp_call_function_single(cpu, func, |
698 | info, wait); | 698 | info, wait); |
@@ -701,6 +701,15 @@ void on_each_cpu_cond(bool (*cond_func)(int cpu, void *info), | |||
701 | preempt_enable(); | 701 | preempt_enable(); |
702 | } | 702 | } |
703 | } | 703 | } |
704 | EXPORT_SYMBOL(on_each_cpu_cond_mask); | ||
705 | |||
706 | void on_each_cpu_cond(bool (*cond_func)(int cpu, void *info), | ||
707 | smp_call_func_t func, void *info, bool wait, | ||
708 | gfp_t gfp_flags) | ||
709 | { | ||
710 | on_each_cpu_cond_mask(cond_func, func, info, wait, gfp_flags, | ||
711 | cpu_online_mask); | ||
712 | } | ||
704 | EXPORT_SYMBOL(on_each_cpu_cond); | 713 | EXPORT_SYMBOL(on_each_cpu_cond); |
705 | 714 | ||
706 | static void do_nothing(void *unused) | 715 | static void do_nothing(void *unused) |