the vfio_pci_hot_reset differentiate the single and multi in-used devices for reset. but sometimes we own the group without any devices, that also should support hot reset.
Signed-off-by: Chen Fan <chen.fan.f...@cn.fujitsu.com> --- hw/vfio/pci.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c index a4e8658..6507f39 100644 --- a/hw/vfio/pci.c +++ b/hw/vfio/pci.c @@ -3398,6 +3398,7 @@ static int vfio_pci_hot_reset(VFIOPCIDevice *vdev, bool single) PCIHostDeviceAddress host; VFIOPCIDevice *tmp; VFIODevice *vbasedev_iter; + bool found; host.domain = devices[i].segment; host.bus = devices[i].bus; @@ -3427,6 +3428,7 @@ static int vfio_pci_hot_reset(VFIOPCIDevice *vdev, bool single) goto out; } + found = false; /* Prep dependent devices for reset and clear our marker. */ QLIST_FOREACH(vbasedev_iter, &group->device_list, next) { if (vbasedev_iter->type != VFIO_DEVICE_TYPE_PCI) { @@ -3438,12 +3440,21 @@ static int vfio_pci_hot_reset(VFIOPCIDevice *vdev, bool single) ret = -EINVAL; goto out_single; } + found = true; vfio_pci_pre_reset(tmp); tmp->vbasedev.needs_reset = false; multi = true; break; } } + + /* + * If we own the group but does not own the device, we also + * should call hot reset with multi. + */ + if (!single && !found) { + multi = true; + } } if (!single && !multi) { -- 1.9.3