Pre-adding all affected groups for aer devices, it could ensure the affected groups are owned in VM.
Signed-off-by: Chen Fan <chen.fan.f...@cn.fujitsu.com> --- hw/vfio/common.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/hw/vfio/common.c b/hw/vfio/common.c index b1045da..4230f83 100644 --- a/hw/vfio/common.c +++ b/hw/vfio/common.c @@ -793,8 +793,15 @@ VFIOGroup *vfio_get_group(int groupid, AddressSpace *as) QLIST_FOREACH(group, &vfio_group_list, next) { if (group->groupid == groupid) { + if (as && !group->container) { + if (vfio_connect_container(group, as)) { + error_report("vfio: failed to setup container for group %d", + groupid); + return NULL; + } + } /* Found it. Now is it already in the right context? */ - if (group->container->space->as == as) { + if (!as || group->container->space->as == as) { return group; } else { error_report("vfio: group %d used in multiple address spaces", @@ -828,7 +835,7 @@ VFIOGroup *vfio_get_group(int groupid, AddressSpace *as) group->groupid = groupid; QLIST_INIT(&group->device_list); - if (vfio_connect_container(group, as)) { + if (as && vfio_connect_container(group, as)) { error_report("vfio: failed to setup container for group %d", groupid); goto close_fd_exit; } @@ -859,7 +866,9 @@ void vfio_put_group(VFIOGroup *group) } vfio_kvm_device_del_group(group); - vfio_disconnect_container(group); + if (group->container) { + vfio_disconnect_container(group); + } QLIST_REMOVE(group, next); trace_vfio_put_group(group->fd); close(group->fd); -- 1.9.3