This patch adds a new subtest, it hotplugs 29 * 8 = 232 virtio-blk devices to guest, and try to hot-unplug them.
Note: the hot-unplug can't work without cooperation of guest OS. Signed-off-by: Amos Kong <ak...@redhat.com> --- tests/virtio-blk-test.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/tests/virtio-blk-test.c b/tests/virtio-blk-test.c index 0fdec01..54d1272 100644 --- a/tests/virtio-blk-test.c +++ b/tests/virtio-blk-test.c @@ -7,11 +7,65 @@ * See the COPYING file in the top-level directory. */ +#include <stdio.h> #include <glib.h> #include <string.h> #include "libqtest.h" #include "qemu/osdep.h" +static void exec_hmp_cmd(const char *cmd, const char *expected_ret) +{ + QDict *response; + const char *response_return; + + response = qmp("{\"execute\": \"human-monitor-command\"," + " \"arguments\": {" + " \"command-line\": \"%s\"" + "}}", cmd); + g_assert(response); + response_return = qdict_get_try_str(response, "return"); + g_assert(response_return); + g_assert(strcmp(response_return, expected_ret) == 0); + QDECREF(response); +} + +static void test_blk_hotplug(void) +{ + char addr[6]; + char cmd[100]; + int i, j; + + /* Start with no network/block device, slots 3~0x1f are free */ + qtest_start("-net none"); + + for (i = 3; i <= 0x1f; i++) { + for (j = 7; j >= 0; j--) { + sprintf(addr, "%x.%x", i, j); + sprintf(cmd, "drive_add 0x%s if=none,file=/dev/null,id=drv-%s", + addr, addr); + exec_hmp_cmd(cmd, "OK\r\n"); + + sprintf(cmd, "device_add virtio-blk-pci,id=dev-%s,drive=drv-%s," + "addr=0x%s,multifunction=on", addr, addr, addr); + exec_hmp_cmd(cmd, ""); + } + } + + /* hot-unplug doesn't work without cooperation of guest OS */ + for (i = 3; i <= 0x1f; i++) { + for (j = 7; j >= 0; j--) { + sprintf(addr, "%x.%x", i, j); + sprintf(cmd, "drive_del drv-%s", addr); + exec_hmp_cmd(cmd, ""); + + sprintf(cmd, "device_del dev-%s", addr); + exec_hmp_cmd(cmd, ""); + } + } + + qtest_end(); +} + /* Tests only initialization */ static void virtblk_init(void) { @@ -26,6 +80,7 @@ int main(int argc, char **argv) g_test_init(&argc, &argv, NULL); qtest_add_func("/virtio/blk/pci/init", virtblk_init); + qtest_add_func("/virtio/blk/pci/hotplug", test_blk_hotplug); ret = g_test_run(); -- 1.9.0