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

[libvirt] [PATCH 19/22] virsh: add option to attach entire group of devices



If --group is specified on the virsh nodedev-reattach commandline, the
flag VIR_NODE_DEVICE_REATTACH_GROUP is used and the new
virNodeDeviceReAttachFlags() API is called (instead of
virNodeDeviceReAttach()). This causes the following change in behavior
(only if the given device is currently attached to the vfio-pci
driver):

1) If any device in the same iommu group as the given device is still
   in use by a domain, no reattachment of any device is performed
   (i.e. this device remains attached to vfio-pci), and an error is
   reported.

2) If none of the devices in the same iommu group as the given device
   are in use by a domain, then *all* devices that are currently
   attached to vfio-pci are re-attached to their respective host
   drivers (any devices that are currently attached to pci-stub or
   pcieport will remain attached to those drivers).
---
 tools/virsh-nodedev.c | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/tools/virsh-nodedev.c b/tools/virsh-nodedev.c
index 39f74f2..8282129 100644
--- a/tools/virsh-nodedev.c
+++ b/tools/virsh-nodedev.c
@@ -677,6 +677,10 @@ static const vshCmdOptDef opts_node_device_reattach[] = {
      .flags = VSH_OFLAG_REQ,
      .help = N_("device key")
     },
+    {.name = "group",
+     .type = VSH_OT_BOOL,
+     .help = N_("re-attach all devices in the same IOMMU group, but only if none are in use")
+    },
     {.name = NULL}
 };
 
@@ -685,6 +689,7 @@ cmdNodeDeviceReAttach(vshControl *ctl, const vshCmd *cmd)
 {
     const char *name = NULL;
     virNodeDevicePtr device;
+    bool group = vshCommandOptBool(cmd, "group");
     bool ret = true;
 
     if (vshCommandOptStringReq(ctl, cmd, "device", &name) < 0)
@@ -695,7 +700,17 @@ cmdNodeDeviceReAttach(vshControl *ctl, const vshCmd *cmd)
         return false;
     }
 
-    if (virNodeDeviceReAttach(device) == 0) {
+    if (group) {
+        unsigned int flags = VIR_NODE_DEVICE_REATTACH_GROUP;
+
+        if (virNodeDeviceReAttachFlags(device, flags) < 0)
+            ret = false;
+    } else {
+        if (virNodeDeviceReAttach(device) < 0)
+            ret = false;
+    }
+
+    if (ret) {
         vshPrint(ctl, _("Device %s re-attached\n"), name);
     } else {
         vshError(ctl, _("Failed to re-attach device %s"), name);
-- 
1.7.11.7


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