From patchwork Thu Mar 14 01:20:44 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Mackerras X-Patchwork-Id: 227419 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id DFD132C00A3 for ; Thu, 14 Mar 2013 12:27:14 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756502Ab3CNB1M (ORCPT ); Wed, 13 Mar 2013 21:27:12 -0400 Received: from ozlabs.org ([203.10.76.45]:41964 "EHLO ozlabs.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755679Ab3CNB1M (ORCPT ); Wed, 13 Mar 2013 21:27:12 -0400 Received: by ozlabs.org (Postfix, from userid 1003) id 2B1112C009C; Thu, 14 Mar 2013 12:27:09 +1100 (EST) Date: Thu, 14 Mar 2013 12:20:44 +1100 From: Paul Mackerras To: Alexander Graf , kvm@vger.kernel.org Cc: kvm-ppc@vger.kernel.org, Scott Wood Subject: [PATCH] KVM: Add KVM_CAP_IRQ_ARCH capability Message-ID: <20130314012044.GA12273@drongo> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) Sender: kvm-ppc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm-ppc@vger.kernel.org Setting this capability on a vcpu connects that vcpu to an interrupt controller device. The args[0] field of the argument kvm_enable_cap struct specifies the overall architecture of the interrupt controller. The args[1] field specifies the CPU number for the vcpu from the interrupt controller's point of view. Signed-off-by: Paul Mackerras --- arch/powerpc/include/asm/kvm_host.h | 3 +++ arch/powerpc/kvm/powerpc.c | 29 +++++++++++++++++++++++++++++ include/uapi/linux/kvm.h | 1 + 3 files changed, 33 insertions(+) diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h index f4ba881..dd167e4 100644 --- a/arch/powerpc/include/asm/kvm_host.h +++ b/arch/powerpc/include/asm/kvm_host.h @@ -373,6 +373,9 @@ struct kvmppc_booke_debug_reg { struct kvm_vcpu_arch { ulong host_stack; u32 host_pid; + + u32 intr_ctrler; + #ifdef CONFIG_PPC_BOOK3S struct kvmppc_slb slb[64]; int slb_max; /* 1 + index of last valid entry in slb[] */ diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c index 934413c..891603e 100644 --- a/arch/powerpc/kvm/powerpc.c +++ b/arch/powerpc/kvm/powerpc.c @@ -459,6 +459,12 @@ void kvm_arch_vcpu_free(struct kvm_vcpu *vcpu) hrtimer_cancel(&vcpu->arch.dec_timer); tasklet_kill(&vcpu->arch.tasklet); + /* Release any per-vcpu irq controller state */ + switch (vcpu->arch.intr_ctrler) { + default: + break; + } + kvmppc_remove_vcpu_debugfs(vcpu); kvmppc_core_vcpu_free(vcpu); } @@ -791,6 +797,29 @@ static int kvm_vcpu_ioctl_enable_cap(struct kvm_vcpu *vcpu, break; } #endif + case KVM_CAP_IRQ_ARCH: + r = -EBUSY; + mutex_lock(&vcpu->kvm->lock); + /* disallow changing once set */ + if (!vcpu->arch.intr_ctrler) { + r = 0; + switch (cap->args[0]) { + case 0: /* no interrupt controller */ + break; + default: + r = -EINVAL; + } + if (!r) { + /* + * Make sure any state set up by the interrupt + * controller init routine is seen before this. + */ + smp_wmb(); + vcpu->arch.intr_ctrler = cap->args[0]; + } + } + mutex_unlock(&vcpu->kvm->lock); + break; default: r = -EINVAL; break; diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index 1f348e0..d875d37 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -663,6 +663,7 @@ struct kvm_ppc_smmu_info { #define KVM_CAP_S390_CSS_SUPPORT 85 #define KVM_CAP_PPC_EPR 86 #define KVM_CAP_DEVICE_CTRL 87 +#define KVM_CAP_IRQ_ARCH 88 #ifdef KVM_CAP_IRQ_ROUTING