On Tue, 2015-06-16 at 16:10 +0800, Chen Fan wrote: > On 06/10/2015 05:24 AM, Alex Williamson wrote: > > On Tue, 2015-06-09 at 11:37 +0800, Chen Fan wrote: > >> 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. > > Nope, did you try it? It can be done, but the group still needs to be > > connected to a container for isolation. > I'm sorry for that. because I have no such host in hand. but I think if > we can keep connect container for each affected group, we also able > to use this method to do host bus reset.
All you need is a dual-port card with isolation, which includes all Intel 1G NICs (igb & e1000e) as of the quirks that are currently in linux-next to be pushed for v4.2. Intel 10G NICs are already quirked upstream. There are certainly ways to fake isolation for testing as well. Thanks, Alex > >> 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) { > > > > > > > > >