Lines Matching +full:- +full:- +full:disable +full:- +full:numa

2  * QTest testcase for the vhost-user
7 * See the COPYING file in the top-level directory.
13 #include "libqtest-single.h"
16 #include "qemu/config-file.h"
20 #include "chardev/char-fe.h"
25 #include "libqos/pci-pc.h"
26 #include "libqos/virtio-pci.h"
28 #include "libqos/malloc-pc.h"
29 #include "hw/virtio/virtio-net.h"
31 #include "standard-headers/linux/vhost_types.h"
32 #include "standard-headers/linux/virtio_ids.h"
33 #include "standard-headers/linux/virtio_net.h"
34 #include "standard-headers/linux/virtio_gpio.h"
35 #include "standard-headers/linux/virtio_scmi.h"
42 #define QEMU_CMD_MEM " -m %d -object memory-backend-file,id=mem,size=%dM," \
43 "mem-path=%s,share=on -numa node,memdev=mem"
44 #define QEMU_CMD_MEMFD " -m %d -object memory-backend-memfd,id=mem,size=%dM," \
45 " -numa node,memdev=mem"
46 #define QEMU_CMD_SHM " -m %d -object memory-backend-shm,id=mem,size=%dM," \
47 " -numa node,memdev=mem"
48 #define QEMU_CMD_CHR " -chardev socket,id=%s,path=%s%s"
49 #define QEMU_CMD_NETDEV " -netdev vhost-user,id=hs0,chardev=%s,vhostforce=on"
53 /*********** FROM hw/virtio/vhost-user.c *************************************/
134 #define VHOST_USER_PAYLOAD_SIZE (sizeof(m) - VHOST_USER_HDR_SIZE)
181 /* VHOST-USER commands. */
206 s->chr_name, s->socket_path, in append_vhost_net_opts()
207 chr_opts, s->chr_name); in append_vhost_net_opts()
212 * block or netdev) so all we need to worry about is the vhost-user
219 s->chr_name, s->socket_path, in append_vhost_gpio_opts()
236 const char *root = init_hugepagefs() ? : server->tmpfs; in append_mem_opts()
248 g_mutex_lock(&s->data_mutex); in wait_for_fds()
251 while (!s->fds_num) { in wait_for_fds()
252 if (!g_cond_wait_until(&s->data_cond, &s->data_mutex, end_time)) { in wait_for_fds()
254 g_assert(s->fds_num); in wait_for_fds()
260 g_assert_cmpint(s->fds_num, >, 0); in wait_for_fds()
261 g_assert_cmpint(s->fds_num, ==, s->memory.nregions); in wait_for_fds()
263 g_mutex_unlock(&s->data_mutex); in wait_for_fds()
266 for (i = 0; i < s->memory.nregions; ++i) { in wait_for_fds()
267 VhostUserMemoryRegion *reg = &s->memory.regions[i]; in wait_for_fds()
268 if (reg->guest_phys_addr == 0) { in wait_for_fds()
285 g_mutex_lock(&s->data_mutex); in read_guest_mem_server()
288 for (i = 0; i < s->fds_num; i++) { in read_guest_mem_server()
291 if (s->memory.regions[i].guest_phys_addr != 0x0) { in read_guest_mem_server()
295 g_assert_cmpint(s->memory.regions[i].memory_size, >, 1024); in read_guest_mem_server()
297 size = s->memory.regions[i].memory_size + in read_guest_mem_server()
298 s->memory.regions[i].mmap_offset; in read_guest_mem_server()
301 MAP_SHARED, s->fds[i], 0); in read_guest_mem_server()
304 guest_mem += (s->memory.regions[i].mmap_offset / sizeof(*guest_mem)); in read_guest_mem_server()
307 uint32_t a = qtest_readb(qts, s->memory.regions[i].guest_phys_addr + j); in read_guest_mem_server()
313 munmap(guest_mem, s->memory.regions[i].memory_size); in read_guest_mem_server()
316 g_mutex_unlock(&s->data_mutex); in read_guest_mem_server()
335 CharBackend *chr = &s->chr; in chr_read()
338 int fd = -1; in chr_read()
340 if (s->test_fail) { in chr_read()
342 /* now switch to non-failure */ in chr_read()
343 s->test_fail = false; in chr_read()
351 g_mutex_lock(&s->data_mutex); in chr_read()
367 g_assert(s->vu_ops->get_features); in chr_read()
373 if (s->test_flags >= TEST_FLAGS_BAD) { in chr_read()
375 s->test_flags = TEST_FLAGS_END; in chr_read()
377 msg.payload.u64 = s->vu_ops->get_features(s); in chr_read()
385 if (s->vu_ops->set_features) { in chr_read()
386 s->vu_ops->set_features(s, chr, &msg); in chr_read()
399 if (s->vu_ops->get_protocol_features) { in chr_read()
400 s->vu_ops->get_protocol_features(s, chr, &msg); in chr_read()
425 * A real vhost-user backend would actually set the size and in chr_read()
447 assert(msg.payload.state.index < s->queues * 2); in chr_read()
448 s->rings &= ~(0x1ULL << msg.payload.state.index); in chr_read()
449 g_cond_broadcast(&s->data_cond); in chr_read()
454 memcpy(&s->memory, &msg.payload.memory, sizeof(msg.payload.memory)); in chr_read()
455 s->fds_num = qemu_chr_fe_get_msgfds(chr, s->fds, in chr_read()
456 G_N_ELEMENTS(s->fds)); in chr_read()
459 g_cond_broadcast(&s->data_cond); in chr_read()
466 g_test_message("call fd: %d, do not set non-blocking\n", fd); in chr_read()
470 * This is a non-blocking eventfd. in chr_read()
472 * so revert it back to non-blocking. in chr_read()
479 if (s->log_fd != -1) { in chr_read()
480 close(s->log_fd); in chr_read()
481 s->log_fd = -1; in chr_read()
483 qemu_chr_fe_get_msgfds(chr, &s->log_fd, 1); in chr_read()
489 g_cond_broadcast(&s->data_cond); in chr_read()
493 assert(msg.payload.state.index < s->queues * 2); in chr_read()
494 s->rings |= 0x1ULL << msg.payload.state.index; in chr_read()
495 g_cond_broadcast(&s->data_cond); in chr_read()
501 msg.payload.u64 = s->queues; in chr_read()
509 * fully functioning vhost-user we would enable/disable the in chr_read()
517 g_test_message("vhost-user: un-handled message: %d\n", msg.request); in chr_read()
522 g_mutex_unlock(&s->data_mutex); in chr_read()
576 server->context = g_main_context_new(); in test_server_new()
577 server->loop = g_main_loop_new(server->context, FALSE); in test_server_new()
580 server->thread = g_thread_new(NULL, thread_function, server->loop); in test_server_new()
582 tmpfs = g_dir_make_tmp("vhost-test-XXXXXX", &err); in test_server_new()
585 g_get_tmp_dir(), err->message); in test_server_new()
590 server->tmpfs = g_strdup(tmpfs); in test_server_new()
591 server->socket_path = g_strdup_printf("%s/%s.sock", tmpfs, name); in test_server_new()
592 server->mig_path = g_strdup_printf("%s/%s.mig", tmpfs, name); in test_server_new()
593 server->chr_name = g_strdup_printf("chr-%s", name); in test_server_new()
595 g_mutex_init(&server->data_mutex); in test_server_new()
596 g_cond_init(&server->data_cond); in test_server_new()
598 server->log_fd = -1; in test_server_new()
599 server->queues = 1; in test_server_new()
600 server->vu_ops = ops; in test_server_new()
609 if (s->test_flags == TEST_FLAGS_END && in chr_event()
611 s->test_flags = TEST_FLAGS_OK; in chr_event()
618 server->socket_path, opt); in test_server_create_chr()
621 chr = qemu_chr_new(server->chr_name, chr_path, server->context); in test_server_create_chr()
624 qemu_chr_fe_init(&server->chr, chr, &error_abort); in test_server_create_chr()
625 qemu_chr_fe_set_handlers(&server->chr, chr_can_read, chr_read, in test_server_create_chr()
626 chr_event, NULL, server, server->context, true); in test_server_create_chr()
639 g_main_loop_quit(server->loop); in test_server_free()
640 g_thread_join(server->thread); in test_server_free()
645 unlink(server->socket_path); in test_server_free()
646 g_free(server->socket_path); in test_server_free()
648 unlink(server->mig_path); in test_server_free()
649 g_free(server->mig_path); in test_server_free()
651 ret = rmdir(server->tmpfs); in test_server_free()
654 server->tmpfs, strerror(errno)); in test_server_free()
656 g_free(server->tmpfs); in test_server_free()
658 qemu_chr_fe_deinit(&server->chr, true); in test_server_free()
660 for (i = 0; i < server->fds_num; i++) { in test_server_free()
661 close(server->fds[i]); in test_server_free()
664 if (server->log_fd != -1) { in test_server_free()
665 close(server->log_fd); in test_server_free()
668 g_free(server->chr_name); in test_server_free()
670 g_main_loop_unref(server->loop); in test_server_free()
671 g_main_context_unref(server->context); in test_server_free()
672 g_cond_clear(&server->data_cond); in test_server_free()
673 g_mutex_clear(&server->data_mutex); in test_server_free()
681 g_mutex_lock(&s->data_mutex); in wait_for_log_fd()
683 while (s->log_fd == -1) { in wait_for_log_fd()
684 if (!g_cond_wait_until(&s->data_cond, &s->data_mutex, end_time)) { in wait_for_log_fd()
686 g_assert(s->log_fd != -1); in wait_for_log_fd()
691 g_mutex_unlock(&s->data_mutex); in wait_for_log_fd()
701 for (i = 0; i < s->fds_num; i++) { in write_guest_mem()
704 if (s->memory.regions[i].guest_phys_addr != 0x0) { in write_guest_mem()
708 g_assert_cmpint(s->memory.regions[i].memory_size, >, 1024); in write_guest_mem()
710 size = s->memory.regions[i].memory_size + in write_guest_mem()
711 s->memory.regions[i].mmap_offset; in write_guest_mem()
714 MAP_SHARED, s->fds[i], 0); in write_guest_mem()
717 guest_mem += (s->memory.regions[i].mmap_offset / sizeof(*guest_mem)); in write_guest_mem()
723 munmap(guest_mem, s->memory.regions[i].memory_size); in write_guest_mem()
733 for (i = 0; i < s->memory.nregions; ++i) { in get_log_size()
734 VhostUserMemoryRegion *reg = &s->memory.regions[i]; in get_log_size()
735 guint64 last = range_get_last(reg->guest_phys_addr, in get_log_size()
736 reg->memory_size); in get_log_size()
753 gboolean overlap = t->src->rings && t->dest->rings; in test_migrate_source_check()
774 TestServer *server = test_server_new("vhost-user-test", arg); in vhost_user_test_setup()
778 server->vu_ops->append_opts(server, cmd_line, ""); in vhost_user_test_setup()
787 TestServer *server = test_server_new("vhost-user-test", arg); in vhost_user_test_setup_memfd()
791 server->vu_ops->append_opts(server, cmd_line, ""); in vhost_user_test_setup_memfd()
800 TestServer *server = test_server_new("vhost-user-test", arg); in vhost_user_test_setup_shm()
804 server->vu_ops->append_opts(server, cmd_line, ""); in vhost_user_test_setup_shm()
838 dest = test_server_new("dest", s->vu_ops); in test_migrate()
840 uri = g_strdup_printf("%s%s", "unix:", dest->mig_path); in test_migrate()
846 g_string_append_printf(dest_cmdline, " -incoming %s", uri); in test_migrate()
848 dest->vu_ops->append_opts(dest, dest_cmdline, ""); in test_migrate()
849 to = qtest_init(dest_cmdline->str); in test_migrate()
857 ((TestMigrateSource *)source)->src = s; in test_migrate()
858 ((TestMigrateSource *)source)->dest = dest; in test_migrate()
859 g_source_attach(source, s->context); in test_migrate()
863 rsp = qmp("{ 'execute': 'migrate-set-parameters'," in test_migrate()
864 "'arguments': { 'max-bandwidth': 10 } }"); in test_migrate()
874 log = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, s->log_fd, 0); in test_migrate()
883 rsp = qmp("{ 'execute': 'migrate-set-parameters'," in test_migrate()
884 "'arguments': { 'max-bandwidth': 0 } }"); in test_migrate()
907 g_mutex_lock(&s->data_mutex); in wait_for_rings_started()
909 while (ctpop64(s->rings) != count) { in wait_for_rings_started()
910 if (!g_cond_wait_until(&s->data_cond, &s->data_mutex, end_time)) { in wait_for_rings_started()
912 g_assert_cmpint(ctpop64(s->rings), ==, count); in wait_for_rings_started()
917 g_mutex_unlock(&s->data_mutex); in wait_for_rings_started()
922 test_server_create_chr(server, ",reconnect-ms=1000"); in test_server_connect()
930 qemu_chr_fe_disconnect(&s->chr); in reconnect_cb()
953 s->vu_ops->append_opts(s, cmd_line, ",server=on"); in vhost_user_test_setup_reconnect()
972 s->fds_num = 0; in test_reconnect()
973 s->rings = 0; in test_reconnect()
976 g_source_attach(src, s->context); in test_reconnect()
984 TestServer *s = test_server_new("connect-fail", arg); in vhost_user_test_setup_connect_fail()
986 s->test_fail = true; in vhost_user_test_setup_connect_fail()
990 s->vu_ops->append_opts(s, cmd_line, ",server=on"); in vhost_user_test_setup_connect_fail()
999 TestServer *s = test_server_new("flags-mismatch", arg); in vhost_user_test_setup_flags_mismatch()
1001 s->test_flags = TEST_FLAGS_DISCONNECT; in vhost_user_test_setup_flags_mismatch()
1005 s->vu_ops->append_opts(s, cmd_line, ",server=on"); in vhost_user_test_setup_flags_mismatch()
1026 s->queues = 2; in vhost_user_test_setup_multiqueue()
1028 " -set netdev.hs0.queues=%d" in vhost_user_test_setup_multiqueue()
1029 " -global virtio-net-pci.vectors=%d", in vhost_user_test_setup_multiqueue()
1030 s->queues, s->queues * 2 + 2); in vhost_user_test_setup_multiqueue()
1039 wait_for_rings_started(s, s->queues * 2); in test_multiqueue()
1049 if (s->queues > 1) { in vu_net_get_features()
1059 g_assert(msg->payload.u64 & (0x1ULL << VHOST_USER_F_PROTOCOL_FEATURES)); in vu_net_set_features()
1060 if (s->test_flags == TEST_FLAGS_DISCONNECT) { in vu_net_set_features()
1062 s->test_flags = TEST_FLAGS_BAD; in vu_net_set_features()
1070 msg->flags |= VHOST_USER_REPLY_MASK; in vu_net_get_protocol_features()
1071 msg->size = sizeof(m.payload.u64); in vu_net_get_protocol_features()
1072 msg->payload.u64 = 1 << VHOST_USER_PROTOCOL_F_LOG_SHMFD; in vu_net_get_protocol_features()
1073 msg->payload.u64 |= 1 << VHOST_USER_PROTOCOL_F_CROSS_ENDIAN; in vu_net_get_protocol_features()
1074 if (s->queues > 1) { in vu_net_get_protocol_features()
1075 msg->payload.u64 |= 1 << VHOST_USER_PROTOCOL_F_MQ; in vu_net_get_protocol_features()
1077 qemu_chr_fe_write_all(chr, (uint8_t *)msg, VHOST_USER_HDR_SIZE + msg->size); in vu_net_get_protocol_features()
1080 /* Each VHOST-USER device should have its ops structure defined. */
1101 qos_add_test("vhost-user/read-guest-mem/memfile", in register_vhost_user_test()
1102 "virtio-net", in register_vhost_user_test()
1106 qos_add_test("vhost-user/read-guest-mem/shm", in register_vhost_user_test()
1107 "virtio-net", in register_vhost_user_test()
1112 qos_add_test("vhost-user/read-guest-mem/memfd", in register_vhost_user_test()
1113 "virtio-net", in register_vhost_user_test()
1117 qos_add_test("vhost-user/migrate", in register_vhost_user_test()
1118 "virtio-net", in register_vhost_user_test()
1122 qos_add_test("vhost-user/reconnect", "virtio-net", in register_vhost_user_test()
1126 qos_add_test("vhost-user/connect-fail", "virtio-net", in register_vhost_user_test()
1130 qos_add_test("vhost-user/flags-mismatch", "virtio-net", in register_vhost_user_test()
1135 qos_add_test("vhost-user/multiqueue", in register_vhost_user_test()
1136 "virtio-net", in register_vhost_user_test()
1151 * talking to a read vhost-user daemon.
1157 msg->flags |= VHOST_USER_REPLY_MASK; in vu_gpio_get_protocol_features()
1158 msg->size = sizeof(m.payload.u64); in vu_gpio_get_protocol_features()
1159 msg->payload.u64 = 1ULL << VHOST_USER_PROTOCOL_F_CONFIG; in vu_gpio_get_protocol_features()
1161 qemu_chr_fe_write_all(chr, (uint8_t *)msg, VHOST_USER_HDR_SIZE + msg->size); in vu_gpio_get_protocol_features()
1184 qos_add_test("read-guest-mem/memfile", in register_vhost_gpio_test()
1185 "vhost-user-gpio", test_read_guest_mem, &opts); in register_vhost_gpio_test()
1199 msg->flags |= VHOST_USER_REPLY_MASK; in vu_scmi_get_protocol_features()
1200 msg->size = sizeof(m.payload.u64); in vu_scmi_get_protocol_features()
1201 msg->payload.u64 = 1ULL << VHOST_USER_PROTOCOL_F_MQ; in vu_scmi_get_protocol_features()
1203 qemu_chr_fe_write_all(chr, (uint8_t *)msg, VHOST_USER_HDR_SIZE + msg->size); in vu_scmi_get_protocol_features()
1226 qos_add_test("scmi/read-guest-mem/memfile", in register_vhost_scmi_test()
1227 "vhost-user-scmi", test_read_guest_mem, &opts); in register_vhost_scmi_test()