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