X86/Hyper-V: Enable IPI enlightenments
Hyper-V supports hypercalls to implement IPI; use them. Signed-off-by: K. Y. Srinivasan <kys@microsoft.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Michael Kelley <mikelley@microsoft.com> Cc: olaf@aepfle.de Cc: sthemmin@microsoft.com Cc: gregkh@linuxfoundation.org Cc: jasowang@redhat.com Cc: Michael.H.Kelley@microsoft.com Cc: hpa@zytor.com Cc: apw@canonical.com Cc: devel@linuxdriverproject.org Cc: vkuznets@redhat.com Link: https://lkml.kernel.org/r/20180516215334.6547-2-kys@linuxonhyperv.com
This commit is contained in:

committed by
Thomas Gleixner

parent
6b48cb5f83
commit
68bb7bfb79
@@ -91,12 +91,19 @@ EXPORT_SYMBOL_GPL(hv_vp_index);
|
||||
struct hv_vp_assist_page **hv_vp_assist_page;
|
||||
EXPORT_SYMBOL_GPL(hv_vp_assist_page);
|
||||
|
||||
void __percpu **hyperv_pcpu_input_arg;
|
||||
EXPORT_SYMBOL_GPL(hyperv_pcpu_input_arg);
|
||||
|
||||
u32 hv_max_vp_index;
|
||||
|
||||
static int hv_cpu_init(unsigned int cpu)
|
||||
{
|
||||
u64 msr_vp_index;
|
||||
struct hv_vp_assist_page **hvp = &hv_vp_assist_page[smp_processor_id()];
|
||||
void **input_arg;
|
||||
|
||||
input_arg = (void **)this_cpu_ptr(hyperv_pcpu_input_arg);
|
||||
*input_arg = page_address(alloc_page(GFP_KERNEL));
|
||||
|
||||
hv_get_vp_index(msr_vp_index);
|
||||
|
||||
@@ -217,6 +224,16 @@ static int hv_cpu_die(unsigned int cpu)
|
||||
{
|
||||
struct hv_reenlightenment_control re_ctrl;
|
||||
unsigned int new_cpu;
|
||||
unsigned long flags;
|
||||
void **input_arg;
|
||||
void *input_pg = NULL;
|
||||
|
||||
local_irq_save(flags);
|
||||
input_arg = (void **)this_cpu_ptr(hyperv_pcpu_input_arg);
|
||||
input_pg = *input_arg;
|
||||
*input_arg = NULL;
|
||||
local_irq_restore(flags);
|
||||
free_page((unsigned long)input_pg);
|
||||
|
||||
if (hv_vp_assist_page && hv_vp_assist_page[cpu])
|
||||
wrmsrl(HV_X64_MSR_VP_ASSIST_PAGE, 0);
|
||||
@@ -260,6 +277,16 @@ void __init hyperv_init(void)
|
||||
if ((ms_hyperv.features & required_msrs) != required_msrs)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Allocate the per-CPU state for the hypercall input arg.
|
||||
* If this allocation fails, we will not be able to setup
|
||||
* (per-CPU) hypercall input page and thus this failure is
|
||||
* fatal on Hyper-V.
|
||||
*/
|
||||
hyperv_pcpu_input_arg = alloc_percpu(void *);
|
||||
|
||||
BUG_ON(hyperv_pcpu_input_arg == NULL);
|
||||
|
||||
/* Allocate percpu VP index */
|
||||
hv_vp_index = kmalloc_array(num_possible_cpus(), sizeof(*hv_vp_index),
|
||||
GFP_KERNEL);
|
||||
|
Reference in New Issue
Block a user