lkml.org 
[lkml]   [2018]   [Jul]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 5/6] KVM: X86: Add NMI support to PV IPIs
    Date
    From: Wanpeng Li <wanpengli@tencent.com>

    The NMI delivery mode of ICR is used to deliver an NMI to the processor,
    and the vector information is ignored.

    Cc: Paolo Bonzini <pbonzini@redhat.com>
    Cc: Radim Krčmář <rkrcmar@redhat.com>
    Cc: Vitaly Kuznetsov <vkuznets@redhat.com>
    Signed-off-by: Wanpeng Li <wanpengli@tencent.com>
    ---
    arch/x86/kernel/kvm.c | 13 +++++++++++--
    arch/x86/kvm/x86.c | 16 +++++++++++-----
    2 files changed, 22 insertions(+), 7 deletions(-)

    diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
    index 81be75b..b866518 100644
    --- a/arch/x86/kernel/kvm.c
    +++ b/arch/x86/kernel/kvm.c
    @@ -459,7 +459,7 @@ static void __init sev_map_percpu_data(void)
    #ifdef CONFIG_X86_64
    static int __send_ipi_mask(const struct cpumask *mask, int vector)
    {
    - unsigned long flags, ipi_bitmap_low = 0, ipi_bitmap_high = 0;
    + unsigned long flags, ipi_bitmap_low = 0, ipi_bitmap_high = 0, icr = 0;
    int cpu, apic_id, ret = 0;

    if (cpumask_empty(mask))
    @@ -479,7 +479,16 @@ static int __send_ipi_mask(const struct cpumask *mask, int vector)
    }
    }

    - ret = kvm_hypercall3(KVM_HC_SEND_IPI, ipi_bitmap_low, ipi_bitmap_high, vector);
    + switch (vector) {
    + default:
    + icr = APIC_DM_FIXED | vector;
    + break;
    + case NMI_VECTOR:
    + icr = APIC_DM_NMI;
    + break;
    + }
    +
    + ret = kvm_hypercall3(KVM_HC_SEND_IPI, ipi_bitmap_low, ipi_bitmap_high, icr);

    irq_restore_exit:
    local_irq_restore(flags);
    diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
    index 46657ef..2e4c4d7 100644
    --- a/arch/x86/kvm/x86.c
    +++ b/arch/x86/kvm/x86.c
    @@ -6693,15 +6693,21 @@ static void kvm_pv_kick_cpu_op(struct kvm *kvm, unsigned long flags, int apicid)
    * Return 0 if successfully added and 1 if discarded.
    */
    static int kvm_pv_send_ipi(struct kvm *kvm, unsigned long ipi_bitmap_low,
    - unsigned long ipi_bitmap_high, int vector)
    + unsigned long ipi_bitmap_high, unsigned long icr)
    {
    int i;
    struct kvm_apic_map *map;
    struct kvm_vcpu *vcpu;
    - struct kvm_lapic_irq irq = {
    - .delivery_mode = APIC_DM_FIXED,
    - .vector = vector,
    - };
    + struct kvm_lapic_irq irq = {0};
    +
    + switch (icr & APIC_VECTOR_MASK) {
    + default:
    + irq.vector = icr & APIC_VECTOR_MASK;
    + break;
    + case NMI_VECTOR:
    + break;
    + }
    + irq.delivery_mode = icr & APIC_MODE_MASK;

    rcu_read_lock();
    map = rcu_dereference(kvm->arch.apic_map);
    --
    2.7.4
    \
     
     \ /
      Last update: 2018-07-03 08:23    [W:2.099 / U:0.068 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site