Lines Matching full:p

162 static int multifd_send_initial_packet(MultiFDSendParams *p, Error **errp)  in multifd_send_initial_packet()  argument
170 msg.id = p->id; in multifd_send_initial_packet()
173 ret = qio_channel_write_all(p->c, (char *)&msg, size, errp); in multifd_send_initial_packet()
227 void multifd_send_fill_packet(MultiFDSendParams *p) in multifd_send_fill_packet() argument
229 MultiFDPacket_t *packet = p->packet; in multifd_send_fill_packet()
231 bool sync_packet = p->flags & MULTIFD_FLAG_SYNC; in multifd_send_fill_packet()
233 memset(packet, 0, p->packet_len); in multifd_send_fill_packet()
238 packet->hdr.flags = cpu_to_be32(p->flags); in multifd_send_fill_packet()
239 packet->next_packet_size = cpu_to_be32(p->next_packet_size); in multifd_send_fill_packet()
244 p->packets_sent++; in multifd_send_fill_packet()
247 multifd_ram_fill_packet(p); in multifd_send_fill_packet()
250 trace_multifd_send_fill(p->id, packet_num, in multifd_send_fill_packet()
251 p->flags, p->next_packet_size); in multifd_send_fill_packet()
254 static int multifd_recv_unfill_packet_header(MultiFDRecvParams *p, in multifd_recv_unfill_packet_header() argument
273 p->flags = be32_to_cpu(hdr->flags); in multifd_recv_unfill_packet_header()
278 static int multifd_recv_unfill_packet_device_state(MultiFDRecvParams *p, in multifd_recv_unfill_packet_device_state() argument
281 MultiFDPacketDeviceState_t *packet = p->packet_dev_state; in multifd_recv_unfill_packet_device_state()
284 p->next_packet_size = be32_to_cpu(packet->next_packet_size); in multifd_recv_unfill_packet_device_state()
289 static int multifd_recv_unfill_packet_ram(MultiFDRecvParams *p, Error **errp) in multifd_recv_unfill_packet_ram() argument
291 const MultiFDPacket_t *packet = p->packet; in multifd_recv_unfill_packet_ram()
294 p->next_packet_size = be32_to_cpu(packet->next_packet_size); in multifd_recv_unfill_packet_ram()
295 p->packet_num = be64_to_cpu(packet->packet_num); in multifd_recv_unfill_packet_ram()
298 ret = multifd_ram_unfill_packet(p, errp); in multifd_recv_unfill_packet_ram()
300 trace_multifd_recv_unfill(p->id, p->packet_num, p->flags, in multifd_recv_unfill_packet_ram()
301 p->next_packet_size); in multifd_recv_unfill_packet_ram()
306 static int multifd_recv_unfill_packet(MultiFDRecvParams *p, Error **errp) in multifd_recv_unfill_packet() argument
308 p->packets_recved++; in multifd_recv_unfill_packet()
310 if (p->flags & MULTIFD_FLAG_DEVICE_STATE) { in multifd_recv_unfill_packet()
311 return multifd_recv_unfill_packet_device_state(p, errp); in multifd_recv_unfill_packet()
314 return multifd_recv_unfill_packet_ram(p, errp); in multifd_recv_unfill_packet()
333 static void multifd_send_kick_main(MultiFDSendParams *p) in multifd_send_kick_main() argument
335 qemu_sem_post(&p->sem_sync); in multifd_send_kick_main()
357 MultiFDSendParams *p = NULL; /* make happy gcc */ in multifd_send() local
379 p = &multifd_send_state->params[i]; in multifd_send()
381 * Lockless read to p->pending_job is safe, because only multifd in multifd_send()
384 if (qatomic_read(&p->pending_job) == false) { in multifd_send()
391 * Make sure we read p->pending_job before all the rest. Pairs with in multifd_send()
396 assert(multifd_payload_empty(p->data)); in multifd_send()
403 *send_data = p->data; in multifd_send()
404 p->data = tmp; in multifd_send()
407 * Making sure p->data is setup before marking pending_job=true. Pairs in multifd_send()
410 qatomic_store_release(&p->pending_job, true); in multifd_send()
411 qemu_sem_post(&p->sem); in multifd_send()
459 MultiFDSendParams *p = &multifd_send_state->params[i]; in multifd_send_terminate_threads() local
461 qemu_sem_post(&p->sem); in multifd_send_terminate_threads()
462 if (p->c) { in multifd_send_terminate_threads()
463 qio_channel_shutdown(p->c, QIO_CHANNEL_SHUTDOWN_BOTH, NULL); in multifd_send_terminate_threads()
471 MultiFDSendParams *p = &multifd_send_state->params[i]; in multifd_send_terminate_threads() local
473 if (p->tls_thread_created) { in multifd_send_terminate_threads()
474 qemu_thread_join(&p->tls_thread); in multifd_send_terminate_threads()
477 if (p->thread_created) { in multifd_send_terminate_threads()
478 qemu_thread_join(&p->thread); in multifd_send_terminate_threads()
483 static bool multifd_send_cleanup_channel(MultiFDSendParams *p, Error **errp) in multifd_send_cleanup_channel() argument
485 if (p->c) { in multifd_send_cleanup_channel()
486 migration_ioc_unregister_yank(p->c); in multifd_send_cleanup_channel()
509 qio_channel_close(p->c, &error_abort); in multifd_send_cleanup_channel()
510 object_unref(OBJECT(p->c)); in multifd_send_cleanup_channel()
511 p->c = NULL; in multifd_send_cleanup_channel()
513 qemu_sem_destroy(&p->sem); in multifd_send_cleanup_channel()
514 qemu_sem_destroy(&p->sem_sync); in multifd_send_cleanup_channel()
515 g_free(p->name); in multifd_send_cleanup_channel()
516 p->name = NULL; in multifd_send_cleanup_channel()
517 g_clear_pointer(&p->data, multifd_send_data_free); in multifd_send_cleanup_channel()
518 p->packet_len = 0; in multifd_send_cleanup_channel()
519 g_clear_pointer(&p->packet_device_state, g_free); in multifd_send_cleanup_channel()
520 g_free(p->packet); in multifd_send_cleanup_channel()
521 p->packet = NULL; in multifd_send_cleanup_channel()
522 multifd_send_state->ops->send_cleanup(p, errp); in multifd_send_cleanup_channel()
523 assert(!p->iov); in multifd_send_cleanup_channel()
551 MultiFDSendParams *p = &multifd_send_state->params[i]; in multifd_send_shutdown() local
554 if (p->tls_thread_created && p->thread_created) { in multifd_send_shutdown()
564 migration_tls_channel_end(p->c, &local_err); in multifd_send_shutdown()
574 p->id, error_get_pretty(local_err)); in multifd_send_shutdown()
583 MultiFDSendParams *p = &multifd_send_state->params[i]; in multifd_send_shutdown() local
586 if (!multifd_send_cleanup_channel(p, &local_err)) { in multifd_send_shutdown()
622 MultiFDSendParams *p = &multifd_send_state->params[i]; in multifd_send_sync_main() local
628 trace_multifd_send_sync_main_signal(p->id); in multifd_send_sync_main()
634 assert(qatomic_read(&p->pending_sync) == MULTIFD_SYNC_NONE); in multifd_send_sync_main()
635 qatomic_set(&p->pending_sync, req); in multifd_send_sync_main()
636 qemu_sem_post(&p->sem); in multifd_send_sync_main()
639 MultiFDSendParams *p = &multifd_send_state->params[i]; in multifd_send_sync_main() local
646 trace_multifd_send_sync_main_wait(p->id); in multifd_send_sync_main()
647 qemu_sem_wait(&p->sem_sync); in multifd_send_sync_main()
649 if (flush_zero_copy && p->c && (multifd_zero_copy_flush(p->c) < 0)) { in multifd_send_sync_main()
660 MultiFDSendParams *p = opaque; in multifd_send_thread() local
666 thread = migration_threads_add(p->name, qemu_get_thread_id()); in multifd_send_thread()
668 trace_multifd_send_thread_start(p->id); in multifd_send_thread()
672 if (multifd_send_initial_packet(p, &local_err) < 0) { in multifd_send_thread()
680 qemu_sem_wait(&p->sem); in multifd_send_thread()
687 * Read pending_job flag before p->data. Pairs with the in multifd_send_thread()
690 if (qatomic_load_acquire(&p->pending_job)) { in multifd_send_thread()
691 bool is_device_state = multifd_payload_device_state(p->data); in multifd_send_thread()
695 p->flags = 0; in multifd_send_thread()
696 p->iovs_num = 0; in multifd_send_thread()
697 assert(!multifd_payload_empty(p->data)); in multifd_send_thread()
700 multifd_device_state_send_prepare(p); in multifd_send_thread()
705 ret = multifd_send_state->ops->send_prepare(p, &local_err); in multifd_send_thread()
716 total_size = iov_size(p->iov, p->iovs_num); in multifd_send_thread()
721 ret = file_write_ramblock_iov(p->c, p->iov, p->iovs_num, in multifd_send_thread()
722 &p->data->u.ram, &local_err); in multifd_send_thread()
724 ret = qio_channel_writev_full_all(p->c, p->iov, p->iovs_num, in multifd_send_thread()
726 p->write_flags & ~write_flags_masked, in multifd_send_thread()
736 p->next_packet_size = 0; in multifd_send_thread()
737 multifd_send_data_clear(p->data); in multifd_send_thread()
740 * Making sure p->data is published before saying "we're in multifd_send_thread()
744 qatomic_store_release(&p->pending_job, false); in multifd_send_thread()
746 MultiFDSyncReq req = qatomic_read(&p->pending_sync); in multifd_send_thread()
757 p->flags = MULTIFD_FLAG_SYNC; in multifd_send_thread()
758 multifd_send_fill_packet(p); in multifd_send_thread()
759 ret = qio_channel_write_all(p->c, (void *)p->packet, in multifd_send_thread()
760 p->packet_len, &local_err); in multifd_send_thread()
764 /* p->next_packet_size will always be zero for a SYNC packet */ in multifd_send_thread()
765 stat64_add(&mig_stats.multifd_bytes, p->packet_len); in multifd_send_thread()
768 qatomic_set(&p->pending_sync, MULTIFD_SYNC_NONE); in multifd_send_thread()
769 qemu_sem_post(&p->sem_sync); in multifd_send_thread()
776 trace_multifd_send_error(p->id); in multifd_send_thread()
778 multifd_send_kick_main(p); in multifd_send_thread()
784 trace_multifd_send_thread_end(p->id, p->packets_sent); in multifd_send_thread()
792 MultiFDSendParams *p; member
802 args->p, in multifd_tls_handshake_thread()
810 static bool multifd_tls_channel_connect(MultiFDSendParams *p, in multifd_tls_channel_connect() argument
834 args->p = p; in multifd_tls_channel_connect()
836 p->tls_thread_created = true; in multifd_tls_channel_connect()
837 qemu_thread_create(&p->tls_thread, MIGRATION_THREAD_SRC_TLS, in multifd_tls_channel_connect()
843 void multifd_channel_connect(MultiFDSendParams *p, QIOChannel *ioc) in multifd_channel_connect() argument
848 /* Setup p->c only if the channel is completely setup */ in multifd_channel_connect()
849 p->c = ioc; in multifd_channel_connect()
851 p->thread_created = true; in multifd_channel_connect()
852 qemu_thread_create(&p->thread, p->name, multifd_send_thread, p, in multifd_channel_connect()
864 MultiFDSendParams *p = opaque; in multifd_new_send_channel_async() local
869 trace_multifd_new_send_channel_async(p->id); in multifd_new_send_channel_async()
880 ret = multifd_tls_channel_connect(p, ioc, &local_err); in multifd_new_send_channel_async()
885 multifd_channel_connect(p, ioc); in multifd_new_send_channel_async()
900 trace_multifd_new_send_channel_async_error(p->id, local_err); in multifd_new_send_channel_async()
904 * rather than when cleanup multifd: since p->c is not set, multifd in multifd_new_send_channel_async()
943 MultiFDSendParams *p = &multifd_send_state->params[i]; in multifd_send_setup() local
946 qemu_sem_init(&p->sem, 0); in multifd_send_setup()
947 qemu_sem_init(&p->sem_sync, 0); in multifd_send_setup()
948 p->id = i; in multifd_send_setup()
949 p->data = multifd_send_data_alloc(); in multifd_send_setup()
952 p->packet_len = sizeof(MultiFDPacket_t) in multifd_send_setup()
954 p->packet = g_malloc0(p->packet_len); in multifd_send_setup()
955 p->packet_device_state = g_malloc0(sizeof(*p->packet_device_state)); in multifd_send_setup()
956 p->packet_device_state->hdr.magic = cpu_to_be32(MULTIFD_MAGIC); in multifd_send_setup()
957 p->packet_device_state->hdr.version = cpu_to_be32(MULTIFD_VERSION); in multifd_send_setup()
959 p->name = g_strdup_printf(MIGRATION_THREAD_SRC_MULTIFD, i); in multifd_send_setup()
960 p->write_flags = 0; in multifd_send_setup()
962 if (!multifd_new_send_channel_create(p, &local_err)) { in multifd_send_setup()
982 MultiFDSendParams *p = &multifd_send_state->params[i]; in multifd_send_setup() local
985 ret = multifd_send_state->ops->send_setup(p, &local_err); in multifd_send_setup()
990 assert(p->iov); in multifd_send_setup()
1007 MultiFDRecvParams *p = NULL; in multifd_recv() local
1021 p = &multifd_recv_state->params[i]; in multifd_recv()
1023 if (qatomic_read(&p->pending_job) == false) { in multifd_recv()
1030 * Order pending_job read before manipulating p->data below. Pairs in multifd_recv()
1035 assert(!p->data->size); in multifd_recv()
1036 multifd_recv_state->data = p->data; in multifd_recv()
1037 p->data = data; in multifd_recv()
1040 * Order p->data update before setting pending_job. Pairs with in multifd_recv()
1043 qatomic_store_release(&p->pending_job, true); in multifd_recv()
1044 qemu_sem_post(&p->sem); in multifd_recv()
1075 MultiFDRecvParams *p = &multifd_recv_state->params[i]; in multifd_recv_terminate_threads() local
1088 qemu_sem_post(&p->sem_sync); in multifd_recv_terminate_threads()
1097 qemu_sem_post(&p->sem); in multifd_recv_terminate_threads()
1106 if (p->c) { in multifd_recv_terminate_threads()
1107 qio_channel_shutdown(p->c, QIO_CHANNEL_SHUTDOWN_BOTH, NULL); in multifd_recv_terminate_threads()
1119 static void multifd_recv_cleanup_channel(MultiFDRecvParams *p) in multifd_recv_cleanup_channel() argument
1121 migration_ioc_unregister_yank(p->c); in multifd_recv_cleanup_channel()
1122 object_unref(OBJECT(p->c)); in multifd_recv_cleanup_channel()
1123 p->c = NULL; in multifd_recv_cleanup_channel()
1124 qemu_mutex_destroy(&p->mutex); in multifd_recv_cleanup_channel()
1125 qemu_sem_destroy(&p->sem_sync); in multifd_recv_cleanup_channel()
1126 qemu_sem_destroy(&p->sem); in multifd_recv_cleanup_channel()
1127 g_free(p->data); in multifd_recv_cleanup_channel()
1128 p->data = NULL; in multifd_recv_cleanup_channel()
1129 g_free(p->name); in multifd_recv_cleanup_channel()
1130 p->name = NULL; in multifd_recv_cleanup_channel()
1131 p->packet_len = 0; in multifd_recv_cleanup_channel()
1132 g_free(p->packet); in multifd_recv_cleanup_channel()
1133 p->packet = NULL; in multifd_recv_cleanup_channel()
1134 g_clear_pointer(&p->packet_dev_state, g_free); in multifd_recv_cleanup_channel()
1135 g_free(p->normal); in multifd_recv_cleanup_channel()
1136 p->normal = NULL; in multifd_recv_cleanup_channel()
1137 g_free(p->zero); in multifd_recv_cleanup_channel()
1138 p->zero = NULL; in multifd_recv_cleanup_channel()
1139 multifd_recv_state->ops->recv_cleanup(p); in multifd_recv_cleanup_channel()
1162 MultiFDRecvParams *p = &multifd_recv_state->params[i]; in multifd_recv_cleanup() local
1164 if (p->thread_created) { in multifd_recv_cleanup()
1165 qemu_thread_join(&p->thread); in multifd_recv_cleanup()
1190 MultiFDRecvParams *p = &multifd_recv_state->params[i]; in multifd_recv_sync_main() local
1192 trace_multifd_recv_sync_main_signal(p->id); in multifd_recv_sync_main()
1193 qemu_sem_post(&p->sem); in multifd_recv_sync_main()
1223 MultiFDRecvParams *p = &multifd_recv_state->params[i]; in multifd_recv_sync_main() local
1225 WITH_QEMU_LOCK_GUARD(&p->mutex) { in multifd_recv_sync_main()
1226 if (multifd_recv_state->packet_num < p->packet_num) { in multifd_recv_sync_main()
1227 multifd_recv_state->packet_num = p->packet_num; in multifd_recv_sync_main()
1230 trace_multifd_recv_sync_main_signal(p->id); in multifd_recv_sync_main()
1231 qemu_sem_post(&p->sem_sync); in multifd_recv_sync_main()
1236 static int multifd_device_state_recv(MultiFDRecvParams *p, Error **errp) in multifd_device_state_recv() argument
1241 dev_state_buf = g_malloc(p->next_packet_size); in multifd_device_state_recv()
1243 ret = qio_channel_read_all(p->c, dev_state_buf, p->next_packet_size, errp); in multifd_device_state_recv()
1248 if (p->packet_dev_state->idstr[sizeof(p->packet_dev_state->idstr) - 1] in multifd_device_state_recv()
1254 if (!qemu_loadvm_load_state_buffer(p->packet_dev_state->idstr, in multifd_device_state_recv()
1255 p->packet_dev_state->instance_id, in multifd_device_state_recv()
1256 dev_state_buf, p->next_packet_size, in multifd_device_state_recv()
1267 MultiFDRecvParams *p = opaque; in multifd_recv_thread() local
1272 trace_multifd_recv_thread_start(p->id); in multifd_recv_thread()
1276 p->read_flags = QIO_CHANNEL_READ_FLAG_RELAXED_EOF; in multifd_recv_thread()
1287 p->normal_num = 0; in multifd_recv_thread()
1299 ret = qio_channel_readv_full_all_eof(p->c, &iov, 1, NULL, NULL, in multifd_recv_thread()
1300 p->read_flags, &local_err); in multifd_recv_thread()
1311 ret = multifd_recv_unfill_packet_header(p, &hdr, &local_err); in multifd_recv_thread()
1316 is_device_state = p->flags & MULTIFD_FLAG_DEVICE_STATE; in multifd_recv_thread()
1318 pkt_buf = (uint8_t *)p->packet_dev_state + sizeof(hdr); in multifd_recv_thread()
1319 pkt_len = sizeof(*p->packet_dev_state) - sizeof(hdr); in multifd_recv_thread()
1321 pkt_buf = (uint8_t *)p->packet + sizeof(hdr); in multifd_recv_thread()
1322 pkt_len = p->packet_len - sizeof(hdr); in multifd_recv_thread()
1325 ret = qio_channel_read_all_eof(p->c, (char *)pkt_buf, pkt_len, in multifd_recv_thread()
1337 qemu_mutex_lock(&p->mutex); in multifd_recv_thread()
1338 ret = multifd_recv_unfill_packet(p, &local_err); in multifd_recv_thread()
1340 qemu_mutex_unlock(&p->mutex); in multifd_recv_thread()
1344 flags = p->flags; in multifd_recv_thread()
1346 p->flags &= ~MULTIFD_FLAG_SYNC; in multifd_recv_thread()
1349 has_data = p->next_packet_size > 0; in multifd_recv_thread()
1356 has_data = p->normal_num || p->zero_num; in multifd_recv_thread()
1359 qemu_mutex_unlock(&p->mutex); in multifd_recv_thread()
1365 qemu_sem_wait(&p->sem); in multifd_recv_thread()
1372 if (!qatomic_load_acquire(&p->pending_job)) { in multifd_recv_thread()
1383 has_data = !!p->data->size; in multifd_recv_thread()
1396 ret = multifd_device_state_recv(p, &local_err); in multifd_recv_thread()
1398 ret = multifd_recv_state->ops->recv(p, &local_err); in multifd_recv_thread()
1418 qemu_sem_wait(&p->sem_sync); in multifd_recv_thread()
1421 p->data->size = 0; in multifd_recv_thread()
1427 qatomic_store_release(&p->pending_job, false); in multifd_recv_thread()
1437 trace_multifd_recv_thread_end(p->id, p->packets_recved); in multifd_recv_thread()
1470 MultiFDRecvParams *p = &multifd_recv_state->params[i]; in multifd_recv_setup() local
1472 qemu_mutex_init(&p->mutex); in multifd_recv_setup()
1473 qemu_sem_init(&p->sem_sync, 0); in multifd_recv_setup()
1474 qemu_sem_init(&p->sem, 0); in multifd_recv_setup()
1475 p->pending_job = false; in multifd_recv_setup()
1476 p->id = i; in multifd_recv_setup()
1478 p->data = g_new0(MultiFDRecvData, 1); in multifd_recv_setup()
1479 p->data->size = 0; in multifd_recv_setup()
1482 p->packet_len = sizeof(MultiFDPacket_t) in multifd_recv_setup()
1484 p->packet = g_malloc0(p->packet_len); in multifd_recv_setup()
1485 p->packet_dev_state = g_malloc0(sizeof(*p->packet_dev_state)); in multifd_recv_setup()
1487 p->name = g_strdup_printf(MIGRATION_THREAD_DST_MULTIFD, i); in multifd_recv_setup()
1488 p->normal = g_new0(ram_addr_t, page_count); in multifd_recv_setup()
1489 p->zero = g_new0(ram_addr_t, page_count); in multifd_recv_setup()
1493 MultiFDRecvParams *p = &multifd_recv_state->params[i]; in multifd_recv_setup() local
1496 ret = multifd_recv_state->ops->recv_setup(p, errp); in multifd_recv_setup()
1526 MultiFDRecvParams *p; in multifd_recv_new_channel() local
1546 p = &multifd_recv_state->params[id]; in multifd_recv_new_channel()
1547 if (p->c != NULL) { in multifd_recv_new_channel()
1554 p->c = ioc; in multifd_recv_new_channel()
1557 p->thread_created = true; in multifd_recv_new_channel()
1558 qemu_thread_create(&p->thread, p->name, multifd_recv_thread, p, in multifd_recv_new_channel()