13
14
#include "qemu/osdep.h"
15
#include "qemu/error-report.h"
16
+#include "qemu/units.h"
17
#include "exec/target_page.h"
18
#include "qapi/clone-visitor.h"
19
#include "qapi/error.h"
91
92
#define DEFAULT_MIGRATE_VCPU_DIRTY_LIMIT_PERIOD 1000 /* milliseconds */
93
#define DEFAULT_MIGRATE_VCPU_DIRTY_LIMIT 1 /* MB/s */
94
+#define DEFAULT_MIGRATE_X_RDMA_CHUNK_SIZE MiB
95
96
const Property migration_properties[] = {
97
DEFINE_PROP_BOOL("store-global-state", MigrationState,
185
DEFINE_PROP_ZERO_PAGE_DETECTION("zero-page-detection", MigrationState,
186
parameters.zero_page_detection,
187
ZERO_PAGE_DETECTION_MULTIFD),
188
+ DEFINE_PROP_UINT64("x-rdma-chunk-size", MigrationState,
189
+ parameters.x_rdma_chunk_size,
190
+ DEFAULT_MIGRATE_X_RDMA_CHUNK_SIZE),
191
192
/* Migration capabilities */
193
DEFINE_PROP_MIG_CAP("x-xbzrle", MIGRATION_CAPABILITY_XBZRLE),
1005
return s->parameters.zero_page_detection;
1006
}
1007
1008
+uint64_t migrate_rdma_chunk_size(void)
1009
+{
1010
+ MigrationState *s = migrate_get_current();
1011
+ uint64_t size = s->parameters.x_rdma_chunk_size;
1012
+
1013
+ assert(MiB <= size && size <= GiB && is_power_of_2(size));
1014
+ return size;
1015
+}
1016
+
1017
/* parameters helpers */
1018
1019
AnnounceParameters *migrate_announce_params(void)
1076
&p->has_announce_step, &p->has_block_bitmap_mapping,
1077
&p->has_x_vcpu_dirty_limit_period, &p->has_vcpu_dirty_limit,
1078
&p->has_mode, &p->has_zero_page_detection, &p->has_direct_io,
1065
- &p->has_cpr_exec_command,
1079
+ &p->has_x_rdma_chunk_size, &p->has_cpr_exec_command,
1080
};
1081
1082
len = ARRAY_SIZE(has_fields);
1287
return false;
1288
}
1289
1290
+ if (params->has_x_rdma_chunk_size &&
1291
+ (params->x_rdma_chunk_size < MiB ||
1292
+ params->x_rdma_chunk_size > GiB ||
1293
+ !is_power_of_2(params->x_rdma_chunk_size))) {
1294
+ error_setg(errp, "Option x_rdma_chunk_size expects "
1295
+ "a power of 2 in the range 1MiB to 1024MiB");
1296
+ return false;
1297
+ }
1298
+
1299
return true;
1300
}
1301
1416
dest->direct_io = params->direct_io;
1417
}
1418
1419
+ if (params->has_x_rdma_chunk_size) {
1420
+ dest->x_rdma_chunk_size = params->x_rdma_chunk_size;
1421
+ }
1422
+
1423
if (params->has_cpr_exec_command) {
1424
qapi_free_strList(dest->cpr_exec_command);
1425
dest->cpr_exec_command = QAPI_CLONE(strList, params->cpr_exec_command);
1547
s->parameters.direct_io = params->direct_io;
1548
}
1549
1550
+ if (params->has_x_rdma_chunk_size) {
1551
+ s->parameters.x_rdma_chunk_size = params->x_rdma_chunk_size;
1552
+ }
1553
+
1554
if (params->has_cpr_exec_command) {
1555
qapi_free_strList(s->parameters.cpr_exec_command);
1556
s->parameters.cpr_exec_command =