mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-12 05:48:40 +00:00
x86/hyper-v: Use 'fast' hypercall for HVCALL_SEND_IPI
Current Hyper-V TLFS (v5.0b) claims that HvCallSendSyntheticClusterIpi hypercall can't be 'fast' (passing parameters through registers) but apparently this is not true, Windows always uses 'fast' version. We can do the same in Linux too. Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Michael Kelley <mikelley@microsoft.com> Cc: devel@linuxdriverproject.org Cc: "K. Y. Srinivasan" <kys@microsoft.com> Cc: Haiyang Zhang <haiyangz@microsoft.com> Cc: Stephen Hemminger <sthemmin@microsoft.com> Cc: "H. Peter Anvin" <hpa@zytor.com> Cc: Tianyu Lan <Tianyu.Lan@microsoft.com> Cc: "Michael Kelley (EOSG)" <Michael.H.Kelley@microsoft.com> Link: https://lkml.kernel.org/r/20180622170625.30688-3-vkuznets@redhat.com
This commit is contained in:
parent
53e5296690
commit
d8e6b232cf
1 changed files with 6 additions and 16 deletions
|
@ -128,10 +128,8 @@ static bool __send_ipi_mask_ex(const struct cpumask *mask, int vector)
|
|||
static bool __send_ipi_mask(const struct cpumask *mask, int vector)
|
||||
{
|
||||
int cur_cpu, vcpu;
|
||||
struct ipi_arg_non_ex **arg;
|
||||
struct ipi_arg_non_ex *ipi_arg;
|
||||
struct ipi_arg_non_ex ipi_arg;
|
||||
int ret = 1;
|
||||
unsigned long flags;
|
||||
|
||||
if (cpumask_empty(mask))
|
||||
return true;
|
||||
|
@ -145,16 +143,8 @@ static bool __send_ipi_mask(const struct cpumask *mask, int vector)
|
|||
if ((ms_hyperv.hints & HV_X64_EX_PROCESSOR_MASKS_RECOMMENDED))
|
||||
return __send_ipi_mask_ex(mask, vector);
|
||||
|
||||
local_irq_save(flags);
|
||||
arg = (struct ipi_arg_non_ex **)this_cpu_ptr(hyperv_pcpu_input_arg);
|
||||
|
||||
ipi_arg = *arg;
|
||||
if (unlikely(!ipi_arg))
|
||||
goto ipi_mask_done;
|
||||
|
||||
ipi_arg->vector = vector;
|
||||
ipi_arg->reserved = 0;
|
||||
ipi_arg->cpu_mask = 0;
|
||||
ipi_arg.vector = vector;
|
||||
ipi_arg.cpu_mask = 0;
|
||||
|
||||
for_each_cpu(cur_cpu, mask) {
|
||||
vcpu = hv_cpu_number_to_vp_number(cur_cpu);
|
||||
|
@ -165,13 +155,13 @@ static bool __send_ipi_mask(const struct cpumask *mask, int vector)
|
|||
if (vcpu >= 64)
|
||||
goto ipi_mask_done;
|
||||
|
||||
__set_bit(vcpu, (unsigned long *)&ipi_arg->cpu_mask);
|
||||
__set_bit(vcpu, (unsigned long *)&ipi_arg.cpu_mask);
|
||||
}
|
||||
|
||||
ret = hv_do_hypercall(HVCALL_SEND_IPI, ipi_arg, NULL);
|
||||
ret = hv_do_fast_hypercall16(HVCALL_SEND_IPI, ipi_arg.vector,
|
||||
ipi_arg.cpu_mask);
|
||||
|
||||
ipi_mask_done:
|
||||
local_irq_restore(flags);
|
||||
return ((ret == 0) ? true : false);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue