Lines Matching +full:- +full:- +full:-
2 * COarse-grain LOck-stepping Virtual Machines for Non-stop Service (COLO)
12 * later. See the COPYING file in the top-level directory.
16 #include "qemu/error-report.h"
25 #include "chardev/char-fe.h"
29 #include "net/colo-compare.h"
33 #include "block/aio-wait.h"
36 #define TYPE_COLO_COMPARE "colo-compare"
68 * +---------------+ +---------------+ +---------------+
69 * | conn list + - > conn + ------- > conn + -- > ......
70 * +---------------+ +---------------+ +---------------+
72 * +---------------+ +---v----+ +---v----+ +---v----+ +---v----+
75 * +--------+ +--------+ +--------+ +--------+
77 * +---v----+ +---v----+ +---v----+ +---v----+
80 * +--------+ +--------+ +--------+ +--------+
82 * +---v----+ +---v----+ +---v----+ +---v----+
85 * +--------+ +--------+ +--------+ +--------+
181 error_report("Notify Xen COLO-frame failed"); in notify_remote_frame()
187 if (s->notify_dev) { in colo_compare_inconsistency_notify()
198 return b->tcp_seq - a->tcp_seq; in seq_sorter()
206 tcphd = (struct tcp_hdr *)pkt->transport_header; in fill_pkt_tcp_info()
208 pkt->tcp_seq = ntohl(tcphd->th_seq); in fill_pkt_tcp_info()
209 pkt->tcp_ack = ntohl(tcphd->th_ack); in fill_pkt_tcp_info()
211 *max_ack = pkt->tcp_ack - *max_ack > 0 ? pkt->tcp_ack : *max_ack; in fill_pkt_tcp_info()
212 pkt->header_size = pkt->transport_header - (uint8_t *)pkt->data in fill_pkt_tcp_info()
213 + (tcphd->th_off << 2); in fill_pkt_tcp_info()
214 pkt->payload_size = pkt->size - pkt->header_size; in fill_pkt_tcp_info()
215 pkt->seq_end = pkt->tcp_seq + pkt->payload_size; in fill_pkt_tcp_info()
216 pkt->flags = tcphd->th_flags; in fill_pkt_tcp_info()
226 if (pkt->ip->ip_p == IPPROTO_TCP) { in colo_insert_packet()
241 * Return 0 on success, if return -1 means the pkt
252 pkt = packet_new(s->pri_rs.buf, in packet_enqueue()
253 s->pri_rs.packet_len, in packet_enqueue()
254 s->pri_rs.vnet_hdr_len); in packet_enqueue()
256 pkt = packet_new(s->sec_rs.buf, in packet_enqueue()
257 s->sec_rs.packet_len, in packet_enqueue()
258 s->sec_rs.vnet_hdr_len); in packet_enqueue()
264 return -1; in packet_enqueue()
268 conn = connection_get(s->connection_track_table, in packet_enqueue()
270 &s->conn_list); in packet_enqueue()
272 if (!conn->processing) { in packet_enqueue()
273 g_queue_push_tail(&s->conn_list, conn); in packet_enqueue()
274 conn->processing = true; in packet_enqueue()
278 ret = colo_insert_packet(&conn->primary_list, pkt, &conn->pack); in packet_enqueue()
280 ret = colo_insert_packet(&conn->secondary_list, pkt, &conn->sack); in packet_enqueue()
297 return (int32_t)(seq1 - seq2) > 0; in after()
304 pkt->data, in colo_release_primary_pkt()
305 pkt->size, in colo_release_primary_pkt()
306 pkt->vnet_hdr_len, in colo_release_primary_pkt()
319 * TODO support ip fragment, Out-Of-Order
333 strcpy(pri_ip_src, inet_ntoa(ppkt->ip->ip_src)); in colo_compare_packet_payload()
334 strcpy(pri_ip_dst, inet_ntoa(ppkt->ip->ip_dst)); in colo_compare_packet_payload()
335 strcpy(sec_ip_src, inet_ntoa(spkt->ip->ip_src)); in colo_compare_packet_payload()
336 strcpy(sec_ip_dst, inet_ntoa(spkt->ip->ip_dst)); in colo_compare_packet_payload()
338 trace_colo_compare_ip_info(ppkt->size, pri_ip_src, in colo_compare_packet_payload()
339 pri_ip_dst, spkt->size, in colo_compare_packet_payload()
343 return memcmp(ppkt->data + poffset, spkt->data + soffset, len); in colo_compare_packet_payload()
356 if (ppkt->tcp_seq == spkt->tcp_seq && ppkt->seq_end == spkt->seq_end) { in colo_mark_tcp_pkt()
358 ppkt->header_size, spkt->header_size, in colo_mark_tcp_pkt()
359 ppkt->payload_size)) { in colo_mark_tcp_pkt()
366 if (!after(ppkt->seq_end, spkt->seq_end)) { in colo_mark_tcp_pkt()
368 ppkt->header_size + ppkt->offset, in colo_mark_tcp_pkt()
369 spkt->header_size + spkt->offset, in colo_mark_tcp_pkt()
370 ppkt->payload_size - ppkt->offset)) { in colo_mark_tcp_pkt()
371 if (!after(ppkt->tcp_ack, max_ack)) { in colo_mark_tcp_pkt()
373 spkt->offset += ppkt->payload_size - ppkt->offset; in colo_mark_tcp_pkt()
387 ppkt->header_size + ppkt->offset, in colo_mark_tcp_pkt()
388 spkt->header_size + spkt->offset, in colo_mark_tcp_pkt()
389 spkt->payload_size - spkt->offset)) { in colo_mark_tcp_pkt()
391 ppkt->offset += spkt->payload_size - spkt->offset; in colo_mark_tcp_pkt()
415 uint32_t min_ack = MIN(conn->pack, conn->sack); in colo_compare_tcp()
418 if (g_queue_is_empty(&conn->primary_list)) { in colo_compare_tcp()
421 ppkt = g_queue_pop_tail(&conn->primary_list); in colo_compare_tcp()
423 if (g_queue_is_empty(&conn->secondary_list)) { in colo_compare_tcp()
424 g_queue_push_tail(&conn->primary_list, ppkt); in colo_compare_tcp()
427 spkt = g_queue_pop_tail(&conn->secondary_list); in colo_compare_tcp()
429 if (ppkt->tcp_seq == ppkt->seq_end) { in colo_compare_tcp()
434 if (ppkt && conn->compare_seq && !after(ppkt->seq_end, conn->compare_seq)) { in colo_compare_tcp()
440 if (spkt->tcp_seq == spkt->seq_end) { in colo_compare_tcp()
448 if (conn->compare_seq && !after(spkt->seq_end, conn->compare_seq)) { in colo_compare_tcp()
458 g_queue_push_tail(&conn->secondary_list, spkt); in colo_compare_tcp()
465 ppkt->tcp_seq, ppkt->tcp_ack, in colo_compare_tcp()
466 ppkt->header_size, ppkt->payload_size, in colo_compare_tcp()
467 ppkt->offset, ppkt->flags); in colo_compare_tcp()
470 spkt->tcp_seq, spkt->tcp_ack, in colo_compare_tcp()
471 spkt->header_size, spkt->payload_size, in colo_compare_tcp()
472 spkt->offset, spkt->flags); in colo_compare_tcp()
475 conn->compare_seq = ppkt->seq_end; in colo_compare_tcp()
477 g_queue_push_tail(&conn->secondary_list, spkt); in colo_compare_tcp()
480 conn->compare_seq = spkt->seq_end; in colo_compare_tcp()
484 conn->compare_seq = ppkt->seq_end; in colo_compare_tcp()
490 g_queue_push_tail(&conn->primary_list, ppkt); in colo_compare_tcp()
491 g_queue_push_tail(&conn->secondary_list, spkt); in colo_compare_tcp()
494 qemu_hexdump(stderr, "colo-compare ppkt", ppkt->data, ppkt->size); in colo_compare_tcp()
495 qemu_hexdump(stderr, "colo-compare spkt", spkt->data, spkt->size); in colo_compare_tcp()
509 uint16_t network_header_length = ppkt->ip->ip_hl << 2; in colo_packet_compare_udp()
510 uint16_t offset = network_header_length + ETH_HLEN + ppkt->vnet_hdr_len; in colo_packet_compare_udp()
524 if (ppkt->size != spkt->size) { in colo_packet_compare_udp()
526 return -1; in colo_packet_compare_udp()
529 ppkt->size - offset)) { in colo_packet_compare_udp()
530 trace_colo_compare_udp_miscompare("primary pkt size", ppkt->size); in colo_packet_compare_udp()
531 trace_colo_compare_udp_miscompare("Secondary pkt size", spkt->size); in colo_packet_compare_udp()
533 qemu_hexdump(stderr, "colo-compare pri pkt", ppkt->data, ppkt->size); in colo_packet_compare_udp()
534 qemu_hexdump(stderr, "colo-compare sec pkt", spkt->data, spkt->size); in colo_packet_compare_udp()
536 return -1; in colo_packet_compare_udp()
548 uint16_t network_header_length = ppkt->ip->ip_hl << 2; in colo_packet_compare_icmp()
549 uint16_t offset = network_header_length + ETH_HLEN + ppkt->vnet_hdr_len; in colo_packet_compare_icmp()
563 if (ppkt->size != spkt->size) { in colo_packet_compare_icmp()
565 return -1; in colo_packet_compare_icmp()
568 ppkt->size - offset)) { in colo_packet_compare_icmp()
570 ppkt->size); in colo_packet_compare_icmp()
572 spkt->size); in colo_packet_compare_icmp()
574 qemu_hexdump(stderr, "colo-compare pri pkt", ppkt->data, ppkt->size); in colo_packet_compare_icmp()
575 qemu_hexdump(stderr, "colo-compare sec pkt", spkt->data, spkt->size); in colo_packet_compare_icmp()
577 return -1; in colo_packet_compare_icmp()
589 uint16_t offset = ppkt->vnet_hdr_len; in colo_packet_compare_other()
592 if (ppkt->size != spkt->size) { in colo_packet_compare_other()
594 return -1; in colo_packet_compare_other()
597 ppkt->size - offset); in colo_packet_compare_other()
604 if ((now - pkt->creation_ms) > (*check_time)) { in colo_old_packet_check_one()
605 trace_colo_old_packet_check_found(pkt->creation_ms); in colo_old_packet_check_one()
625 if (!g_queue_is_empty(&conn->primary_list)) { in colo_old_packet_check_one_conn()
626 if (g_queue_find_custom(&conn->primary_list, in colo_old_packet_check_one_conn()
627 &s->compare_timeout, in colo_old_packet_check_one_conn()
632 if (!g_queue_is_empty(&conn->secondary_list)) { in colo_old_packet_check_one_conn()
633 if (g_queue_find_custom(&conn->secondary_list, in colo_old_packet_check_one_conn()
634 &s->compare_timeout, in colo_old_packet_check_one_conn()
660 g_queue_find_custom(&s->conn_list, s, in colo_old_packet_check()
671 while (!g_queue_is_empty(&conn->primary_list) && in colo_compare_packet()
672 !g_queue_is_empty(&conn->secondary_list)) { in colo_compare_packet()
673 pkt = g_queue_pop_tail(&conn->primary_list); in colo_compare_packet()
674 result = g_queue_find_custom(&conn->secondary_list, in colo_compare_packet()
679 packet_destroy(result->data, NULL); in colo_compare_packet()
680 g_queue_delete_link(&conn->secondary_list, result); in colo_compare_packet()
689 g_queue_push_tail(&conn->primary_list, pkt); in colo_compare_packet()
708 switch (conn->ip_proto) { in colo_compare_connection()
727 CompareState *s = sendco->s; in _compare_chr_send()
730 while (!g_queue_is_empty(&sendco->send_list)) { in _compare_chr_send()
731 SendEntry *entry = g_queue_pop_tail(&sendco->send_list); in _compare_chr_send()
732 uint32_t len = htonl(entry->size); in _compare_chr_send()
734 ret = qemu_chr_fe_write_all(sendco->chr, (uint8_t *)&len, sizeof(len)); in _compare_chr_send()
737 g_free(entry->buf); in _compare_chr_send()
742 if (!sendco->notify_remote_frame && s->vnet_hdr) { in _compare_chr_send()
744 * We send vnet header len make other module(like filter-redirector) in _compare_chr_send()
747 len = htonl(entry->vnet_hdr_len); in _compare_chr_send()
749 ret = qemu_chr_fe_write_all(sendco->chr, in _compare_chr_send()
754 g_free(entry->buf); in _compare_chr_send()
760 ret = qemu_chr_fe_write_all(sendco->chr, in _compare_chr_send()
761 (uint8_t *)entry->buf, in _compare_chr_send()
762 entry->size); in _compare_chr_send()
764 if (ret != entry->size) { in _compare_chr_send()
765 g_free(entry->buf); in _compare_chr_send()
770 g_free(entry->buf); in _compare_chr_send()
774 sendco->ret = 0; in _compare_chr_send()
778 while (!g_queue_is_empty(&sendco->send_list)) { in _compare_chr_send()
779 SendEntry *entry = g_queue_pop_tail(&sendco->send_list); in _compare_chr_send()
780 g_free(entry->buf); in _compare_chr_send()
783 sendco->ret = ret < 0 ? ret : -EIO; in _compare_chr_send()
785 sendco->co = NULL; in _compare_chr_send()
786 sendco->done = true; in _compare_chr_send()
801 sendco = &s->notify_sendco; in compare_chr_send()
803 sendco = &s->out_sendco; in compare_chr_send()
807 return -1; in compare_chr_send()
811 entry->size = size; in compare_chr_send()
812 entry->vnet_hdr_len = vnet_hdr_len; in compare_chr_send()
814 entry->buf = buf; in compare_chr_send()
816 entry->buf = g_malloc(size); in compare_chr_send()
817 memcpy(entry->buf, buf, size); in compare_chr_send()
819 g_queue_push_tail(&sendco->send_list, entry); in compare_chr_send()
821 if (sendco->done) { in compare_chr_send()
822 sendco->co = qemu_coroutine_create(_compare_chr_send, sendco); in compare_chr_send()
823 sendco->done = false; in compare_chr_send()
824 qemu_coroutine_enter(sendco->co); in compare_chr_send()
825 if (sendco->done) { in compare_chr_send()
827 return sendco->ret; in compare_chr_send()
849 ret = net_fill_rstate(&s->pri_rs, buf, size); in compare_pri_chr_in()
850 if (ret == -1) { in compare_pri_chr_in()
851 qemu_chr_fe_set_handlers(&s->chr_pri_in, NULL, NULL, NULL, NULL, in compare_pri_chr_in()
853 error_report("colo-compare primary_in error"); in compare_pri_chr_in()
866 ret = net_fill_rstate(&s->sec_rs, buf, size); in compare_sec_chr_in()
867 if (ret == -1) { in compare_sec_chr_in()
868 qemu_chr_fe_set_handlers(&s->chr_sec_in, NULL, NULL, NULL, NULL, in compare_sec_chr_in()
870 error_report("colo-compare secondary_in error"); in compare_sec_chr_in()
879 ret = net_fill_rstate(&s->notify_rs, buf, size); in compare_notify_chr()
880 if (ret == -1) { in compare_notify_chr()
881 qemu_chr_fe_set_handlers(&s->chr_notify_dev, NULL, NULL, NULL, NULL, in compare_notify_chr()
883 error_report("colo-compare notify_dev error"); in compare_notify_chr()
897 timer_mod(s->packet_check_timer, qemu_clock_get_ms(QEMU_CLOCK_HOST) + in check_old_packet_regular()
898 s->expired_scan_cycle); in check_old_packet_regular()
914 s->event = event; in colo_notify_compares_event()
915 qemu_bh_schedule(s->event_bh); in colo_notify_compares_event()
929 AioContext *ctx = iothread_get_aio_context(s->iothread); in colo_compare_timer_init()
931 s->packet_check_timer = aio_timer_new(ctx, QEMU_CLOCK_HOST, in colo_compare_timer_init()
934 timer_mod(s->packet_check_timer, qemu_clock_get_ms(QEMU_CLOCK_HOST) + in colo_compare_timer_init()
935 s->expired_scan_cycle); in colo_compare_timer_init()
940 if (s->packet_check_timer) { in colo_compare_timer_del()
941 timer_free(s->packet_check_timer); in colo_compare_timer_del()
942 s->packet_check_timer = NULL; in colo_compare_timer_del()
952 switch (s->event) { in colo_compare_handle_event()
954 g_queue_foreach(&s->conn_list, colo_flush_packets, s); in colo_compare_handle_event()
964 event_unhandled_count--; in colo_compare_handle_event()
971 AioContext *ctx = iothread_get_aio_context(s->iothread); in colo_compare_iothread()
972 object_ref(OBJECT(s->iothread)); in colo_compare_iothread()
973 s->worker_context = iothread_get_g_main_context(s->iothread); in colo_compare_iothread()
975 qemu_chr_fe_set_handlers(&s->chr_pri_in, compare_chr_can_read, in colo_compare_iothread()
977 s, s->worker_context, true); in colo_compare_iothread()
978 qemu_chr_fe_set_handlers(&s->chr_sec_in, compare_chr_can_read, in colo_compare_iothread()
980 s, s->worker_context, true); in colo_compare_iothread()
981 if (s->notify_dev) { in colo_compare_iothread()
982 qemu_chr_fe_set_handlers(&s->chr_notify_dev, compare_chr_can_read, in colo_compare_iothread()
984 s, s->worker_context, true); in colo_compare_iothread()
988 s->event_bh = aio_bh_new(ctx, colo_compare_handle_event, s); in colo_compare_iothread()
995 return g_strdup(s->pri_indev); in compare_get_pri_indev()
1002 g_free(s->pri_indev); in compare_set_pri_indev()
1003 s->pri_indev = g_strdup(value); in compare_set_pri_indev()
1010 return g_strdup(s->sec_indev); in compare_get_sec_indev()
1017 g_free(s->sec_indev); in compare_set_sec_indev()
1018 s->sec_indev = g_strdup(value); in compare_set_sec_indev()
1025 return g_strdup(s->outdev); in compare_get_outdev()
1032 g_free(s->outdev); in compare_set_outdev()
1033 s->outdev = g_strdup(value); in compare_set_outdev()
1040 return s->vnet_hdr; in compare_get_vnet_hdr()
1049 s->vnet_hdr = value; in compare_set_vnet_hdr()
1056 return g_strdup(s->notify_dev); in compare_get_notify_dev()
1063 g_free(s->notify_dev); in compare_set_notify_dev()
1064 s->notify_dev = g_strdup(value); in compare_set_notify_dev()
1072 uint64_t value = s->compare_timeout; in compare_get_timeout()
1092 s->compare_timeout = value; in compare_set_timeout()
1100 uint32_t value = s->expired_scan_cycle; in compare_get_expired_scan_cycle()
1120 s->expired_scan_cycle = value; in compare_set_expired_scan_cycle()
1157 pri_rs->buf, in compare_pri_rs_finalize()
1158 pri_rs->packet_len, in compare_pri_rs_finalize()
1159 pri_rs->vnet_hdr_len, in compare_pri_rs_finalize()
1189 notify_rs->buf, in compare_notify_rs_finalize()
1190 notify_rs->packet_len)) { in compare_notify_rs_finalize()
1193 error_report("Notify Xen COLO-frame INIT failed"); in compare_notify_rs_finalize()
1196 notify_rs->buf, in compare_notify_rs_finalize()
1197 notify_rs->packet_len)) { in compare_notify_rs_finalize()
1198 /* colo-compare do checkpoint, flush pri packet and remove sec packet */ in compare_notify_rs_finalize()
1199 g_queue_foreach(&s->conn_list, colo_flush_packets, s); in compare_notify_rs_finalize()
1237 * to setup colo-compare.
1244 if (!s->pri_indev || !s->sec_indev || !s->outdev || !s->iothread) { in colo_compare_complete()
1248 } else if (!strcmp(s->pri_indev, s->outdev) || in colo_compare_complete()
1249 !strcmp(s->sec_indev, s->outdev) || in colo_compare_complete()
1250 !strcmp(s->pri_indev, s->sec_indev)) { in colo_compare_complete()
1256 if (!s->compare_timeout) { in colo_compare_complete()
1258 s->compare_timeout = DEFAULT_TIME_OUT_MS; in colo_compare_complete()
1261 if (!s->expired_scan_cycle) { in colo_compare_complete()
1263 s->expired_scan_cycle = REGULAR_PACKET_CHECK_MS; in colo_compare_complete()
1271 if (find_and_check_chardev(&chr, s->pri_indev, errp) || in colo_compare_complete()
1272 !qemu_chr_fe_init(&s->chr_pri_in, chr, errp)) { in colo_compare_complete()
1276 if (find_and_check_chardev(&chr, s->sec_indev, errp) || in colo_compare_complete()
1277 !qemu_chr_fe_init(&s->chr_sec_in, chr, errp)) { in colo_compare_complete()
1281 if (find_and_check_chardev(&chr, s->outdev, errp) || in colo_compare_complete()
1282 !qemu_chr_fe_init(&s->chr_out, chr, errp)) { in colo_compare_complete()
1286 net_socket_rs_init(&s->pri_rs, compare_pri_rs_finalize, s->vnet_hdr); in colo_compare_complete()
1287 net_socket_rs_init(&s->sec_rs, compare_sec_rs_finalize, s->vnet_hdr); in colo_compare_complete()
1290 if (s->notify_dev) { in colo_compare_complete()
1291 if (find_and_check_chardev(&chr, s->notify_dev, errp) || in colo_compare_complete()
1292 !qemu_chr_fe_init(&s->chr_notify_dev, chr, errp)) { in colo_compare_complete()
1296 net_socket_rs_init(&s->notify_rs, compare_notify_rs_finalize, in colo_compare_complete()
1297 s->vnet_hdr); in colo_compare_complete()
1300 s->out_sendco.s = s; in colo_compare_complete()
1301 s->out_sendco.chr = &s->chr_out; in colo_compare_complete()
1302 s->out_sendco.notify_remote_frame = false; in colo_compare_complete()
1303 s->out_sendco.done = true; in colo_compare_complete()
1304 g_queue_init(&s->out_sendco.send_list); in colo_compare_complete()
1306 if (s->notify_dev) { in colo_compare_complete()
1307 s->notify_sendco.s = s; in colo_compare_complete()
1308 s->notify_sendco.chr = &s->chr_notify_dev; in colo_compare_complete()
1309 s->notify_sendco.notify_remote_frame = true; in colo_compare_complete()
1310 s->notify_sendco.done = true; in colo_compare_complete()
1311 g_queue_init(&s->notify_sendco.send_list); in colo_compare_complete()
1314 g_queue_init(&s->conn_list); in colo_compare_complete()
1316 s->connection_track_table = g_hash_table_new_full(connection_key_hash, in colo_compare_complete()
1339 while (!g_queue_is_empty(&conn->primary_list)) { in colo_flush_packets()
1340 pkt = g_queue_pop_tail(&conn->primary_list); in colo_flush_packets()
1342 pkt->data, in colo_flush_packets()
1343 pkt->size, in colo_flush_packets()
1344 pkt->vnet_hdr_len, in colo_flush_packets()
1349 while (!g_queue_is_empty(&conn->secondary_list)) { in colo_flush_packets()
1350 pkt = g_queue_pop_tail(&conn->secondary_list); in colo_flush_packets()
1359 ucc->complete = colo_compare_complete; in colo_compare_class_init()
1373 (Object **)&s->iothread, in colo_compare_init()
1392 s->vnet_hdr = false; in colo_compare_init()
1426 qemu_chr_fe_deinit(&s->chr_pri_in, false); in colo_compare_finalize()
1427 qemu_chr_fe_deinit(&s->chr_sec_in, false); in colo_compare_finalize()
1428 qemu_chr_fe_deinit(&s->chr_out, false); in colo_compare_finalize()
1429 if (s->notify_dev) { in colo_compare_finalize()
1430 qemu_chr_fe_deinit(&s->chr_notify_dev, false); in colo_compare_finalize()
1435 qemu_bh_delete(s->event_bh); in colo_compare_finalize()
1437 AioContext *ctx = iothread_get_aio_context(s->iothread); in colo_compare_finalize()
1438 AIO_WAIT_WHILE(ctx, !s->out_sendco.done); in colo_compare_finalize()
1439 if (s->notify_dev) { in colo_compare_finalize()
1440 AIO_WAIT_WHILE(ctx, !s->notify_sendco.done); in colo_compare_finalize()
1444 g_queue_foreach(&s->conn_list, colo_flush_packets, s); in colo_compare_finalize()
1445 AIO_WAIT_WHILE(NULL, !s->out_sendco.done); in colo_compare_finalize()
1447 g_queue_clear(&s->conn_list); in colo_compare_finalize()
1448 g_queue_clear(&s->out_sendco.send_list); in colo_compare_finalize()
1449 if (s->notify_dev) { in colo_compare_finalize()
1450 g_queue_clear(&s->notify_sendco.send_list); in colo_compare_finalize()
1453 if (s->connection_track_table) { in colo_compare_finalize()
1454 g_hash_table_destroy(s->connection_track_table); in colo_compare_finalize()
1457 object_unref(OBJECT(s->iothread)); in colo_compare_finalize()
1459 g_free(s->pri_indev); in colo_compare_finalize()
1460 g_free(s->sec_indev); in colo_compare_finalize()
1461 g_free(s->outdev); in colo_compare_finalize()
1462 g_free(s->notify_dev); in colo_compare_finalize()