Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757399AbcKXQ4F convert rfc822-to-8bit (ORCPT ); Thu, 24 Nov 2016 11:56:05 -0500 Received: from mx5-phx2.redhat.com ([209.132.183.37]:56967 "EHLO mx5-phx2.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754261AbcKXQ4C (ORCPT ); Thu, 24 Nov 2016 11:56:02 -0500 Date: Thu, 24 Nov 2016 11:55:51 -0500 (EST) From: Paolo Bonzini To: Radim =?utf-8?B?S3LEjW3DocWZ?= Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org Message-ID: <2093812530.1733849.1480006551335.JavaMail.zimbra@redhat.com> In-Reply-To: <20161124163134.4630-3-rkrcmar@redhat.com> References: <20161124163134.4630-1-rkrcmar@redhat.com> <20161124163134.4630-3-rkrcmar@redhat.com> Subject: Re: [PATCH 2/6] KVM: x86: decouple irqchip_in_kernel() and pic_irqchip() MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8BIT X-Originating-IP: [10.4.164.1, 10.5.101.130] X-Mailer: Zimbra 8.0.6_GA_5922 (ZimbraWebClient - FF49 (Linux)/8.0.6_GA_5922) Thread-Topic: x86: decouple irqchip_in_kernel() and pic_irqchip() Thread-Index: TPgvJvwP5kQios2SbF7C+8F6VSO2IQ== Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2198 Lines: 76 > irqchip_in_kernel() tried to save a bit by reusing pic_irqchip(), but it > just complicated the code. > Add kvm->arch.irqchip_kvm that matches kvm->arch.irqchip_split. > (Turning them into an exclusive type would be nicer.) Then do it. ;) Paolo > Signed-off-by: Radim Krčmář > --- > arch/x86/include/asm/kvm_host.h | 1 + > arch/x86/kvm/irq.h | 13 +++++++------ > arch/x86/kvm/x86.c | 3 ++- > 3 files changed, 10 insertions(+), 7 deletions(-) > > diff --git a/arch/x86/include/asm/kvm_host.h > b/arch/x86/include/asm/kvm_host.h > index bdde80731f49..929228ec2839 100644 > --- a/arch/x86/include/asm/kvm_host.h > +++ b/arch/x86/include/asm/kvm_host.h > @@ -778,6 +778,7 @@ struct kvm_arch { > > u64 disabled_quirks; > > + bool irqchip_kvm; > bool irqchip_split; > u8 nr_reserved_ioapic_pins; > > diff --git a/arch/x86/kvm/irq.h b/arch/x86/kvm/irq.h > index 035731eb3897..8536be85d529 100644 > --- a/arch/x86/kvm/irq.h > +++ b/arch/x86/kvm/irq.h > @@ -96,15 +96,16 @@ static inline int irqchip_split(struct kvm *kvm) > return kvm->arch.irqchip_split; > } > > +static inline int irqchip_kvm(struct kvm *kvm) > +{ > + return kvm->arch.irqchip_kvm; > +} > + > static inline int irqchip_in_kernel(struct kvm *kvm) > { > - struct kvm_pic *vpic = pic_irqchip(kvm); > - bool ret; > + bool ret = irqchip_kvm(kvm) || irqchip_split(kvm); > > - ret = (vpic != NULL); > - ret |= irqchip_split(kvm); > - > - /* Read vpic before kvm->irq_routing. */ > + /* Matches with wmb after initializing kvm->irq_routing. */ > smp_rmb(); > return ret; > } > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index dbed51045c37..dd8431a7e18b 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -3928,8 +3928,9 @@ long kvm_arch_vm_ioctl(struct file *filp, > mutex_unlock(&kvm->slots_lock); > goto create_irqchip_unlock; > } > - /* Write kvm->irq_routing before kvm->arch.vpic. */ > + /* Write kvm->irq_routing before enabling irqchip_in_kernel. */ > smp_wmb(); > + kvm->arch.irqchip_kvm = true; > kvm->arch.vpic = vpic; > create_irqchip_unlock: > mutex_unlock(&kvm->lock); > -- > 2.10.2 > >