From: Greg Kurz <groug@kaod.org>
To: David Gibson <david@gibson.dropbear.id.au>
Cc: kvm@vger.kernel.org, "Alexey Kardashevskiy" <aik@ozlabs.ru>,
"Jason Wang" <jasowang@redhat.com>,
"Riku Voipio" <riku.voipio@iki.fi>,
"Laurent Vivier" <laurent@vivier.eu>,
qemu-devel@nongnu.org,
"Alex Williamson" <alex.williamson@redhat.com>,
qemu-ppc@nongnu.org, clg@kaod.org,
"Marc-André Lureau" <marcandre.lureau@redhat.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
philmd@redhat.com
Subject: Re: [PATCH 3/5] vfio/pci: Respond to KVM irqchip change notifier
Date: Fri, 22 Nov 2019 06:12:57 +0100 [thread overview]
Message-ID: <20191122061257.7633bcdd@bahia.lan> (raw)
In-Reply-To: <20191121005607.274347-4-david@gibson.dropbear.id.au>
On Thu, 21 Nov 2019 11:56:05 +1100
David Gibson <david@gibson.dropbear.id.au> wrote:
> VFIO PCI devices already respond to the pci intx routing notifier, in order
> to update kernel irqchip mappings when routing is updated. However this
> won't handle the case where the irqchip itself is replaced by a different
> model while retaining the same routing. This case can happen on
> the pseries machine type due to PAPR feature negotiation.
>
> To handle that case, add a handler for the irqchip change notifier, which
> does much the same thing as the routing notifier, but is unconditional,
> rather than being a no-op when the routing hasn't changed.
>
> Cc: Alex Williamson <alex.williamson@redhat.com>
> Cc: Alexey Kardashevskiy <aik@ozlabs.ru>
>
> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> ---
> hw/vfio/pci.c | 23 ++++++++++++++++++-----
> hw/vfio/pci.h | 1 +
> 2 files changed, 19 insertions(+), 5 deletions(-)
>
> diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
> index 521289aa7d..95478c2c55 100644
> --- a/hw/vfio/pci.c
> +++ b/hw/vfio/pci.c
> @@ -256,6 +256,14 @@ static void vfio_intx_routing_notifier(PCIDevice *pdev)
> }
> }
>
> +static void vfio_irqchip_change(Notifier *notify, void *data)
> +{
> + VFIOPCIDevice *vdev = container_of(notify, VFIOPCIDevice,
> + irqchip_change_notifier);
> +
> + vfio_intx_update(vdev, &vdev->intx.route);
> +}
> +
> static int vfio_intx_enable(VFIOPCIDevice *vdev, Error **errp)
> {
> uint8_t pin = vfio_pci_read_config(&vdev->pdev, PCI_INTERRUPT_PIN, 1);
> @@ -2973,16 +2981,18 @@ static void vfio_realize(PCIDevice *pdev, Error **errp)
> vfio_intx_mmap_enable, vdev);
> pci_device_set_intx_routing_notifier(&vdev->pdev,
> vfio_intx_routing_notifier);
> + vdev->irqchip_change_notifier.notify = vfio_irqchip_change;
> + kvm_irqchip_add_change_notifier(&vdev->irqchip_change_notifier);
> ret = vfio_intx_enable(vdev, errp);
> if (ret) {
> - goto out_teardown;
> + goto out_deregister;
> }
> }
>
> if (vdev->display != ON_OFF_AUTO_OFF) {
> ret = vfio_display_probe(vdev, errp);
> if (ret) {
> - goto out_teardown;
> + goto out_deregister;
> }
> }
> if (vdev->enable_ramfb && vdev->dpy == NULL) {
> @@ -2992,11 +3002,11 @@ static void vfio_realize(PCIDevice *pdev, Error **errp)
> if (vdev->display_xres || vdev->display_yres) {
> if (vdev->dpy == NULL) {
> error_setg(errp, "xres and yres properties require display=on");
> - goto out_teardown;
> + goto out_deregister;
> }
> if (vdev->dpy->edid_regs == NULL) {
> error_setg(errp, "xres and yres properties need edid support");
> - goto out_teardown;
> + goto out_deregister;
> }
> }
>
After this change, we end up with:
if (vfio_pci_read_config(&vdev->pdev, PCI_INTERRUPT_PIN, 1)) {
vdev->intx.mmap_timer = timer_new_ms(QEMU_CLOCK_VIRTUAL,
vfio_intx_mmap_enable, vdev);
pci_device_set_intx_routing_notifier(&vdev->pdev,
vfio_intx_routing_notifier);
vdev->irqchip_change_notifier.notify = vfio_irqchip_change;
kvm_irqchip_add_change_notifier(&vdev->irqchip_change_notifier);
ret = vfio_intx_enable(vdev, errp);
if (ret) {
goto out_deregister;
}
}
if (vdev->display != ON_OFF_AUTO_OFF) {
ret = vfio_display_probe(vdev, errp);
if (ret) {
goto out_deregister;
}
}
if (vdev->enable_ramfb && vdev->dpy == NULL) {
error_setg(errp, "ramfb=on requires display=on");
goto out_teardown;
^^^^^^^^^^^^
This should be out_deregister.
The enable_ramfb property belongs to the nohotplug variant. It
means QEMU is going to terminate and we probably don't really
care to leak notifiers, but this still looks weird and fragile,
if enable_ramfb ever becomes usable by hotpluggable devices
one day.
}
if (vdev->display_xres || vdev->display_yres) {
if (vdev->dpy == NULL) {
error_setg(errp, "xres and yres properties require display=on");
goto out_deregister;
}
if (vdev->dpy->edid_regs == NULL) {
error_setg(errp, "xres and yres properties need edid support");
goto out_deregister;
}
}
> @@ -3020,8 +3030,10 @@ static void vfio_realize(PCIDevice *pdev, Error **errp)
>
> return;
>
> -out_teardown:
> +out_deregister:
> pci_device_set_intx_routing_notifier(&vdev->pdev, NULL);
> + kvm_irqchip_remove_change_notifier(&vdev->irqchip_change_notifier);
> +out_teardown:
> vfio_teardown_msi(vdev);
> vfio_bars_exit(vdev);
> error:
> @@ -3064,6 +3076,7 @@ static void vfio_exitfn(PCIDevice *pdev)
> vfio_unregister_req_notifier(vdev);
> vfio_unregister_err_notifier(vdev);
> pci_device_set_intx_routing_notifier(&vdev->pdev, NULL);
> + kvm_irqchip_remove_change_notifier(&vdev->irqchip_change_notifier);
> vfio_disable_interrupts(vdev);
> if (vdev->intx.mmap_timer) {
> timer_free(vdev->intx.mmap_timer);
> diff --git a/hw/vfio/pci.h b/hw/vfio/pci.h
> index b329d50338..35626cd63e 100644
> --- a/hw/vfio/pci.h
> +++ b/hw/vfio/pci.h
> @@ -169,6 +169,7 @@ typedef struct VFIOPCIDevice {
> bool enable_ramfb;
> VFIODisplay *dpy;
> Error *migration_blocker;
> + Notifier irqchip_change_notifier;
> } VFIOPCIDevice;
>
> uint32_t vfio_pci_read_config(PCIDevice *pdev, uint32_t addr, int len);
next prev parent reply other threads:[~2019-11-22 5:15 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-11-21 0:56 [PATCH 0/5] vfio/spapr: Handle changes of master irq chip for VFIO devices David Gibson
2019-11-21 0:56 ` [PATCH 1/5] kvm: Introduce KVM irqchip change notifier David Gibson
2019-11-21 0:56 ` [PATCH 2/5] vfio/pci: Split vfio_intx_update() David Gibson
2019-11-21 0:56 ` [PATCH 3/5] vfio/pci: Respond to KVM irqchip change notifier David Gibson
2019-11-22 5:12 ` Greg Kurz [this message]
2019-11-22 5:50 ` David Gibson
2019-11-21 0:56 ` [PATCH 4/5] spapr: Handle irq backend changes with VFIO PCI devices David Gibson
2019-11-21 16:35 ` Cédric Le Goater
2019-11-21 0:56 ` [PATCH 5/5] spapr: Work around spurious warnings from vfio INTx initialization David Gibson
2019-11-21 16:35 ` Cédric Le Goater
2019-11-21 16:57 ` [PATCH 0/5] vfio/spapr: Handle changes of master irq chip for VFIO devices Alex Williamson
2019-11-22 1:18 ` David Gibson
2019-11-22 1:28 ` Alex Williamson
2019-11-22 1:35 ` David Gibson
2019-11-22 6:09 ` Greg Kurz
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=20191122061257.7633bcdd@bahia.lan \
--to=groug@kaod.org \
--cc=aik@ozlabs.ru \
--cc=alex.williamson@redhat.com \
--cc=clg@kaod.org \
--cc=david@gibson.dropbear.id.au \
--cc=jasowang@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=laurent@vivier.eu \
--cc=marcandre.lureau@redhat.com \
--cc=pbonzini@redhat.com \
--cc=philmd@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
--cc=riku.voipio@iki.fi \
/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).