new file mode 100644
@@ -0,0 +1,89 @@
+import re, logging
+from autotest_lib.client.common_lib import error
+
+
+@error.context_aware
+def run_hdparm(test, params, env):
+ """
+ Test hdparm setting on linux guest os. This case will:
+ 1) Set/record parameters value of hard disk to low performance status.
+ 2) Perform device/cache read timings then record the results.
+ 3) Set/record parameters value of hard disk to high performance status.
+ 4) Perform device/cache read timings then compare two results.
+
+ @param test: KVM test object.
+ @param params: Dictionary with the test parameters.
+ @param env: Dictionary with test environment.
+ """
+ def check_setting_result(set_cmd, timeout):
+ params = re.findall("(-[a-zA-Z])([0-9]*)", set_cmd)
+ disk = re.findall("(\/+[a-z]*\/[a-z]*$)", set_cmd)[0]
+ for (param, value) in params:
+ cmd = "hdparm %s %s" % (param, disk)
+ (s, output) = session.cmd_status_output(cmd, timeout)
+ if s != 0:
+ raise error.TestError("Fail to get %s parameter value. "
+ "Output is:\n%s" % (param, output.strip()))
+ if value not in output:
+ raise error.TestFail("Fail to set %s parameter to value: %s"
+ % (param, value))
+
+
+ def perform_read_timing(disk, timeout, num=5):
+ results = 0
+ for i in range(num):
+ cmd = params.get("device_cache_read_cmd") % disk
+ (s, output) = session.cmd_status_output(cmd, timeout)
+ if s != 0:
+ raise error.TestFail("Fail to perform device/cache read"
+ " timings \nOutput is: %s\n" % output)
+ logging.info("Output of device/cache read timing check (%s of %s):"
+ % (i + 1, num))
+ for line in output.strip().splitlines():
+ logging.info(line)
+ (result, unit) = re.findall("= *([0-9]*.+[0-9]*) ([a-zA-Z]*)",
+ output)[1]
+ if unit == "kB":
+ result = float(result)/1024.0
+ results += float(result)
+ return results/num
+
+
+ vm = env.get_vm(params["main_vm"])
+ vm.create()
+ session = vm.wait_for_login(timeout=int(params.get("login_timeout", 360)))
+ try:
+ timeout = float(params.get("cmd_timeout", 60))
+ cmd = params.get("get_disk_cmd")
+ output = session.cmd(cmd)
+ disk = output.strip()
+
+ error.context("Setting hard disk to lower performance")
+ cmd = params.get("low_status_cmd") % disk
+ session.cmd(cmd, timeout)
+
+ error.context("Checking hard disk keyval under lower performance "
+ "settings")
+ check_setting_result(cmd, timeout)
+ low_result = perform_read_timing(disk, timeout)
+ logging.info("Average buffered disk read speed under low performance "
+ "settings: %.2f MB/sec" % low_result)
+
+ error.context("Setting hard disk to higher performance")
+ cmd = params.get("high_status_cmd") % disk
+ session.cmd(cmd, timeout)
+
+ error.context("Checking hard disk keyval under higher performance "
+ "settings")
+ check_setting_result(cmd, timeout)
+ high_result = perform_read_timing(disk, timeout)
+ logging.info("Average buffered disk read speed under high performance "
+ "settings: %.2f MB/sec" % high_result)
+
+ if not float(high_result) > float(low_result):
+ raise error.TestFail("High performance setting does not "
+ "increase read speed\n")
+
+ finally:
+ if session:
+ session.close()
@@ -1137,6 +1137,19 @@ variants:
fdisk_string = "10 MB, 10485760 bytes"
only Linux
+ - hdparm:
+ type = hdparm
+ get_disk_cmd = \ls /dev/[vhs]da
+ low_status_cmd = hdparm -a64 -d0 -u0 %s
+ device_cache_read_cmd = hdparm -tT %s
+ high_status_cmd = hdparm -a256 -d1 -u1 %s
+ cmd_timeout = 540
+ only Linux
+ virtio_blk:
+ get_disk_cmd = \ls /dev/vda
+ low_status_cmd = hdparm -a32 -r0 %s
+ high_status_cmd = hdparm -a256 -r1 %s
+
# NICs
variants: