From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paolo Bonzini Subject: Re: [PATCH v5 4/4] KVM: x86: Add support for local interrupt requests from userspace Date: Tue, 28 Jul 2015 17:58:38 +0200 Message-ID: <55B7A6AE.5070001@redhat.com> References: <1438039062-3168-1-git-send-email-srutherford@google.com> <1438039062-3168-4-git-send-email-srutherford@google.com> Mime-Version: 1.0 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit To: Steve Rutherford , kvm@vger.kernel.org Return-path: Received: from mail-wi0-f176.google.com ([209.85.212.176]:34408 "EHLO mail-wi0-f176.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751417AbbG1P6m (ORCPT ); Tue, 28 Jul 2015 11:58:42 -0400 Received: by wibud3 with SMTP id ud3so187078140wib.1 for ; Tue, 28 Jul 2015 08:58:41 -0700 (PDT) In-Reply-To: <1438039062-3168-4-git-send-email-srutherford@google.com> Sender: kvm-owner@vger.kernel.org List-ID: On 28/07/2015 01:17, Steve Rutherford wrote: > return kvm->arch.vpic; > } > > +static inline int pic_in_kernel(struct kvm *kvm) > +{ > + int ret; > + > + ret = (pic_irqchip(kvm) != NULL); > + smp_rmb(); What does this memory barrier pair with? I don't think it's necessary. > + return ret; > +} > + > static inline int irqchip_split(struct kvm *kvm) > { > return kvm->arch.irqchip_split; > @@ -5819,13 +5828,24 @@ static void post_kvm_run_save(struct kvm_vcpu *vcpu) > kvm_run->flags = is_smm(vcpu) ? KVM_RUN_X86_SMM : 0; > kvm_run->cr8 = kvm_get_cr8(vcpu); > kvm_run->apic_base = kvm_get_apic_base(vcpu); > - if (irqchip_in_kernel(vcpu->kvm)) > + if (irqchip_in_kernel(vcpu->kvm) && pic_in_kernel(vcpu->kvm)) > kvm_run->ready_for_interrupt_injection = 1; > - else > + else if (irqchip_in_kernel(vcpu->kvm)) { > + int ready_for_interrupt_injection = > + kvm_apic_accept_pic_intr(vcpu); > + > + if (!kvm_run->ready_for_interrupt_injection && > + ready_for_interrupt_injection) > + kvm_make_request(KVM_REQ_PIC_UNMASK_EXIT, vcpu); > + > + kvm_run->ready_for_interrupt_injection = > + ready_for_interrupt_injection; > + } else { > kvm_run->ready_for_interrupt_injection = > kvm_arch_interrupt_allowed(vcpu) && > !kvm_cpu_has_interrupt(vcpu) && > !kvm_event_needs_reinjection(vcpu); > + } > } > > static void update_cr8_intercept(struct kvm_vcpu *vcpu) Why is this necessary? Could it just set kvm_run->ready_for_interrupt_injection as in the pic_in_kernel case? Paolo