aboutsummaryrefslogtreecommitdiff
path: root/migration/migration-stats.h
blob: ac2260e987c06a0ae32276be1736928c207b303e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/*
 * Migration stats
 *
 * Copyright (c) 2012-2023 Red Hat Inc
 *
 * Authors:
 *  Juan Quintela <quintela@redhat.com>
 *
 * This work is licensed under the terms of the GNU GPL, version 2 or later.
 * See the COPYING file in the top-level directory.
 */

#ifndef QEMU_MIGRATION_STATS_H
#define QEMU_MIGRATION_STATS_H

#include "qemu/stats64.h"

/*
 * Amount of time to allocate to each "chunk" of bandwidth-throttled
 * data.
 */
#define BUFFER_DELAY     100

/*
 * If rate_limit_max is 0, there is special code to remove the rate
 * limit.
 */
#define RATE_LIMIT_DISABLED 0

/*
 * These are the ram migration statistic counters.  It is loosely
 * based on MigrationStats.  We change to Stat64 any counter that
 * needs to be updated using atomic ops (can be accessed by more than
 * one thread).
 */
typedef struct {
    /*
     * Number of bytes that were dirty last time that we synced with
     * the guest memory.  We use that to calculate the downtime.  As
     * the remaining dirty amounts to what we know that is still dirty
     * since last iteration, not counting what the guest has dirtied
     * since we synchronized bitmaps.
     */
    Stat64 dirty_bytes_last_sync;
    /*
     * Number of pages dirtied per second.
     */
    Stat64 dirty_pages_rate;
    /*
     * Number of times we have synchronized guest bitmaps.
     */
    Stat64 dirty_sync_count;
    /*
     * Number of times zero copy failed to send any page using zero
     * copy.
     */
    Stat64 dirty_sync_missed_zero_copy;
    /*
     * Number of bytes sent at migration completion stage while the
     * guest is stopped.
     */
    Stat64 downtime_bytes;
    /*
     * Number of bytes sent through multifd channels.
     */
    Stat64 multifd_bytes;
    /*
     * Number of pages transferred that were not full of zeros.
     */
    Stat64 normal_pages;
    /*
     * Number of bytes sent during postcopy.
     */
    Stat64 postcopy_bytes;
    /*
     * Number of postcopy page faults that we have handled during
     * postcopy stage.
     */
    Stat64 postcopy_requests;
    /*
     * Number of bytes sent during precopy stage.
     */
    Stat64 precopy_bytes;
    /*
     * Amount of transferred data at the start of current cycle.
     */
    Stat64 rate_limit_start;
    /*
     * Maximum amount of data we can send in a cycle.
     */
    Stat64 rate_limit_max;
    /*
     * Total number of bytes transferred.
     */
    Stat64 transferred;
    /*
     * Number of pages transferred that were full of zeros.
     */
    Stat64 zero_pages;
} MigrationAtomicStats;

extern MigrationAtomicStats mig_stats;

/**
 * migration_rate_get: Get the maximum amount that can be transferred.
 *
 * Returns the maximum number of bytes that can be transferred in a cycle.
 */
uint64_t migration_rate_get(void);

/**
 * migration_rate_reset: Reset the rate limit counter.
 *
 * This is called when we know we start a new transfer cycle.
 *
 * @f: QEMUFile used for main migration channel
 */
void migration_rate_reset(QEMUFile *f);

/**
 * migration_rate_set: Set the maximum amount that can be transferred.
 *
 * Sets the maximum amount of bytes that can be transferred in one cycle.
 *
 * @new_rate: new maximum amount
 */
void migration_rate_set(uint64_t new_rate);

/**
 * migration_transferred_bytes: Return number of bytes transferred
 *
 * @f: QEMUFile used for main migration channel
 *
 * Returns how many bytes have we transferred since the beginning of
 * the migration.  It accounts for bytes sent through any migration
 * channel, multifd, qemu_file, rdma, ....
 */
uint64_t migration_transferred_bytes(QEMUFile *f);
#endif