X-Git-Url: https://git.stricted.de/?p=GitHub%2Fmt8127%2Fandroid_kernel_alcatel_ttab.git;a=blobdiff_plain;f=kernel%2Fsmp.c;h=7d1bf67e3ca73972378b67b61694c511841d3c64;hp=4dba0f7b72ad716cf447f1fdbdd082ff7e0e73cf;hb=b4350432998578500203d562d5b093c6a5beadd2;hpb=130901ba33c4a040e12cf7cce240c1056cc096ee diff --git a/kernel/smp.c b/kernel/smp.c index 4dba0f7b72ad..7d1bf67e3ca7 100644 --- a/kernel/smp.c +++ b/kernel/smp.c @@ -270,6 +270,51 @@ int smp_call_function_single(int cpu, smp_call_func_t func, void *info, } EXPORT_SYMBOL(smp_call_function_single); +/* This function can be used by MTK Monitor only */ +/* Dont use this function directly */ +int mtk_smp_call_function_single(int cpu, smp_call_func_t func, void *info, + int wait) +{ + struct call_single_data d = { + .flags = 0, + }; + unsigned long flags; + int this_cpu; + int err = 0; + + /* + * prevent preemption and reschedule on another processor, + * as well as CPU removal + */ + this_cpu = get_cpu(); + + if (cpu == this_cpu) { + local_irq_save(flags); + func(info); + local_irq_restore(flags); + } else { + if ((unsigned)cpu < nr_cpu_ids && cpu_online(cpu)) { + struct call_single_data *data = &d; + + if (!wait) + data = &__get_cpu_var(csd_data); + + csd_lock(data); + + cpumask_set_cpu(cpu, data->cpumask); + data->func = func; + data->info = info; + generic_exec_single(cpu, data, wait); + } else { + err = -ENXIO; /* CPU not online */ + } + } + + put_cpu(); + + return err; +} + /* * smp_call_function_any - Run a function on any of the given cpus * @mask: The mask of cpus it can run on. @@ -658,7 +703,7 @@ void on_each_cpu_cond(bool (*cond_func)(int cpu, void *info), if (cond_func(cpu, info)) { ret = smp_call_function_single(cpu, func, info, wait); - WARN_ON_ONCE(!ret); + WARN_ON_ONCE(ret); } preempt_enable(); }