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