* [PATCH] KVM test: Add a subtest iofuzz
@ 2010-04-07 11:55 Jason Wang
2010-05-06 23:18 ` [Autotest] " Lucas Meneghel Rodrigues
0 siblings, 1 reply; 2+ messages in thread
From: Jason Wang @ 2010-04-07 11:55 UTC (permalink / raw)
To: autotest, lmr, kvm
The design of iofuzz is simple: it just generate random I/O port
activity inside the virtual machine. The correctness of the device
emulation may be verified through this test.
As the instrcutions are randomly generated, guest may enter the wrong
state. The test solve this issue by detect the hang and restart the
virtual machine.
The test duration could also be adjusted through the "fuzz_count". And
the parameter "skip_devices" is used to specified the devices which
should not be used to do the fuzzing.
For current version, every activity were logged and the commnad was
sent through a seesion between host and guest. Through this method may
slow down the whole test but it works well. The enumeration was done
through /proc/ioports and the scenario of avtivity is not aggressive.
Suggestions are welcomed.
Signed-off-by: Jason Wang <jasowang@redhat.com>
---
client/tests/kvm/tests/iofuzz.py | 97 ++++++++++++++++++++++++++++++++
client/tests/kvm/tests_base.cfg.sample | 2 +
2 files changed, 99 insertions(+), 0 deletions(-)
create mode 100644 client/tests/kvm/tests/iofuzz.py
diff --git a/client/tests/kvm/tests/iofuzz.py b/client/tests/kvm/tests/iofuzz.py
new file mode 100644
index 0000000..c2f22af
--- /dev/null
+++ b/client/tests/kvm/tests/iofuzz.py
@@ -0,0 +1,97 @@
+import logging, time, re, random
+from autotest_lib.client.common_lib import error
+import kvm_subprocess, kvm_test_utils, kvm_utils
+
+
+def run_iofuzz(test, params, env):
+ """
+ KVM iofuzz test:
+ 1) Log into a guest
+
+ @param test: kvm test object
+ @param params: Dictionary with the test parameters
+ @param env: Dictionary with test environment.
+ """
+ vm = kvm_test_utils.get_living_vm(env, params.get("main_vm"))
+ session = kvm_test_utils.wait_for_login(vm, 0,
+ float(params.get("boot_timeout", 240)),
+ 0, 2)
+
+ def outb(session, port, data):
+ logging.debug("outb(0x%x,0x%x)" % (port, data))
+ outb_cmd = "echo -e '\\%s' | dd of=/dev/port seek=%d bs=1 count=1" % \
+ (oct(data), port)
+ s, o = session.get_command_status_output(outb_cmd)
+ if s != 0:
+ logging.debug("None zero value returned")
+
+ def inb(session, port):
+ logging.debug("inb(0x%x)" % port)
+ inb_cmd = "dd if=/dev/port seek=%d of=/dev/null bs=1 count=1" % port
+ s, o = session.get_command_status_output(inb_cmd)
+ if s != 0:
+ logging.debug("None zero value returned")
+
+ def fuzz(session, inst_list):
+ for (op, operand) in inst_list:
+ if op == "read":
+ inb(session, operand[0])
+ elif op =="write":
+ outb(session, operand[0], operand[1])
+ else:
+ raise error.TestError("Unknown command %s" % op)
+
+ if not session.is_responsive():
+ logging.debug("Session is not responsive")
+ if vm.process.is_alive():
+ logging.debug("VM is alive, try to re-login")
+ try:
+ session = kvm_test_utils.wait_for_login(vm, 0, 10, 0, 2)
+ except:
+ logging.debug("Could not re-login, reboot the guest")
+ session = kvm_test_utils.reboot(vm, session,
+ method = "system_reset")
+ else:
+ raise error.TestFail("VM have quit abnormally")
+ try:
+ ports = {}
+ ran = random.SystemRandom()
+
+ logging.info("Enumerate the device through /proc/ioports")
+ ioports = session.get_command_output("cat /proc/ioports")
+ logging.debug(ioports)
+ devices = re.findall("(\w+)-(\w+)\ : (.*)", ioports)
+
+ skip_devices = params.get("skip_devices","")
+ fuzz_count = int(params.get("fuzz_count", 10))
+
+ for (beg, end, name) in devices:
+ ports[(int(beg, base=16), int(end, base=16))] = name.strip()
+
+ for (beg, end) in ports.keys():
+
+ name = ports[(beg, end)]
+ if name in skip_devices:
+ logging.info("Skipping %s" % name)
+ continue
+
+ logging.info("Fuzzing %s at 0x%x-0x%x" % (name, beg, end))
+ inst = []
+
+ # Read all ports
+ for port in range(beg, end+1):
+ inst.append(("read", [port]))
+
+ # Outb with zero
+ for port in range(beg, end+1):
+ inst.append(("write", [port, 0]))
+ pass
+
+ # Random fuzzing
+ for seq in range(fuzz_count * (end-beg+1)):
+ inst.append(("write", [ran.randint(beg, end), ran.randint(0,255)]))
+
+ fuzz(session, inst)
+
+ finally:
+ session.close()
diff --git a/client/tests/kvm/tests_base.cfg.sample b/client/tests/kvm/tests_base.cfg.sample
index d162cf8..01080bb 100644
--- a/client/tests/kvm/tests_base.cfg.sample
+++ b/client/tests/kvm/tests_base.cfg.sample
@@ -294,6 +294,8 @@ variants:
ksm_mode = "serial"
- ksm_parallel:
ksm_mode = "parallel"
+ - iofuzz:
+ type = iofuzz
# system_powerdown, system_reset and shutdown *must* be the last ones
# defined (in this order), since the effect of such tests can leave
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [Autotest] [PATCH] KVM test: Add a subtest iofuzz
2010-04-07 11:55 [PATCH] KVM test: Add a subtest iofuzz Jason Wang
@ 2010-05-06 23:18 ` Lucas Meneghel Rodrigues
0 siblings, 0 replies; 2+ messages in thread
From: Lucas Meneghel Rodrigues @ 2010-05-06 23:18 UTC (permalink / raw)
To: Jason Wang; +Cc: autotest, kvm
On Wed, Apr 7, 2010 at 8:55 AM, Jason Wang <jasowang@redhat.com> wrote:
> The design of iofuzz is simple: it just generate random I/O port
> activity inside the virtual machine. The correctness of the device
> emulation may be verified through this test.
>
> As the instrcutions are randomly generated, guest may enter the wrong
> state. The test solve this issue by detect the hang and restart the
> virtual machine.
>
> The test duration could also be adjusted through the "fuzz_count". And
> the parameter "skip_devices" is used to specified the devices which
> should not be used to do the fuzzing.
>
> For current version, every activity were logged and the commnad was
> sent through a seesion between host and guest. Through this method may
> slow down the whole test but it works well. The enumeration was done
> through /proc/ioports and the scenario of avtivity is not aggressive.
>
> Suggestions are welcomed.
Hi Jason, nice test! I have made some little changes, re-submitted and
will commit. Thanks!
> Signed-off-by: Jason Wang <jasowang@redhat.com>
> ---
> client/tests/kvm/tests/iofuzz.py | 97 ++++++++++++++++++++++++++++++++
> client/tests/kvm/tests_base.cfg.sample | 2 +
> 2 files changed, 99 insertions(+), 0 deletions(-)
> create mode 100644 client/tests/kvm/tests/iofuzz.py
>
> diff --git a/client/tests/kvm/tests/iofuzz.py b/client/tests/kvm/tests/iofuzz.py
> new file mode 100644
> index 0000000..c2f22af
> --- /dev/null
> +++ b/client/tests/kvm/tests/iofuzz.py
> @@ -0,0 +1,97 @@
> +import logging, time, re, random
> +from autotest_lib.client.common_lib import error
> +import kvm_subprocess, kvm_test_utils, kvm_utils
> +
> +
> +def run_iofuzz(test, params, env):
> + """
> + KVM iofuzz test:
> + 1) Log into a guest
> +
> + @param test: kvm test object
> + @param params: Dictionary with the test parameters
> + @param env: Dictionary with test environment.
> + """
> + vm = kvm_test_utils.get_living_vm(env, params.get("main_vm"))
> + session = kvm_test_utils.wait_for_login(vm, 0,
> + float(params.get("boot_timeout", 240)),
> + 0, 2)
> +
> + def outb(session, port, data):
> + logging.debug("outb(0x%x,0x%x)" % (port, data))
> + outb_cmd = "echo -e '\\%s' | dd of=/dev/port seek=%d bs=1 count=1" % \
> + (oct(data), port)
> + s, o = session.get_command_status_output(outb_cmd)
> + if s != 0:
> + logging.debug("None zero value returned")
> +
> + def inb(session, port):
> + logging.debug("inb(0x%x)" % port)
> + inb_cmd = "dd if=/dev/port seek=%d of=/dev/null bs=1 count=1" % port
> + s, o = session.get_command_status_output(inb_cmd)
> + if s != 0:
> + logging.debug("None zero value returned")
> +
> + def fuzz(session, inst_list):
> + for (op, operand) in inst_list:
> + if op == "read":
> + inb(session, operand[0])
> + elif op =="write":
> + outb(session, operand[0], operand[1])
> + else:
> + raise error.TestError("Unknown command %s" % op)
> +
> + if not session.is_responsive():
> + logging.debug("Session is not responsive")
> + if vm.process.is_alive():
> + logging.debug("VM is alive, try to re-login")
> + try:
> + session = kvm_test_utils.wait_for_login(vm, 0, 10, 0, 2)
> + except:
> + logging.debug("Could not re-login, reboot the guest")
> + session = kvm_test_utils.reboot(vm, session,
> + method = "system_reset")
> + else:
> + raise error.TestFail("VM have quit abnormally")
> + try:
> + ports = {}
> + ran = random.SystemRandom()
> +
> + logging.info("Enumerate the device through /proc/ioports")
> + ioports = session.get_command_output("cat /proc/ioports")
> + logging.debug(ioports)
> + devices = re.findall("(\w+)-(\w+)\ : (.*)", ioports)
> +
> + skip_devices = params.get("skip_devices","")
> + fuzz_count = int(params.get("fuzz_count", 10))
> +
> + for (beg, end, name) in devices:
> + ports[(int(beg, base=16), int(end, base=16))] = name.strip()
> +
> + for (beg, end) in ports.keys():
> +
> + name = ports[(beg, end)]
> + if name in skip_devices:
> + logging.info("Skipping %s" % name)
> + continue
> +
> + logging.info("Fuzzing %s at 0x%x-0x%x" % (name, beg, end))
> + inst = []
> +
> + # Read all ports
> + for port in range(beg, end+1):
> + inst.append(("read", [port]))
> +
> + # Outb with zero
> + for port in range(beg, end+1):
> + inst.append(("write", [port, 0]))
> + pass
> +
> + # Random fuzzing
> + for seq in range(fuzz_count * (end-beg+1)):
> + inst.append(("write", [ran.randint(beg, end), ran.randint(0,255)]))
> +
> + fuzz(session, inst)
> +
> + finally:
> + session.close()
> diff --git a/client/tests/kvm/tests_base.cfg.sample b/client/tests/kvm/tests_base.cfg.sample
> index d162cf8..01080bb 100644
> --- a/client/tests/kvm/tests_base.cfg.sample
> +++ b/client/tests/kvm/tests_base.cfg.sample
> @@ -294,6 +294,8 @@ variants:
> ksm_mode = "serial"
> - ksm_parallel:
> ksm_mode = "parallel"
> + - iofuzz:
> + type = iofuzz
>
> # system_powerdown, system_reset and shutdown *must* be the last ones
> # defined (in this order), since the effect of such tests can leave
>
> _______________________________________________
> Autotest mailing list
> Autotest@test.kernel.org
> http://test.kernel.org/cgi-bin/mailman/listinfo/autotest
>
--
Lucas
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2010-05-06 23:18 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-04-07 11:55 [PATCH] KVM test: Add a subtest iofuzz Jason Wang
2010-05-06 23:18 ` [Autotest] " Lucas Meneghel Rodrigues
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).