From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60067) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z2APd-0003tm-FB for qemu-devel@nongnu.org; Mon, 08 Jun 2015 23:41:18 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Z2APZ-0000h7-8Y for qemu-devel@nongnu.org; Mon, 08 Jun 2015 23:41:17 -0400 Received: from [59.151.112.132] (port=46832 helo=heian.cn.fujitsu.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z2APY-0000VB-Ir for qemu-devel@nongnu.org; Mon, 08 Jun 2015 23:41:13 -0400 From: Chen Fan Date: Tue, 9 Jun 2015 11:37:36 +0800 Message-ID: In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain Subject: [Qemu-devel] [RFC v9 08/18] vfio: improve vfio_get_group to support adding group without devices List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: izumi.taku@jp.fujitsu.com, alex.williamson@redhat.com Pre-adding all affected groups for aer devices, it could ensure the affected groups are owned in VM. Signed-off-by: Chen Fan --- 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