From patchwork Fri Aug 17 06:58:53 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Kiszka X-Patchwork-Id: 1337591 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 120FC3FC33 for ; Fri, 17 Aug 2012 07:00:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932869Ab2HQHAM (ORCPT ); Fri, 17 Aug 2012 03:00:12 -0400 Received: from thoth.sbs.de ([192.35.17.2]:30465 "EHLO thoth.sbs.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S964859Ab2HQG7X (ORCPT ); Fri, 17 Aug 2012 02:59:23 -0400 Received: from mail1.siemens.de (localhost [127.0.0.1]) by thoth.sbs.de (8.13.6/8.13.6) with ESMTP id q7H6xJhp020956; Fri, 17 Aug 2012 08:59:19 +0200 Received: from mchn199C.mchp.siemens.de.com ([146.254.78.141]) by mail1.siemens.de (8.13.6/8.13.6) with SMTP id q7H6xF6u015872; Fri, 17 Aug 2012 08:59:19 +0200 From: Jan Kiszka To: Avi Kivity , Marcelo Tosatti Cc: kvm@vger.kernel.org, Alex Williamson , "Michael S. Tsirkin" Subject: [PATCH v2 05/20] pci-assign: Factor out kvm_device_intx_assign Date: Fri, 17 Aug 2012 08:58:53 +0200 Message-Id: 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 | 25 +++++++++++++++++++++++++ target-i386/kvm_i386.h | 2 ++ 3 files changed, 33 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 82448e3..fbdcee6 100644 --- a/target-i386/kvm.c +++ b/target-i386/kvm.c @@ -2091,6 +2091,31 @@ 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 = { + .assigned_dev_id = dev_id, + .guest_irq = guest_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);