Message ID | 20210315115937.14286-2-yuri.benditovich@daynix.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | virtio-pci: add check for vdev in virtio_pci_isr_read | expand |
Ping On Mon, Mar 15, 2021 at 1:59 PM Yuri Benditovich <yuri.benditovich@daynix.com> wrote: > > https://bugzilla.redhat.com/show_bug.cgi?id=1743098 > This commit completes the solution of segfault in hot unplug flow > (by commit ccec7e9603f446fe75c6c563ba335c00cfda6a06). > Added missing check for vdev in virtio_pci_isr_read. > Typical stack of crash: > virtio_pci_isr_read ../hw/virtio/virtio-pci.c:1365 with proxy-vdev = 0 > memory_region_read_accessor at ../softmmu/memory.c:442 > access_with_adjusted_size at ../softmmu/memory.c:552 > memory_region_dispatch_read1 at ../softmmu/memory.c:1420 > memory_region_dispatch_read at ../softmmu/memory.c:1449 > flatview_read_continue at ../softmmu/physmem.c:2822 > flatview_read at ../softmmu/physmem.c:2862 > address_space_read_full at ../softmmu/physmem.c:2875 > > Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com> > --- > hw/virtio/virtio-pci.c | 9 +++++++-- > 1 file changed, 7 insertions(+), 2 deletions(-) > > diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c > index 883045a223..4a3dcee771 100644 > --- a/hw/virtio/virtio-pci.c > +++ b/hw/virtio/virtio-pci.c > @@ -1364,9 +1364,14 @@ static uint64_t virtio_pci_isr_read(void *opaque, hwaddr addr, > { > VirtIOPCIProxy *proxy = opaque; > VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); > - uint64_t val = qatomic_xchg(&vdev->isr, 0); > - pci_irq_deassert(&proxy->pci_dev); > + uint64_t val; > + > + if (vdev == NULL) { > + return 0; > + } > > + val = qatomic_xchg(&vdev->isr, 0); > + pci_irq_deassert(&proxy->pci_dev); > return val; > } > > -- > 2.17.1 >
diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c index 883045a223..4a3dcee771 100644 --- a/hw/virtio/virtio-pci.c +++ b/hw/virtio/virtio-pci.c @@ -1364,9 +1364,14 @@ static uint64_t virtio_pci_isr_read(void *opaque, hwaddr addr, { VirtIOPCIProxy *proxy = opaque; VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); - uint64_t val = qatomic_xchg(&vdev->isr, 0); - pci_irq_deassert(&proxy->pci_dev); + uint64_t val; + + if (vdev == NULL) { + return 0; + } + val = qatomic_xchg(&vdev->isr, 0); + pci_irq_deassert(&proxy->pci_dev); return val; }
https://bugzilla.redhat.com/show_bug.cgi?id=1743098 This commit completes the solution of segfault in hot unplug flow (by commit ccec7e9603f446fe75c6c563ba335c00cfda6a06). Added missing check for vdev in virtio_pci_isr_read. Typical stack of crash: virtio_pci_isr_read ../hw/virtio/virtio-pci.c:1365 with proxy-vdev = 0 memory_region_read_accessor at ../softmmu/memory.c:442 access_with_adjusted_size at ../softmmu/memory.c:552 memory_region_dispatch_read1 at ../softmmu/memory.c:1420 memory_region_dispatch_read at ../softmmu/memory.c:1449 flatview_read_continue at ../softmmu/physmem.c:2822 flatview_read at ../softmmu/physmem.c:2862 address_space_read_full at ../softmmu/physmem.c:2875 Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com> --- hw/virtio/virtio-pci.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)