4 * Copyright (c) 2012-2023 Red Hat Inc
7 * Juan Quintela <quintela@redhat.com>
9 * This work is licensed under the terms of the GNU GPL, version 2 or later.
10 * See the COPYING file in the top-level directory.
13 #include "qemu/osdep.h"
14 #include "qemu/stats64.h"
15 #include "qemu-file.h"
17 #include "migration-stats.h"
19 MigrationAtomicStats mig_stats
;
21 bool migration_rate_exceeded(QEMUFile
*f
)
23 if (qemu_file_get_error(f
)) {
27 uint64_t rate_limit_start
= stat64_get(&mig_stats
.rate_limit_start
);
28 uint64_t rate_limit_current
= migration_transferred_bytes(f
);
29 uint64_t rate_limit_used
= rate_limit_current
- rate_limit_start
;
30 uint64_t rate_limit_max
= stat64_get(&mig_stats
.rate_limit_max
);
32 if (rate_limit_max
== RATE_LIMIT_DISABLED
) {
35 if (rate_limit_max
> 0 && rate_limit_used
> rate_limit_max
) {
41 uint64_t migration_rate_get(void)
43 return stat64_get(&mig_stats
.rate_limit_max
);
46 #define XFER_LIMIT_RATIO (1000 / BUFFER_DELAY)
48 void migration_rate_set(uint64_t limit
)
51 * 'limit' is per second. But we check it each BUFFER_DELAY milliseconds.
53 stat64_set(&mig_stats
.rate_limit_max
, limit
/ XFER_LIMIT_RATIO
);
56 void migration_rate_reset(QEMUFile
*f
)
58 stat64_set(&mig_stats
.rate_limit_start
, migration_transferred_bytes(f
));
61 uint64_t migration_transferred_bytes(QEMUFile
*f
)
63 uint64_t multifd
= stat64_get(&mig_stats
.multifd_bytes
);
64 uint64_t rdma
= stat64_get(&mig_stats
.rdma_bytes
);
65 uint64_t qemu_file
= qemu_file_transferred(f
);
67 trace_migration_transferred_bytes(qemu_file
, multifd
, rdma
);
68 return qemu_file
+ multifd
+ rdma
;