xref: /qemu/migration/migration-stats.h (revision 0f859618)
1947701ccSJuan Quintela /*
2947701ccSJuan Quintela  * Migration stats
3947701ccSJuan Quintela  *
4947701ccSJuan Quintela  * Copyright (c) 2012-2023 Red Hat Inc
5947701ccSJuan Quintela  *
6947701ccSJuan Quintela  * Authors:
7947701ccSJuan Quintela  *  Juan Quintela <quintela@redhat.com>
8947701ccSJuan Quintela  *
9947701ccSJuan Quintela  * This work is licensed under the terms of the GNU GPL, version 2 or later.
10947701ccSJuan Quintela  * See the COPYING file in the top-level directory.
11947701ccSJuan Quintela  */
12947701ccSJuan Quintela 
13947701ccSJuan Quintela #ifndef QEMU_MIGRATION_STATS_H
14947701ccSJuan Quintela #define QEMU_MIGRATION_STATS_H
15947701ccSJuan Quintela 
16947701ccSJuan Quintela #include "qemu/stats64.h"
17947701ccSJuan Quintela 
18947701ccSJuan Quintela /*
19e1fde0e0SJuan Quintela  * Amount of time to allocate to each "chunk" of bandwidth-throttled
20e1fde0e0SJuan Quintela  * data.
21e1fde0e0SJuan Quintela  */
22e1fde0e0SJuan Quintela #define BUFFER_DELAY     100
23e1fde0e0SJuan Quintela 
24e1fde0e0SJuan Quintela /*
258e4b2a70SJuan Quintela  * If rate_limit_max is 0, there is special code to remove the rate
268e4b2a70SJuan Quintela  * limit.
278e4b2a70SJuan Quintela  */
288e4b2a70SJuan Quintela #define RATE_LIMIT_DISABLED 0
298e4b2a70SJuan Quintela 
308e4b2a70SJuan Quintela /*
31947701ccSJuan Quintela  * These are the ram migration statistic counters.  It is loosely
32947701ccSJuan Quintela  * based on MigrationStats.  We change to Stat64 any counter that
33947701ccSJuan Quintela  * needs to be updated using atomic ops (can be accessed by more than
34947701ccSJuan Quintela  * one thread).
35947701ccSJuan Quintela  */
36947701ccSJuan Quintela typedef struct {
37e2ee2005SJuan Quintela     /*
38e2ee2005SJuan Quintela      * Number of bytes that were dirty last time that we synced with
39e2ee2005SJuan Quintela      * the guest memory.  We use that to calculate the downtime.  As
40e2ee2005SJuan Quintela      * the remaining dirty amounts to what we know that is still dirty
41e2ee2005SJuan Quintela      * since last iteration, not counting what the guest has dirtied
42e2ee2005SJuan Quintela      * since we synchronized bitmaps.
43e2ee2005SJuan Quintela      */
44947701ccSJuan Quintela     Stat64 dirty_bytes_last_sync;
45e2ee2005SJuan Quintela     /*
46e2ee2005SJuan Quintela      * Number of pages dirtied per second.
47e2ee2005SJuan Quintela      */
48947701ccSJuan Quintela     Stat64 dirty_pages_rate;
49e2ee2005SJuan Quintela     /*
50e2ee2005SJuan Quintela      * Number of times we have synchronized guest bitmaps.
51e2ee2005SJuan Quintela      */
52947701ccSJuan Quintela     Stat64 dirty_sync_count;
53e2ee2005SJuan Quintela     /*
54e2ee2005SJuan Quintela      * Number of times zero copy failed to send any page using zero
55e2ee2005SJuan Quintela      * copy.
56e2ee2005SJuan Quintela      */
57947701ccSJuan Quintela     Stat64 dirty_sync_missed_zero_copy;
58e2ee2005SJuan Quintela     /*
59e2ee2005SJuan Quintela      * Number of bytes sent at migration completion stage while the
60e2ee2005SJuan Quintela      * guest is stopped.
61e2ee2005SJuan Quintela      */
62947701ccSJuan Quintela     Stat64 downtime_bytes;
63e2ee2005SJuan Quintela     /*
64e2ee2005SJuan Quintela      * Number of bytes sent through multifd channels.
65e2ee2005SJuan Quintela      */
66947701ccSJuan Quintela     Stat64 multifd_bytes;
67e2ee2005SJuan Quintela     /*
68e2ee2005SJuan Quintela      * Number of pages transferred that were not full of zeros.
69e2ee2005SJuan Quintela      */
70947701ccSJuan Quintela     Stat64 normal_pages;
71e2ee2005SJuan Quintela     /*
72e2ee2005SJuan Quintela      * Number of bytes sent during postcopy.
73e2ee2005SJuan Quintela      */
74947701ccSJuan Quintela     Stat64 postcopy_bytes;
75e2ee2005SJuan Quintela     /*
76e2ee2005SJuan Quintela      * Number of postcopy page faults that we have handled during
77e2ee2005SJuan Quintela      * postcopy stage.
78e2ee2005SJuan Quintela      */
79947701ccSJuan Quintela     Stat64 postcopy_requests;
80e2ee2005SJuan Quintela     /*
81e2ee2005SJuan Quintela      * Number of bytes sent during precopy stage.
82e2ee2005SJuan Quintela      */
83947701ccSJuan Quintela     Stat64 precopy_bytes;
84e2ee2005SJuan Quintela     /*
852d897237SJuan Quintela      * Number of bytes transferred with QEMUFile.
862d897237SJuan Quintela      */
872d897237SJuan Quintela     Stat64 qemu_file_transferred;
882d897237SJuan Quintela     /*
89813cd616SJuan Quintela      * Amount of transferred data at the start of current cycle.
90813cd616SJuan Quintela      */
91813cd616SJuan Quintela     Stat64 rate_limit_start;
92813cd616SJuan Quintela     /*
93e1fde0e0SJuan Quintela      * Maximum amount of data we can send in a cycle.
94e1fde0e0SJuan Quintela      */
95e1fde0e0SJuan Quintela     Stat64 rate_limit_max;
96e1fde0e0SJuan Quintela     /*
9767c31c9cSJuan Quintela      * Number of bytes sent through RDMA.
9867c31c9cSJuan Quintela      */
9967c31c9cSJuan Quintela     Stat64 rdma_bytes;
10067c31c9cSJuan Quintela     /*
10140f240a7SJuan Quintela      * Number of pages transferred that were full of zeros.
10240f240a7SJuan Quintela      */
10340f240a7SJuan Quintela     Stat64 zero_pages;
10496820df2SJuan Quintela } MigrationAtomicStats;
105947701ccSJuan Quintela 
10696820df2SJuan Quintela extern MigrationAtomicStats mig_stats;
107947701ccSJuan Quintela 
108e1fde0e0SJuan Quintela /**
109e1fde0e0SJuan Quintela  * migration_rate_get: Get the maximum amount that can be transferred.
110e1fde0e0SJuan Quintela  *
111e1fde0e0SJuan Quintela  * Returns the maximum number of bytes that can be transferred in a cycle.
112e1fde0e0SJuan Quintela  */
113e1fde0e0SJuan Quintela uint64_t migration_rate_get(void);
114e1fde0e0SJuan Quintela 
115e1fde0e0SJuan Quintela /**
116e1fde0e0SJuan Quintela  * migration_rate_reset: Reset the rate limit counter.
117e1fde0e0SJuan Quintela  *
118e1fde0e0SJuan Quintela  * This is called when we know we start a new transfer cycle.
119e1fde0e0SJuan Quintela  */
1200743f41fSJuan Quintela void migration_rate_reset(void);
121e1fde0e0SJuan Quintela 
122e1fde0e0SJuan Quintela /**
123e1fde0e0SJuan Quintela  * migration_rate_set: Set the maximum amount that can be transferred.
124e1fde0e0SJuan Quintela  *
125e1fde0e0SJuan Quintela  * Sets the maximum amount of bytes that can be transferred in one cycle.
126e1fde0e0SJuan Quintela  *
127e1fde0e0SJuan Quintela  * @new_rate: new maximum amount
128e1fde0e0SJuan Quintela  */
129e1fde0e0SJuan Quintela void migration_rate_set(uint64_t new_rate);
13099319e2dSJuan Quintela 
13199319e2dSJuan Quintela /**
13299319e2dSJuan Quintela  * migration_transferred_bytes: Return number of bytes transferred
13399319e2dSJuan Quintela  *
13499319e2dSJuan Quintela  * Returns how many bytes have we transferred since the beginning of
13599319e2dSJuan Quintela  * the migration.  It accounts for bytes sent through any migration
13699319e2dSJuan Quintela  * channel, multifd, qemu_file, rdma, ....
13799319e2dSJuan Quintela  */
138f57e5a6cSJuan Quintela uint64_t migration_transferred_bytes(void);
139947701ccSJuan Quintela #endif
140