* [PATCH 0/3] virtio-pci: Checks for virtio device presence on the bus.
@ 2021-06-09 9:58 Andrew Melnychenko
2021-06-09 9:58 ` [PATCH 1/3] virtio-pci: Added check for virtio device presence in mm callbacks Andrew Melnychenko
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Andrew Melnychenko @ 2021-06-09 9:58 UTC (permalink / raw)
To: mst; +Cc: qemu-devel
At some point, after unplugging virtio-pci the virtio device may be unrealised,
but the memory regions may be present in flatview. So, it's a possible situation
when memory region's callbacks are called for "unplugged" device.
In patches were added checks for virtio device presence on virtio-bus.
Added checks in PCI config callbacks. Also changed return values in memory
regions read if virtio not present.
BZ link https://bugzilla.redhat.com/show_bug.cgi?id=1938042
The issue similar to https://bugzilla.redhat.com/show_bug.cgi?id=1743098
Backtrace:
at ../hw/virtio/virtio-pci.c:1271
proxy = 0x560b535f8bf0
vdev = 0x0
(mr=<optimized out>, addr=<optimized out>, value=<optimized out>, size=<optimized out>, shift=<optimized out>, mask=<optimized out>, attrs=...) at ../softmmu/memory.c:491
tmp = <optimized out>
(addr=addr@entry=22, value=value@entry=0x7fd743dfe518, size=size@entry=2, access_size_min=<optimized out>, access_size_max=<optimized out>, access_fn=0x560b513fc500 <memory_region_write_accessor>, mr=0x560b535f95d0, attrs=...) at ../softmmu/memory.c:552
access_mask = 65535
access_size = 2
i = <optimized out>
r = 0
(mr=mr@entry=0x560b535f95d0, addr=22, data=<optimized out>, op=<optimized out>, attrs=attrs@entry=...) at ../softmmu/memory.c:1501
size = 2
(fv=fv@entry=0x7fd6f005d3b0, addr=addr@entry=4246716438, attrs=..., ptr=ptr@entry=0x7fe69b2b0028, len=len@entry=2, addr1=<optimized out>, l=<optimized out>, mr=0x560b535f95d0)
at /usr/src/debug/qemu-kvm-5.2.0-11.module+el8.4.0+10268+62bcbbed.x86_64/include/qemu/host-utils.h:164
ram_ptr = <optimized out>
val = <optimized out>
result = 0
release_lock = true
buf = 0x7fe69b2b0028 ""
at ../softmmu/physmem.c:2799
l = 2
addr1 = 22
mr = <optimized out>
result = 0
_rcu_read_auto = 0x1
result = 0
fv = <optimized out>
attrs = {unspecified = 0, secure = 0, user = 0, requester_id = 0, byte_swap = 0, target_tlb_bit0 = 0, target_tlb_bit1 = 0, target_tlb_bit2 = 0}
run = <optimized out>
ret = <optimized out>
run_ret = 0
cpu = 0x560b522738d0
r = <optimized out>
__clframe = {__cancel_routine = <optimized out>, __cancel_arg = 0x0, __do_it = 1, __cancel_type = <optimized out>}
qemu_thread_args = 0x560b5229a6f0
start_routine = 0x560b513faeb0 <kvm_vcpu_thread_fn>
arg = 0x560b522738d0
r = <optimized out>
Andrew Melnychenko (3):
virtio-pci: Added check for virtio device presence in mm callbacks.
virtio-pci: Added check for virtio device in PCI config cbs.
virtio-pci: Changed return values for "notify", "device" and "isr"
read.
hw/virtio/virtio-pci.c | 27 +++++++++++++++++++++++++--
1 file changed, 25 insertions(+), 2 deletions(-)
--
2.31.1
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 1/3] virtio-pci: Added check for virtio device presence in mm callbacks.
2021-06-09 9:58 [PATCH 0/3] virtio-pci: Checks for virtio device presence on the bus Andrew Melnychenko
@ 2021-06-09 9:58 ` Andrew Melnychenko
2021-06-09 9:58 ` [PATCH 2/3] virtio-pci: Added check for virtio device in PCI config cbs Andrew Melnychenko
2021-06-09 9:58 ` [PATCH 3/3] virtio-pci: Changed return values for "notify", "device" and "isr" read Andrew Melnychenko
2 siblings, 0 replies; 4+ messages in thread
From: Andrew Melnychenko @ 2021-06-09 9:58 UTC (permalink / raw)
To: mst; +Cc: qemu-devel
During unplug the virtio device is unplugged from virtio-bus on pci. In some cases,
requests to virtio-pci mm may acquire during/after unplug. Added check that virtio
device is on the bus, for "common" memory region.
Signed-off-by: Andrew Melnychenko <andrew@daynix.com>
---
hw/virtio/virtio-pci.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
index b321604d9b..05865b1fcb 100644
--- a/hw/virtio/virtio-pci.c
+++ b/hw/virtio/virtio-pci.c
@@ -1146,6 +1146,10 @@ static uint64_t virtio_pci_common_read(void *opaque, hwaddr addr,
uint32_t val = 0;
int i;
+ if (vdev == NULL) {
+ return UINT64_MAX;
+ }
+
switch (addr) {
case VIRTIO_PCI_COMMON_DFSELECT:
val = proxy->dfselect;
@@ -1229,6 +1233,10 @@ static void virtio_pci_common_write(void *opaque, hwaddr addr,
VirtIOPCIProxy *proxy = opaque;
VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
+ if (vdev == NULL) {
+ return;
+ }
+
switch (addr) {
case VIRTIO_PCI_COMMON_DFSELECT:
proxy->dfselect = val;
--
2.31.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 2/3] virtio-pci: Added check for virtio device in PCI config cbs.
2021-06-09 9:58 [PATCH 0/3] virtio-pci: Checks for virtio device presence on the bus Andrew Melnychenko
2021-06-09 9:58 ` [PATCH 1/3] virtio-pci: Added check for virtio device presence in mm callbacks Andrew Melnychenko
@ 2021-06-09 9:58 ` Andrew Melnychenko
2021-06-09 9:58 ` [PATCH 3/3] virtio-pci: Changed return values for "notify", "device" and "isr" read Andrew Melnychenko
2 siblings, 0 replies; 4+ messages in thread
From: Andrew Melnychenko @ 2021-06-09 9:58 UTC (permalink / raw)
To: mst; +Cc: qemu-devel
Now, if virtio device is not present on virtio-bus - pci config callbacks
will not lead to possible crush. The read will return "-1" which should be
interpreted by a driver that pci device may be unplugged.
Signed-off-by: Andrew Melnychenko <andrew@daynix.com>
---
hw/virtio/virtio-pci.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
index 05865b1fcb..186b7bc0f6 100644
--- a/hw/virtio/virtio-pci.c
+++ b/hw/virtio/virtio-pci.c
@@ -423,6 +423,11 @@ static uint64_t virtio_pci_config_read(void *opaque, hwaddr addr,
VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
uint32_t config = VIRTIO_PCI_CONFIG_SIZE(&proxy->pci_dev);
uint64_t val = 0;
+
+ if (vdev == NULL) {
+ return UINT64_MAX;
+ }
+
if (addr < config) {
return virtio_ioport_read(proxy, addr);
}
@@ -454,6 +459,11 @@ static void virtio_pci_config_write(void *opaque, hwaddr addr,
VirtIOPCIProxy *proxy = opaque;
uint32_t config = VIRTIO_PCI_CONFIG_SIZE(&proxy->pci_dev);
VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
+
+ if (vdev == NULL) {
+ return;
+ }
+
if (addr < config) {
virtio_ioport_write(proxy, addr, val);
return;
--
2.31.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 3/3] virtio-pci: Changed return values for "notify", "device" and "isr" read.
2021-06-09 9:58 [PATCH 0/3] virtio-pci: Checks for virtio device presence on the bus Andrew Melnychenko
2021-06-09 9:58 ` [PATCH 1/3] virtio-pci: Added check for virtio device presence in mm callbacks Andrew Melnychenko
2021-06-09 9:58 ` [PATCH 2/3] virtio-pci: Added check for virtio device in PCI config cbs Andrew Melnychenko
@ 2021-06-09 9:58 ` Andrew Melnychenko
2 siblings, 0 replies; 4+ messages in thread
From: Andrew Melnychenko @ 2021-06-09 9:58 UTC (permalink / raw)
To: mst; +Cc: qemu-devel
Added check for "notify" memory region. Now reads will return "-1" if a virtio
device is not present on a virtio bus.
Signed-off-by: Andrew Melnychenko <andrew@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 186b7bc0f6..447f13beae 100644
--- a/hw/virtio/virtio-pci.c
+++ b/hw/virtio/virtio-pci.c
@@ -1348,6 +1348,11 @@ static void virtio_pci_common_write(void *opaque, hwaddr addr,
static uint64_t virtio_pci_notify_read(void *opaque, hwaddr addr,
unsigned size)
{
+ VirtIOPCIProxy *proxy = opaque;
+ if (virtio_bus_get_device(&proxy->bus) == NULL) {
+ return UINT64_MAX;
+ }
+
return 0;
}
@@ -1385,7 +1390,7 @@ static uint64_t virtio_pci_isr_read(void *opaque, hwaddr addr,
uint64_t val;
if (vdev == NULL) {
- return 0;
+ return UINT64_MAX;
}
val = qatomic_xchg(&vdev->isr, 0);
@@ -1406,7 +1411,7 @@ static uint64_t virtio_pci_device_read(void *opaque, hwaddr addr,
uint64_t val;
if (vdev == NULL) {
- return 0;
+ return UINT64_MAX;
}
switch (size) {
--
2.31.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2021-06-09 10:03 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-09 9:58 [PATCH 0/3] virtio-pci: Checks for virtio device presence on the bus Andrew Melnychenko
2021-06-09 9:58 ` [PATCH 1/3] virtio-pci: Added check for virtio device presence in mm callbacks Andrew Melnychenko
2021-06-09 9:58 ` [PATCH 2/3] virtio-pci: Added check for virtio device in PCI config cbs Andrew Melnychenko
2021-06-09 9:58 ` [PATCH 3/3] virtio-pci: Changed return values for "notify", "device" and "isr" read Andrew Melnychenko
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.