Re: [PATCH 1/4] [kvm-autotest] cgroup-kvm: add_*_drive / rm_drive

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

 



I thought about that. But pci_add is not much stable and it's not supported in QMP (as far as I read) with a note that this way is buggy and should be rewritten completely. So I placed it here to let it develop and then I can move it into utils.

Regards,
Lukáš

Dne 10.10.2011 12:26, Jiri Zupka napsal(a):
This is useful function. This function can be in kvm utils.

----- Original Message -----
* functions for adding and removal of drive to vm using host-file or
    host-scsi_debug device.

Signed-off-by: Lukas Doktor<ldoktor@xxxxxxxxxx>
---
  client/tests/kvm/tests/cgroup.py |  125
  ++++++++++++++++++++++++++++++++-----
  1 files changed, 108 insertions(+), 17 deletions(-)

diff --git a/client/tests/kvm/tests/cgroup.py
b/client/tests/kvm/tests/cgroup.py
index b9a10ea..d6418b5 100644
--- a/client/tests/kvm/tests/cgroup.py
+++ b/client/tests/kvm/tests/cgroup.py
@@ -17,6 +17,108 @@ def run_cgroup(test, params, env):
      vms = None
      tests = None

+    # Func
+    def get_device_driver():
+        """
+        Discovers the used block device driver {ide, scsi,
virtio_blk}
+        @return: Used block device driver {ide, scsi, virtio}
+        """
+        if test.tagged_testname.count('virtio_blk'):
+            return "virtio"
+        elif test.tagged_testname.count('scsi'):
+            return "scsi"
+        else:
+            return "ide"
+
+
+    def add_file_drive(vm, driver=get_device_driver(),
host_file=None):
+        """
+        Hot-add a drive based on file to a vm
+        @param vm: Desired VM
+        @param driver: which driver should be used (default: same as
in test)
+        @param host_file: Which file on host is the image (default:
create new)
+        @return: Tupple(ret_file, device)
+                    ret_file: created file handler (None if not
created)
+                    device: PCI id of the virtual disk
+        """
+        if not host_file:
+            host_file =
tempfile.NamedTemporaryFile(prefix="cgroup-disk-",
+                                               suffix=".iso")
+            utils.system("dd if=/dev/zero of=%s bs=1M count=8
&>/dev/null"
+                         % (host_file.name))
+            ret_file = host_file
+        else:
+            ret_file = None
+
+        out = vm.monitor.cmd("pci_add auto storage
file=%s,if=%s,snapshot=off,"
+                             "cache=off" % (host_file.name, driver))
+        dev = re.search(r'OK domain (\d+), bus (\d+), slot (\d+),
function \d+',
+                        out)
+        if not dev:
+            raise error.TestFail("Can't add device(%s, %s, %s): %s"
% (vm,
+                                                host_file.name,
driver, out))
+        device = "%s:%s:%s" % dev.groups()
+        return (ret_file, device)
+
+
+    def add_scsi_drive(vm, driver=get_device_driver(),
host_file=None):
+        """
+        Hot-add a drive based on scsi_debug device to a vm
+        @param vm: Desired VM
+        @param driver: which driver should be used (default: same as
in test)
+        @param host_file: Which dev on host is the image (default:
create new)
+        @return: Tupple(ret_file, device)
+                    ret_file: string of the created dev (None if not
created)
+                    device: PCI id of the virtual disk
+        """
+        if not host_file:
+            if utils.system_output("lsmod | grep scsi_debug -c") ==
0:
+                utils.system("modprobe scsi_debug dev_size_mb=8
add_host=0")
+            utils.system("echo 1>
/sys/bus/pseudo/drivers/scsi_debug/add_host")
+            host_file = utils.system_output("ls /dev/sd* | tail -n
1")
+            # Enable idling in scsi_debug drive
+            utils.system("echo 1>  /sys/block/%s/queue/rotational" %
host_file)
+            ret_file = host_file
+        else:
+            # Don't remove this device during cleanup
+            # Reenable idling in scsi_debug drive (in case it's not)
+            utils.system("echo 1>  /sys/block/%s/queue/rotational" %
host_file)
+            ret_file = None
+
+        out = vm.monitor.cmd("pci_add auto storage
file=%s,if=%s,snapshot=off,"
+                             "cache=off" % (host_file, driver))
+        dev = re.search(r'OK domain (\d+), bus (\d+), slot (\d+),
function \d+',
+                        out)
+        if not dev:
+            raise error.TestFail("Can't add device(%s, %s, %s): %s"
% (vm,
+                                                        host_file,
driver, out))
+        device = "%s:%s:%s" % dev.groups()
+        return (ret_file, device)
+
+
+    def rm_drive(vm, host_file, device):
+        """
+        Remove drive from vm and device on disk
+        ! beware to remove scsi devices in reverse order !
+        """
+        vm.monitor.cmd("pci_del %s" % device)
+
+        if isinstance(host_file, file):     # file
+            host_file.close()
+        elif isinstance(host_file, str):    # scsi device
+            utils.system("echo -1>
/sys/bus/pseudo/drivers/scsi_debug/add_host")
+        else:        # custom file, do nothing
+            pass
+
+    def get_all_pids(ppid):
+        """
+        Get all PIDs of children/threads of parent ppid
+        param ppid: parent PID
+        return: list of PIDs of all children/threads of ppid
+        """
+        return (utils.system_output("ps -L --ppid=%d -o lwp" % ppid)
+
                                                        .split('\n')[1:])
+
      # Tests
      class _TestBlkioBandwidth:
          """
@@ -46,9 +148,8 @@ def run_cgroup(test, params, env):
              """
              err = ""
              try:
-                for i in range (2):
-                    vms[i].monitor.cmd("pci_del %s" %
self.devices[i])
-                    self.files[i].close()
+                for i in range(1, -1, -1):
+                    rm_drive(vms[i], self.files[i], self.devices[i])
              except Exception, failure_detail:
                  err += "\nCan't remove PCI drive: %s" %
                  failure_detail
              try:
@@ -89,8 +190,7 @@ def run_cgroup(test, params, env):
                  if blkio.set_cgroup(self.vms[i].get_shell_pid(),
                  pwd[i]):
                      raise error.TestError("Could not set cgroup")
                  # Move all existing threads into cgroup
-                for tmp in utils.system_output("ps -L --ppid=%d -o
lwp"
-                                %
self.vms[i].get_shell_pid()).split('\n')[1:]:
+                for tmp in
get_all_pids(self.vms[i].get_shell_pid()):
                      if blkio.set_cgroup(int(tmp), pwd[i]):
                          raise error.TestError("Could not set
                          cgroup")
              if self.blkio.set_property("blkio.weight", 100, pwd[0]):
@@ -101,18 +201,9 @@ def run_cgroup(test, params, env):
              # Add dummy drives
              # TODO: implement also using QMP.
              for i in range(2):
-                self.files.append(tempfile.NamedTemporaryFile(
-                                        prefix="cgroup-disk-",
-                                        suffix=".iso"))
-                utils.system("dd if=/dev/zero of=%s bs=1M count=10
&>/dev/null"
-                             % (self.files[i].name))
-                out = vms[i].monitor.cmd("pci_add auto storage
file=%s,"
-                                "if=virtio,snapshot=off,cache=off"
-                                % (self.files[i].name))
-                out = re.search(r'OK domain (\d+), bus (\d+), slot
(\d+), '
-                                 'function \d+', out).groups()
-                self.devices.append("%s:%s:%s" % out)
-
+                (host_file, device) = add_file_drive(vms[i],
"virtio")
+                self.files.append(host_file)
+                self.devices.append(device)

          def run(self):
              """
--
1.7.6.2

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux