2019-05-19 15:08:55 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2009-01-09 23:27:08 +03:00
/*
* Uniprocessor - only support functions . The counterpart to kernel / smp . c
*/
2009-01-12 18:04:37 +03:00
# include <linux/interrupt.h>
2009-01-09 23:27:08 +03:00
# include <linux/kernel.h>
2011-05-23 22:51:41 +04:00
# include <linux/export.h>
2009-01-09 23:27:08 +03:00
# include <linux/smp.h>
2016-08-29 09:48:43 +03:00
# include <linux/hypervisor.h>
2009-01-09 23:27:08 +03:00
int smp_call_function_single ( int cpu , void ( * func ) ( void * info ) , void * info ,
int wait )
{
2013-09-12 01:23:25 +04:00
unsigned long flags ;
2020-02-05 17:34:09 +03:00
if ( cpu ! = 0 )
return - ENXIO ;
2009-01-11 07:15:21 +03:00
2013-09-12 01:23:25 +04:00
local_irq_save ( flags ) ;
func ( info ) ;
local_irq_restore ( flags ) ;
2009-01-11 07:15:21 +03:00
2009-01-09 23:27:08 +03:00
return 0 ;
}
EXPORT_SYMBOL ( smp_call_function_single ) ;
2013-09-12 01:23:24 +04:00
2021-05-06 00:12:42 +03:00
int smp_call_function_single_async ( int cpu , struct __call_single_data * csd )
2013-11-15 02:32:08 +04:00
{
unsigned long flags ;
local_irq_save ( flags ) ;
csd - > func ( csd - > info ) ;
local_irq_restore ( flags ) ;
2014-02-24 19:39:57 +04:00
return 0 ;
2013-11-15 02:32:08 +04:00
}
2014-02-24 19:40:02 +04:00
EXPORT_SYMBOL ( smp_call_function_single_async ) ;
2013-11-15 02:32:08 +04:00
2013-09-12 01:23:24 +04:00
/*
* Preemption is disabled here to make sure the cond_func is called under the
2021-05-07 04:06:33 +03:00
* same conditions in UP and SMP .
2013-09-12 01:23:24 +04:00
*/
2020-01-17 12:01:35 +03:00
void on_each_cpu_cond_mask ( smp_cond_func_t cond_func , smp_call_func_t func ,
2020-01-17 12:01:37 +03:00
void * info , bool wait , const struct cpumask * mask )
2013-09-12 01:23:24 +04:00
{
unsigned long flags ;
preempt_disable ( ) ;
2021-02-21 02:17:12 +03:00
if ( ( ! cond_func | | cond_func ( 0 , info ) ) & & cpumask_test_cpu ( 0 , mask ) ) {
2013-09-12 01:23:24 +04:00
local_irq_save ( flags ) ;
func ( info ) ;
local_irq_restore ( flags ) ;
}
preempt_enable ( ) ;
}
2018-09-26 06:58:41 +03:00
EXPORT_SYMBOL ( on_each_cpu_cond_mask ) ;
2016-08-29 09:48:44 +03:00
int smp_call_on_cpu ( unsigned int cpu , int ( * func ) ( void * ) , void * par , bool phys )
{
int ret ;
if ( cpu ! = 0 )
return - ENXIO ;
if ( phys )
hypervisor_pin_vcpu ( 0 ) ;
ret = func ( par ) ;
if ( phys )
hypervisor_pin_vcpu ( - 1 ) ;
return ret ;
}
EXPORT_SYMBOL_GPL ( smp_call_on_cpu ) ;