ram.h 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. /*
  2. * QEMU System Emulator
  3. *
  4. * Copyright (c) 2003-2008 Fabrice Bellard
  5. * Copyright (c) 2011-2015 Red Hat Inc
  6. *
  7. * Authors:
  8. * Juan Quintela <quintela@redhat.com>
  9. *
  10. * Permission is hereby granted, free of charge, to any person obtaining a copy
  11. * of this software and associated documentation files (the "Software"), to deal
  12. * in the Software without restriction, including without limitation the rights
  13. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  14. * copies of the Software, and to permit persons to whom the Software is
  15. * furnished to do so, subject to the following conditions:
  16. *
  17. * The above copyright notice and this permission notice shall be included in
  18. * all copies or substantial portions of the Software.
  19. *
  20. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  21. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  22. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  23. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  24. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  25. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  26. * THE SOFTWARE.
  27. */
  28. #ifndef QEMU_MIGRATION_RAM_H
  29. #define QEMU_MIGRATION_RAM_H
  30. #include "qapi/qapi-types-migration.h"
  31. #include "exec/cpu-common.h"
  32. #include "io/channel.h"
  33. /*
  34. * RAM_SAVE_FLAG_ZERO used to be named RAM_SAVE_FLAG_COMPRESS, it
  35. * worked for pages that were filled with the same char. We switched
  36. * it to only search for the zero value. And to avoid confusion with
  37. * RAM_SAVE_FLAG_COMPRESS_PAGE just rename it.
  38. *
  39. * RAM_SAVE_FLAG_FULL (0x01) was obsoleted in 2009.
  40. *
  41. * RAM_SAVE_FLAG_COMPRESS_PAGE (0x100) was removed in QEMU 9.1.
  42. *
  43. * RAM_SAVE_FLAG_HOOK is only used in RDMA. Whenever this is found in the
  44. * data stream, the flags will be passed to rdma functions in the
  45. * incoming-migration side.
  46. *
  47. * We can't use any flag that is bigger than 0x200, because the flags are
  48. * always assumed to be encoded in a ramblock address offset, which is
  49. * multiple of PAGE_SIZE. Here it means QEMU supports migration with any
  50. * architecture that has PAGE_SIZE>=1K (0x400).
  51. */
  52. #define RAM_SAVE_FLAG_ZERO 0x002
  53. #define RAM_SAVE_FLAG_MEM_SIZE 0x004
  54. #define RAM_SAVE_FLAG_PAGE 0x008
  55. #define RAM_SAVE_FLAG_EOS 0x010
  56. #define RAM_SAVE_FLAG_CONTINUE 0x020
  57. #define RAM_SAVE_FLAG_XBZRLE 0x040
  58. #define RAM_SAVE_FLAG_HOOK 0x080
  59. #define RAM_SAVE_FLAG_MULTIFD_FLUSH 0x200
  60. extern XBZRLECacheStats xbzrle_counters;
  61. /* Should be holding either ram_list.mutex, or the RCU lock. */
  62. #define RAMBLOCK_FOREACH_NOT_IGNORED(block) \
  63. INTERNAL_RAMBLOCK_FOREACH(block) \
  64. if (migrate_ram_is_ignored(block)) {} else
  65. #define RAMBLOCK_FOREACH_MIGRATABLE(block) \
  66. INTERNAL_RAMBLOCK_FOREACH(block) \
  67. if (!qemu_ram_is_migratable(block)) {} else
  68. void ram_mig_init(void);
  69. int xbzrle_cache_resize(uint64_t new_size, Error **errp);
  70. uint64_t ram_bytes_remaining(void);
  71. uint64_t ram_bytes_total(void);
  72. void mig_throttle_counter_reset(void);
  73. uint64_t ram_pagesize_summary(void);
  74. int ram_save_queue_pages(const char *rbname, ram_addr_t start, ram_addr_t len,
  75. Error **errp);
  76. void ram_postcopy_migrated_memory_release(MigrationState *ms);
  77. /* For outgoing discard bitmap */
  78. void ram_postcopy_send_discard_bitmap(MigrationState *ms);
  79. /* For incoming postcopy discard */
  80. int ram_discard_range(const char *block_name, uint64_t start, size_t length);
  81. int ram_postcopy_incoming_init(MigrationIncomingState *mis);
  82. int ram_load_postcopy(QEMUFile *f, int channel);
  83. void ram_handle_zero(void *host, uint64_t size);
  84. void ram_transferred_add(uint64_t bytes);
  85. void ram_release_page(const char *rbname, uint64_t offset);
  86. int ramblock_recv_bitmap_test(RAMBlock *rb, void *host_addr);
  87. bool ramblock_recv_bitmap_test_byte_offset(RAMBlock *rb, uint64_t byte_offset);
  88. void ramblock_recv_bitmap_set(RAMBlock *rb, void *host_addr);
  89. void ramblock_recv_bitmap_set_range(RAMBlock *rb, void *host_addr, size_t nr);
  90. void ramblock_recv_bitmap_set_offset(RAMBlock *rb, uint64_t byte_offset);
  91. int64_t ramblock_recv_bitmap_send(QEMUFile *file,
  92. const char *block_name);
  93. bool ram_dirty_bitmap_reload(MigrationState *s, RAMBlock *rb, Error **errp);
  94. bool ramblock_page_is_discarded(RAMBlock *rb, ram_addr_t start);
  95. void postcopy_preempt_shutdown_file(MigrationState *s);
  96. void *postcopy_preempt_thread(void *opaque);
  97. void ramblock_set_file_bmap_atomic(RAMBlock *block, ram_addr_t offset,
  98. bool set);
  99. /* ram cache */
  100. int colo_init_ram_cache(void);
  101. void colo_flush_ram_cache(void);
  102. void colo_release_ram_cache(void);
  103. void colo_incoming_start_dirty_log(void);
  104. void colo_record_bitmap(RAMBlock *block, ram_addr_t *normal, uint32_t pages);
  105. /* Background snapshot */
  106. bool ram_write_tracking_available(void);
  107. bool ram_write_tracking_compatible(void);
  108. void ram_write_tracking_prepare(void);
  109. int ram_write_tracking_start(void);
  110. void ram_write_tracking_stop(void);
  111. #endif