From patchwork Thu Aug 16 13:54:19 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Kiszka X-Patchwork-Id: 1332141 Return-Path: X-Original-To: patchwork-kvm@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork1.kernel.org (Postfix) with ESMTP id 4152940214 for ; Thu, 16 Aug 2012 13:54:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932193Ab2HPNyr (ORCPT ); Thu, 16 Aug 2012 09:54:47 -0400 Received: from goliath.siemens.de ([192.35.17.28]:22696 "EHLO goliath.siemens.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757077Ab2HPNyl (ORCPT ); Thu, 16 Aug 2012 09:54:41 -0400 Received: from mail1.siemens.de (localhost [127.0.0.1]) by goliath.siemens.de (8.13.6/8.13.6) with ESMTP id q7GDsYUR030762; Thu, 16 Aug 2012 15:54:35 +0200 Received: from mchn199C.mchp.siemens.de ([139.25.109.49]) by mail1.siemens.de (8.13.6/8.13.6) with ESMTP id q7GDsYJF012893; Thu, 16 Aug 2012 15:54:34 +0200 From: Jan Kiszka To: Avi Kivity , Marcelo Tosatti Cc: kvm@vger.kernel.org, Alex Williamson Subject: [PATCH 05/19] pci-assign: Factor out kvm_device_intx_assign Date: Thu, 16 Aug 2012 15:54:19 +0200 Message-Id: <50a07f6f28fe0326e45375185fb6b49472337a49.1345125266.git.jan.kiszka@siemens.com> X-Mailer: git-send-email 1.7.3.4 In-Reply-To: References: In-Reply-To: References: Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Avoid passing kvm_assigned_irq on INTx assignment and separate this function from (to-be-refactored) MSI/MSI-X assignment. Signed-off-by: Jan Kiszka --- hw/device-assignment.c | 16 ++++++---------- target-i386/kvm.c | 24 ++++++++++++++++++++++++ target-i386/kvm_i386.h | 2 ++ 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/hw/device-assignment.c b/hw/device-assignment.c index 0b33c04..d448fdc 100644 --- a/hw/device-assignment.c +++ b/hw/device-assignment.c @@ -861,11 +861,10 @@ static int assign_device(AssignedDevice *dev) static int assign_intx(AssignedDevice *dev) { - struct kvm_assigned_irq assigned_irq_data; AssignedIRQType new_type; PCIINTxRoute intx_route; bool intx_host_msi; - int r = 0; + int r; /* Interrupt PIN 0 means don't use INTx */ if (assigned_dev_pci_read_byte(&dev->dev, PCI_INTERRUPT_PIN) == 0) { @@ -881,7 +880,7 @@ static int assign_intx(AssignedDevice *dev) if (dev->intx_route.mode == intx_route.mode && dev->intx_route.irq == intx_route.irq) { - return r; + return 0; } switch (dev->assigned_irq_type) { @@ -911,20 +910,17 @@ static int assign_intx(AssignedDevice *dev) } retry: - memset(&assigned_irq_data, 0, sizeof(assigned_irq_data)); - assigned_irq_data.assigned_dev_id = dev->dev_id; - assigned_irq_data.guest_irq = intx_route.irq; - assigned_irq_data.flags = KVM_DEV_IRQ_GUEST_INTX; if (dev->features & ASSIGNED_DEVICE_PREFER_MSI_MASK && dev->cap.available & ASSIGNED_DEVICE_CAP_MSI) { - assigned_irq_data.flags |= KVM_DEV_IRQ_HOST_MSI; + intx_host_msi = true; new_type = ASSIGNED_IRQ_INTX_HOST_MSI; } else { - assigned_irq_data.flags |= KVM_DEV_IRQ_HOST_INTX; + intx_host_msi = false; new_type = ASSIGNED_IRQ_INTX_HOST_INTX; } - r = kvm_assign_irq(kvm_state, &assigned_irq_data); + r = kvm_device_intx_assign(kvm_state, dev->dev_id, intx_host_msi, + intx_route.irq); if (r < 0) { if (r == -EIO && !(dev->features & ASSIGNED_DEVICE_PREFER_MSI_MASK) && dev->cap.available & ASSIGNED_DEVICE_CAP_MSI) { diff --git a/target-i386/kvm.c b/target-i386/kvm.c index 058ed3f..e2041f4 100644 --- a/target-i386/kvm.c +++ b/target-i386/kvm.c @@ -2092,6 +2092,30 @@ int kvm_device_pci_deassign(KVMState *s, uint32_t dev_id) return kvm_vm_ioctl(s, KVM_DEASSIGN_PCI_DEVICE, &dev_data); } +static int kvm_assign_irq_internal(KVMState *s, uint32_t dev_id, + uint32_t irq_type, uint32_t guest_irq) +{ + struct kvm_assigned_irq assigned_irq; + + memset(&assigned_irq, 0, sizeof(assigned_irq)); + assigned_irq.assigned_dev_id = dev_id; + assigned_irq.guest_irq = guest_irq; + assigned_irq.flags = irq_type; + if (kvm_check_extension(s, KVM_CAP_ASSIGN_DEV_IRQ)) { + return kvm_vm_ioctl(s, KVM_ASSIGN_DEV_IRQ, &assigned_irq); + } else { + return kvm_vm_ioctl(s, KVM_ASSIGN_IRQ, &assigned_irq); + } +} + +int kvm_device_intx_assign(KVMState *s, uint32_t dev_id, bool use_host_msi, + uint32_t guest_irq) +{ + uint32_t irq_type = KVM_DEV_IRQ_GUEST_INTX | + (use_host_msi ? KVM_DEV_IRQ_HOST_MSI : KVM_DEV_IRQ_HOST_INTX); + return kvm_assign_irq_internal(s, dev_id, irq_type, guest_irq); +} + static int kvm_deassign_irq_internal(KVMState *s, uint32_t dev_id, uint32_t type) { diff --git a/target-i386/kvm_i386.h b/target-i386/kvm_i386.h index fdecdd5..5a24168 100644 --- a/target-i386/kvm_i386.h +++ b/target-i386/kvm_i386.h @@ -19,6 +19,8 @@ int kvm_device_pci_assign(KVMState *s, PCIHostDeviceAddress *dev_addr, uint32_t flags, uint32_t *dev_id); int kvm_device_pci_deassign(KVMState *s, uint32_t dev_id); +int kvm_device_intx_assign(KVMState *s, uint32_t dev_id, + bool use_host_msi, uint32_t guest_irq); int kvm_device_intx_deassign(KVMState *s, uint32_t dev_id, bool use_host_msi); int kvm_device_msi_deassign(KVMState *s, uint32_t dev_id);