From: Jan Kiszka <jan.kiszka@web.de>
To: Alex Williamson <alex.williamson@redhat.com>
Cc: Avi Kivity <avi@redhat.com>,
Marcelo Tosatti <mtosatti@redhat.com>, kvm <kvm@vger.kernel.org>
Subject: Re: [PATCH 2/2] pci-assign: Use pci_device_set_intx_routing_notifier
Date: Fri, 03 Aug 2012 19:04:12 +0200 [thread overview]
Message-ID: <501C048C.5000600@web.de> (raw)
In-Reply-To: <1344008134.8003.34.camel@ul30vt>
[-- Attachment #1: Type: text/plain, Size: 9632 bytes --]
On 2012-08-03 17:35, Alex Williamson wrote:
> On Fri, 2012-08-03 at 12:52 +0200, Jan Kiszka wrote:
>> From: Jan Kiszka <jan.kiszka@siemens.com>
>>
>> Replace the hack in pci_default_write_config with upstream's generic
>> callback mechanism to get informed about changes on the PCI INTx
>> routing.
>>
>> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
>> ---
>> hw/Makefile.objs | 3 +--
>> hw/device-assignment.c | 48 ++++++++++++++++--------------------------------
>> hw/device-assignment.h | 33 ---------------------------------
>> hw/pc.h | 3 ---
>> hw/pci.c | 11 -----------
>> hw/piix_pci.c | 3 ---
>> 6 files changed, 17 insertions(+), 84 deletions(-)
>> delete mode 100644 hw/device-assignment.h
>>
>> diff --git a/hw/Makefile.objs b/hw/Makefile.objs
>> index 30f9ba6..fa8bb08 100644
>> --- a/hw/Makefile.objs
>> +++ b/hw/Makefile.objs
>> @@ -3,7 +3,7 @@ hw-obj-y += loader.o
>> hw-obj-$(CONFIG_VIRTIO) += virtio-console.o
>> hw-obj-$(CONFIG_VIRTIO_PCI) += virtio-pci.o
>> hw-obj-y += fw_cfg.o
>> -hw-obj-$(CONFIG_PCI) += pci_bridge.o pci_bridge_dev.o
>> +hw-obj-$(CONFIG_PCI) += pci.o pci_bridge.o pci_bridge_dev.o
>> hw-obj-$(CONFIG_PCI) += msix.o msi.o
>> hw-obj-$(CONFIG_PCI) += shpc.o
>> hw-obj-$(CONFIG_PCI) += slotid_cap.o
>> @@ -164,7 +164,6 @@ obj-$(CONFIG_SOFTMMU) += vhost_net.o
>> obj-$(CONFIG_VHOST_NET) += vhost.o
>> obj-$(CONFIG_REALLY_VIRTFS) += 9pfs/
>> obj-$(CONFIG_NO_PCI) += pci-stub.o
>> -obj-$(CONFIG_PCI) += pci.o
>> obj-$(CONFIG_VGA) += vga.o
>> obj-$(CONFIG_SOFTMMU) += device-hotplug.o
>> obj-$(CONFIG_XEN) += xen_domainbuild.o xen_machine_pv.o
>> diff --git a/hw/device-assignment.c b/hw/device-assignment.c
>> index d14c327..7a90027 100644
>> --- a/hw/device-assignment.c
>> +++ b/hw/device-assignment.c
>> @@ -36,7 +36,6 @@
>> #include "pc.h"
>> #include "qemu-error.h"
>> #include "console.h"
>> -#include "device-assignment.h"
>> #include "loader.h"
>> #include "monitor.h"
>> #include "range.h"
>> @@ -143,6 +142,8 @@ typedef struct AssignedDevice {
>> QLIST_ENTRY(AssignedDevice) next;
>> } AssignedDevice;
>>
>> +static void assigned_dev_update_irq_routing(PCIDevice *dev);
>> +
>> static void assigned_dev_load_option_rom(AssignedDevice *dev);
>>
>> static void assigned_dev_unregister_msix_mmio(AssignedDevice *dev);
>> @@ -869,8 +870,13 @@ static int assign_irq(AssignedDevice *dev)
>> int r = 0;
>>
>> /* Interrupt PIN 0 means don't use INTx */
>> - if (assigned_dev_pci_read_byte(&dev->dev, PCI_INTERRUPT_PIN) == 0)
>> + if (assigned_dev_pci_read_byte(&dev->dev, PCI_INTERRUPT_PIN) == 0) {
>> + pci_device_set_intx_routing_notifier(&dev->dev, NULL);
>> return 0;
>> + }
>> +
>> + pci_device_set_intx_routing_notifier(&dev->dev,
>> + assigned_dev_update_irq_routing);
>>
>> intx_route = pci_device_route_intx_to_irq(&dev->dev, 0);
>> assert(intx_route.mode != PCI_INTX_INVERTED);
>> @@ -944,43 +950,19 @@ static void deassign_device(AssignedDevice *dev)
>> dev->dev.qdev.id, strerror(-r));
>> }
>>
>> -#if 0
>> -AssignedDevInfo *get_assigned_device(int pcibus, int slot)
>> -{
>> - AssignedDevice *assigned_dev = NULL;
>> - AssignedDevInfo *adev = NULL;
>> -
>> - QLIST_FOREACH(adev, &adev_head, next) {
>> - assigned_dev = adev->assigned_dev;
>> - if (pci_bus_num(assigned_dev->dev.bus) == pcibus &&
>> - PCI_SLOT(assigned_dev->dev.devfn) == slot)
>> - return adev;
>> - }
>> -
>> - return NULL;
>> -}
>> -#endif
>> -
>> /* The pci config space got updated. Check if irq numbers have changed
>> * for our devices
>> */
>> -void assigned_dev_update_irqs(void)
>> +static void assigned_dev_update_irq_routing(PCIDevice *dev)
>> {
>> - AssignedDevice *dev, *next;
>> + AssignedDevice *assigned_dev = DO_UPCAST(AssignedDevice, dev, dev);
>> Error *err = NULL;
>> int r;
>>
>> - dev = QLIST_FIRST(&devs);
>> - while (dev) {
>> - next = QLIST_NEXT(dev, next);
>> - if (dev->irq_requested_type & KVM_DEV_IRQ_HOST_INTX) {
>> - r = assign_irq(dev);
>> - if (r < 0) {
>> - qdev_unplug(&dev->dev.qdev, &err);
>> - assert(!err);
>> - }
>> - }
>> - dev = next;
>> + r = assign_irq(assigned_dev);
>> + if (r < 0) {
>> + qdev_unplug(&dev->qdev, &err);
>> + assert(!err);
>> }
>> }
>>
>> @@ -1009,6 +991,7 @@ static void assigned_dev_update_msi(PCIDevice *pci_dev)
>> perror("assigned_dev_update_msi: deassign irq");
>>
>> assigned_dev->irq_requested_type = 0;
>> + pci_device_set_intx_routing_notifier(pci_dev, NULL);
>> }
>>
>> if (ctrl_byte & PCI_MSI_FLAGS_ENABLE) {
>> @@ -1151,6 +1134,7 @@ static void assigned_dev_update_msix(PCIDevice *pci_dev)
>> perror("assigned_dev_update_msix: deassign irq");
>>
>> assigned_dev->irq_requested_type = 0;
>> + pci_device_set_intx_routing_notifier(pci_dev, NULL);
>> }
>>
>> if (ctrl_word & PCI_MSIX_FLAGS_ENABLE) {
>> diff --git a/hw/device-assignment.h b/hw/device-assignment.h
>> deleted file mode 100644
>> index 3fcb804..0000000
>> --- a/hw/device-assignment.h
>> +++ /dev/null
>> @@ -1,33 +0,0 @@
>> -/*
>> - * Copyright (c) 2007, Neocleus Corporation.
>> - * Copyright (c) 2007, Intel Corporation.
>> - *
>> - * This program is free software; you can redistribute it and/or modify it
>> - * under the terms and conditions of the GNU General Public License,
>> - * version 2, as published by the Free Software Foundation.
>> - *
>> - * This program is distributed in the hope it will be useful, but WITHOUT
>> - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
>> - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
>> - * more details.
>> - *
>> - * You should have received a copy of the GNU General Public License along with
>> - * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
>> - * Place - Suite 330, Boston, MA 02111-1307 USA.
>> - *
>> - * Data structures for storing PCI state
>> - *
>> - * Adapted to kvm by Qumranet
>> - *
>> - * Copyright (c) 2007, Neocleus, Alex Novik (alex@neocleus.com)
>> - * Copyright (c) 2007, Neocleus, Guy Zana (guy@neocleus.com)
>> - * Copyright (C) 2008, Qumranet, Amit Shah (amit.shah@qumranet.com)
>> - * Copyright (C) 2008, Red Hat, Amit Shah (amit.shah@redhat.com)
>> - */
>> -
>> -#ifndef __DEVICE_ASSIGNMENT_H__
>> -#define __DEVICE_ASSIGNMENT_H__
>> -
>> -void assigned_dev_update_irqs(void);
>> -
>> -#endif /* __DEVICE_ASSIGNMENT_H__ */
>> diff --git a/hw/pc.h b/hw/pc.h
>> index 5b36eb5..31ccb6f 100644
>> --- a/hw/pc.h
>> +++ b/hw/pc.h
>> @@ -149,9 +149,6 @@ void piix4_smbus_register_device(SMBusDevice *dev, uint8_t addr);
>> extern int no_hpet;
>>
>> /* piix_pci.c */
>> -/* config space register for IRQ routing */
>> -#define PIIX_CONFIG_IRQ_ROUTE 0x60
>> -
>> struct PCII440FXState;
>> typedef struct PCII440FXState PCII440FXState;
>>
>> diff --git a/hw/pci.c b/hw/pci.c
>> index 0b22913..4d95984 100644
>> --- a/hw/pci.c
>> +++ b/hw/pci.c
>> @@ -29,9 +29,6 @@
>> #include "net.h"
>> #include "sysemu.h"
>> #include "loader.h"
>> -#include "hw/pc.h"
>> -#include "kvm.h"
>> -#include "device-assignment.h"
>> #include "range.h"
>> #include "qmp-commands.h"
>> #include "msi.h"
>> @@ -1048,14 +1045,6 @@ void pci_default_write_config(PCIDevice *d, uint32_t addr, uint32_t val, int l)
>> d->config[addr + i] = (d->config[addr + i] & ~wmask) | (val & wmask);
>> d->config[addr + i] &= ~(val & w1cmask); /* W1C: Write 1 to Clear */
>> }
>> -
>> -#ifdef CONFIG_KVM_DEVICE_ASSIGNMENT
>> - if (kvm_enabled() && kvm_irqchip_in_kernel() &&
>> - addr >= PIIX_CONFIG_IRQ_ROUTE &&
>> - addr < PIIX_CONFIG_IRQ_ROUTE + 4)
>> - assigned_dev_update_irqs();
>> -#endif /* CONFIG_KVM_DEVICE_ASSIGNMENT */
>> -
>> if (ranges_overlap(addr, l, PCI_BASE_ADDRESS_0, 24) ||
>> ranges_overlap(addr, l, PCI_ROM_ADDRESS, 4) ||
>> ranges_overlap(addr, l, PCI_ROM_ADDRESS1, 4) ||
>> diff --git a/hw/piix_pci.c b/hw/piix_pci.c
>> index 355814f..c497a01 100644
>> --- a/hw/piix_pci.c
>> +++ b/hw/piix_pci.c
>> @@ -250,8 +250,6 @@ static int i440fx_initfn(PCIDevice *dev)
>> return 0;
>> }
>>
>> -static PIIX3State *piix3_dev;
>> -
>> static PCIBus *i440fx_common_init(const char *device_name,
>> PCII440FXState **pi440fx_state,
>> int *piix3_devfn,
>> @@ -331,7 +329,6 @@ static PCIBus *i440fx_common_init(const char *device_name,
>> ram_size = 255;
>> (*pi440fx_state)->dev.config[0x57]=ram_size;
>>
>> - piix3_dev = piix3;
>> i440fx_update_memory_mappings(f);
>>
>> return b;
>
> For vfio I chose to leave the intx routing notifier in place for msi &
> msix as we can easily ignore it when not using intx. I don't see much
> advantage to one over the other though.
Probably. When you don't disable, then you have to check in the callback
if the IRQ is actually registered, but that's a nit as well.
>
> Acked-by: Alex Williamson <alex.williamson@redhat.com>
>
Thanks,
Jan
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 262 bytes --]
next prev parent reply other threads:[~2012-08-03 17:04 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-03 10:51 [PATCH 1/2] pci-assign: Switch to pci_device_route_intx_to_irq interface Jan Kiszka
2012-08-03 10:52 ` [PATCH 2/2] pci-assign: Use pci_device_set_intx_routing_notifier Jan Kiszka
2012-08-03 15:35 ` Alex Williamson
2012-08-03 17:04 ` Jan Kiszka [this message]
2012-08-03 15:26 ` [PATCH 1/2] pci-assign: Switch to pci_device_route_intx_to_irq interface Alex Williamson
2012-08-03 17:02 ` [PATCH v2 " Jan Kiszka
2012-08-03 17:12 ` Alex Williamson
2012-08-13 19:29 ` Marcelo Tosatti
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=501C048C.5000600@web.de \
--to=jan.kiszka@web.de \
--cc=alex.williamson@redhat.com \
--cc=avi@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=mtosatti@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).