int smp_call_on_cpu(unsigned int cpu, int (*func)(void *), void *par, bool phys)
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/irq_work.h>
#include <linux/rcupdate.h>
#include <linux/rculist.h>
#include <linux/kernel.h>
#include <linux/export.h>
#include <linux/percpu.h>
#include <linux/sched/idle.h>
#include <linux/hypervisor.h>
CSD_FLAG_SYNCHRONOUS = 0x02,
struct call_function_data {
call_single_data_t __percpu *csd;
cpumask_var_t cpumask_ipi;
static DEFINE_PER_CPU_SHARED_ALIGNED(struct call_function_data, cfd_data);
static DEFINE_PER_CPU_SHARED_ALIGNED(struct llist_head, call_single_queue);
static void flush_smp_call_function_queue(bool warn_cpu_offline);
int smpcfd_prepare_cpu(unsigned int cpu)
struct call_function_data *cfd = &per_cpu(cfd_data, cpu);
if (!zalloc_cpumask_var_node(&cfd->cpumask, GFP_KERNEL,
if (!zalloc_cpumask_var_node(&cfd->cpumask_ipi, GFP_KERNEL,
free_cpumask_var(cfd->cpumask);
cfd->csd = alloc_percpu(call_single_data_t);
free_cpumask_var(cfd->cpumask);
free_cpumask_var(cfd->cpumask_ipi);