From: Alex Williamson <alex.williamson@redhat.com>
To: Jan Kiszka <jan.kiszka@web.de>
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 09:35:34 -0600 [thread overview]
Message-ID: <1344008134.8003.34.camel@ul30vt> (raw)
In-Reply-To: <501BAD72.4020105@web.de>
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.
Acked-by: Alex Williamson <alex.williamson@redhat.com>
next prev parent reply other threads:[~2012-08-03 15:35 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 [this message]
2012-08-03 17:04 ` Jan Kiszka
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=1344008134.8003.34.camel@ul30vt \
--to=alex.williamson@redhat.com \
--cc=avi@redhat.com \
--cc=jan.kiszka@web.de \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.