/* * Migration stats * * Copyright (c) 2012-2023 Red Hat Inc * * Authors: * Juan Quintela * * 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; /* * Number of bytes transferred with QEMUFile. */ Stat64 qemu_file_transferred; /* * 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; /* * Number of bytes sent through RDMA. */ Stat64 rdma_bytes; /* * 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