xref: /qemu/migration/migration-stats.h (revision 813cd616)
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     /*
85813cd616SJuan Quintela      * Amount of transferred data at the start of current cycle.
86813cd616SJuan Quintela      */
87813cd616SJuan Quintela     Stat64 rate_limit_start;
88813cd616SJuan Quintela     /*
89e1fde0e0SJuan Quintela      * Maximum amount of data we can send in a cycle.
90e1fde0e0SJuan Quintela      */
91e1fde0e0SJuan Quintela     Stat64 rate_limit_max;
92e1fde0e0SJuan Quintela     /*
93e1fde0e0SJuan Quintela      * Amount of data we have sent in the current cycle.
94e1fde0e0SJuan Quintela      */
95e1fde0e0SJuan Quintela     Stat64 rate_limit_used;
96e1fde0e0SJuan Quintela     /*
97e2ee2005SJuan Quintela      * Total number of bytes transferred.
98e2ee2005SJuan Quintela      */
99947701ccSJuan Quintela     Stat64 transferred;
10040f240a7SJuan 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_account: Increase the number of bytes transferred.
110e1fde0e0SJuan Quintela  *
111e1fde0e0SJuan Quintela  * Report on a number of bytes the have been transferred that need to
112e1fde0e0SJuan Quintela  * be applied to the rate limiting calcuations.
113e1fde0e0SJuan Quintela  *
114e1fde0e0SJuan Quintela  * @len: amount of bytes transferred
115e1fde0e0SJuan Quintela  */
116e1fde0e0SJuan Quintela void migration_rate_account(uint64_t len);
117e1fde0e0SJuan Quintela 
118e1fde0e0SJuan Quintela /**
119e1fde0e0SJuan Quintela  * migration_rate_get: Get the maximum amount that can be transferred.
120e1fde0e0SJuan Quintela  *
121e1fde0e0SJuan Quintela  * Returns the maximum number of bytes that can be transferred in a cycle.
122e1fde0e0SJuan Quintela  */
123e1fde0e0SJuan Quintela uint64_t migration_rate_get(void);
124e1fde0e0SJuan Quintela 
125e1fde0e0SJuan Quintela /**
126e1fde0e0SJuan Quintela  * migration_rate_reset: Reset the rate limit counter.
127e1fde0e0SJuan Quintela  *
128e1fde0e0SJuan Quintela  * This is called when we know we start a new transfer cycle.
129813cd616SJuan Quintela  *
130813cd616SJuan Quintela  * @f: QEMUFile used for main migration channel
131e1fde0e0SJuan Quintela  */
132813cd616SJuan Quintela void migration_rate_reset(QEMUFile *f);
133e1fde0e0SJuan Quintela 
134e1fde0e0SJuan Quintela /**
135e1fde0e0SJuan Quintela  * migration_rate_set: Set the maximum amount that can be transferred.
136e1fde0e0SJuan Quintela  *
137e1fde0e0SJuan Quintela  * Sets the maximum amount of bytes that can be transferred in one cycle.
138e1fde0e0SJuan Quintela  *
139e1fde0e0SJuan Quintela  * @new_rate: new maximum amount
140e1fde0e0SJuan Quintela  */
141e1fde0e0SJuan Quintela void migration_rate_set(uint64_t new_rate);
14299319e2dSJuan Quintela 
14399319e2dSJuan Quintela /**
14499319e2dSJuan Quintela  * migration_transferred_bytes: Return number of bytes transferred
14599319e2dSJuan Quintela  *
14699319e2dSJuan Quintela  * @f: QEMUFile used for main migration channel
14799319e2dSJuan Quintela  *
14899319e2dSJuan Quintela  * Returns how many bytes have we transferred since the beginning of
14999319e2dSJuan Quintela  * the migration.  It accounts for bytes sent through any migration
15099319e2dSJuan Quintela  * channel, multifd, qemu_file, rdma, ....
15199319e2dSJuan Quintela  */
15299319e2dSJuan Quintela uint64_t migration_transferred_bytes(QEMUFile *f);
153947701ccSJuan Quintela #endif
154