qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [RFC v9 08/18] vfio: improve vfio_get_group to support addi


From: Chen Fan
Subject: [Qemu-devel] [RFC v9 08/18] vfio: improve vfio_get_group to support adding group without devices
Date: Tue, 9 Jun 2015 11:37:36 +0800

Pre-adding all affected groups for aer devices, it could
ensure the affected groups are owned in VM.

Signed-off-by: Chen Fan <address@hidden>
---
 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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]