1
2
3
4
5
6
7
8
9
10
11
12
13#ifndef QEMU_MIGRATION_MULTIFD_H
14#define QEMU_MIGRATION_MULTIFD_H
15
16bool migrate_multifd_is_allowed(void);
17void migrate_protocol_allow_multifd(bool allow);
18int multifd_save_setup(Error **errp);
19void multifd_save_cleanup(void);
20int multifd_load_setup(Error **errp);
21int multifd_load_cleanup(Error **errp);
22bool multifd_recv_all_channels_created(void);
23bool multifd_recv_new_channel(QIOChannel *ioc, Error **errp);
24void multifd_recv_sync_main(void);
25void multifd_send_sync_main(QEMUFile *f);
26int multifd_queue_page(QEMUFile *f, RAMBlock *block, ram_addr_t offset);
27
28
29#define MULTIFD_FLAG_SYNC (1 << 0)
30
31
32#define MULTIFD_FLAG_COMPRESSION_MASK (7 << 1)
33
34#define MULTIFD_FLAG_NOCOMP (0 << 1)
35#define MULTIFD_FLAG_ZLIB (1 << 1)
36#define MULTIFD_FLAG_ZSTD (2 << 1)
37
38
39#define MULTIFD_PACKET_SIZE (512 * 1024)
40
41typedef struct {
42 uint32_t magic;
43 uint32_t version;
44 uint32_t flags;
45
46 uint32_t pages_alloc;
47 uint32_t pages_used;
48
49 uint32_t next_packet_size;
50 uint64_t packet_num;
51 uint64_t unused[4];
52 char ramblock[256];
53 uint64_t offset[];
54} __attribute__((packed)) MultiFDPacket_t;
55
56typedef struct {
57
58 uint32_t used;
59
60 uint32_t allocated;
61
62 uint64_t packet_num;
63
64 ram_addr_t *offset;
65
66 struct iovec *iov;
67 RAMBlock *block;
68} MultiFDPages_t;
69
70typedef struct {
71
72
73 uint8_t id;
74
75 char *name;
76
77 char *tls_hostname;
78
79 QemuThread thread;
80
81 QIOChannel *c;
82
83 QemuSemaphore sem;
84
85 QemuMutex mutex;
86
87 bool running;
88
89 bool quit;
90
91 bool registered_yank;
92
93 int pending_job;
94
95 MultiFDPages_t *pages;
96
97 uint32_t packet_len;
98
99 MultiFDPacket_t *packet;
100
101 uint32_t flags;
102
103 uint32_t next_packet_size;
104
105 uint64_t packet_num;
106
107
108 uint64_t num_packets;
109
110 uint64_t num_pages;
111
112 QemuSemaphore sem_sync;
113
114 void *data;
115} MultiFDSendParams;
116
117typedef struct {
118
119
120 uint8_t id;
121
122 char *name;
123
124 QemuThread thread;
125
126 QIOChannel *c;
127
128 QemuMutex mutex;
129
130 bool running;
131
132 bool quit;
133
134 MultiFDPages_t *pages;
135
136 uint32_t packet_len;
137
138 MultiFDPacket_t *packet;
139
140 uint32_t flags;
141
142 uint64_t packet_num;
143
144
145 uint32_t next_packet_size;
146
147 uint64_t num_packets;
148
149 uint64_t num_pages;
150
151 QemuSemaphore sem_sync;
152
153 void *data;
154} MultiFDRecvParams;
155
156typedef struct {
157
158 int (*send_setup)(MultiFDSendParams *p, Error **errp);
159
160 void (*send_cleanup)(MultiFDSendParams *p, Error **errp);
161
162 int (*send_prepare)(MultiFDSendParams *p, uint32_t used, Error **errp);
163
164 int (*send_write)(MultiFDSendParams *p, uint32_t used, Error **errp);
165
166 int (*recv_setup)(MultiFDRecvParams *p, Error **errp);
167
168 void (*recv_cleanup)(MultiFDRecvParams *p);
169
170 int (*recv_pages)(MultiFDRecvParams *p, uint32_t used, Error **errp);
171} MultiFDMethods;
172
173void multifd_register_ops(int method, MultiFDMethods *ops);
174
175#endif
176
177