141aa4e9fSJuan Quintela /* 241aa4e9fSJuan Quintela * Declarations for cpu physical memory functions 341aa4e9fSJuan Quintela * 441aa4e9fSJuan Quintela * Copyright 2011 Red Hat, Inc. and/or its affiliates 541aa4e9fSJuan Quintela * 641aa4e9fSJuan Quintela * Authors: 741aa4e9fSJuan Quintela * Avi Kivity <avi@redhat.com> 841aa4e9fSJuan Quintela * 941aa4e9fSJuan Quintela * This work is licensed under the terms of the GNU GPL, version 2 or 1041aa4e9fSJuan Quintela * later. See the COPYING file in the top-level directory. 1141aa4e9fSJuan Quintela * 1241aa4e9fSJuan Quintela */ 1341aa4e9fSJuan Quintela 1441aa4e9fSJuan Quintela /* 1541aa4e9fSJuan Quintela * This header is for use by exec.c and memory.c ONLY. Do not include it. 1641aa4e9fSJuan Quintela * The functions declared here will be removed soon. 1741aa4e9fSJuan Quintela */ 1841aa4e9fSJuan Quintela 1941aa4e9fSJuan Quintela #ifndef QEMU_EXEC_RAMBLOCK_H 2041aa4e9fSJuan Quintela #define QEMU_EXEC_RAMBLOCK_H 2141aa4e9fSJuan Quintela 2241aa4e9fSJuan Quintela #ifndef CONFIG_USER_ONLY 2341aa4e9fSJuan Quintela #include "cpu-common.h" 2440d7ca33SPhilippe Mathieu-Daudé #include "qemu/rcu.h" 2540d7ca33SPhilippe Mathieu-Daudé #include "exec/ramlist.h" 2641aa4e9fSJuan Quintela 2741aa4e9fSJuan Quintela struct RAMBlock { 2841aa4e9fSJuan Quintela struct rcu_head rcu; 2941aa4e9fSJuan Quintela struct MemoryRegion *mr; 3041aa4e9fSJuan Quintela uint8_t *host; 3141aa4e9fSJuan Quintela uint8_t *colo_cache; /* For colo, VM's ram cache */ 3241aa4e9fSJuan Quintela ram_addr_t offset; 3341aa4e9fSJuan Quintela ram_addr_t used_length; 3441aa4e9fSJuan Quintela ram_addr_t max_length; 3541aa4e9fSJuan Quintela void (*resized)(const char*, uint64_t length, void *host); 3641aa4e9fSJuan Quintela uint32_t flags; 37a4a411fbSStefan Hajnoczi /* Protected by the BQL. */ 3841aa4e9fSJuan Quintela char idstr[256]; 3941aa4e9fSJuan Quintela /* RCU-enabled, writes protected by the ramlist lock */ 4041aa4e9fSJuan Quintela QLIST_ENTRY(RAMBlock) next; 4141aa4e9fSJuan Quintela QLIST_HEAD(, RAMBlockNotifier) ramblock_notifiers; 4241aa4e9fSJuan Quintela int fd; 434b870dc4SAlexander Graf uint64_t fd_offset; 4415f7a80cSXiaoyao Li int guest_memfd; 4541aa4e9fSJuan Quintela size_t page_size; 4641aa4e9fSJuan Quintela /* dirty bitmap used during migration */ 4741aa4e9fSJuan Quintela unsigned long *bmap; 48c2d5c4a7SFabiano Rosas 49c2d5c4a7SFabiano Rosas /* 50c2d5c4a7SFabiano Rosas * Below fields are only used by mapped-ram migration 51c2d5c4a7SFabiano Rosas */ 52c2d5c4a7SFabiano Rosas /* bitmap of pages present in the migration file */ 53c2d5c4a7SFabiano Rosas unsigned long *file_bmap; 54c2d5c4a7SFabiano Rosas /* 55c2d5c4a7SFabiano Rosas * offset in the file pages belonging to this ramblock are saved, 56c2d5c4a7SFabiano Rosas * used only during migration to a file. 57c2d5c4a7SFabiano Rosas */ 58c2d5c4a7SFabiano Rosas off_t bitmap_offset; 59c2d5c4a7SFabiano Rosas uint64_t pages_offset; 60c2d5c4a7SFabiano Rosas 61*5ef7e26bSYuan Liu /* Bitmap of already received pages. Only used on destination side. */ 6241aa4e9fSJuan Quintela unsigned long *receivedmap; 6341aa4e9fSJuan Quintela 6441aa4e9fSJuan Quintela /* 6541aa4e9fSJuan Quintela * bitmap to track already cleared dirty bitmap. When the bit is 6641aa4e9fSJuan Quintela * set, it means the corresponding memory chunk needs a log-clear. 6741aa4e9fSJuan Quintela * Set this up to non-NULL to enable the capability to postpone 6841aa4e9fSJuan Quintela * and split clearing of dirty bitmap on the remote node (e.g., 6941aa4e9fSJuan Quintela * KVM). The bitmap will be set only when doing global sync. 7041aa4e9fSJuan Quintela * 71cedb70eaSPeter Xu * It is only used during src side of ram migration, and it is 72cedb70eaSPeter Xu * protected by the global ram_state.bitmap_mutex. 73cedb70eaSPeter Xu * 7441aa4e9fSJuan Quintela * NOTE: this bitmap is different comparing to the other bitmaps 7541aa4e9fSJuan Quintela * in that one bit can represent multiple guest pages (which is 7641aa4e9fSJuan Quintela * decided by the `clear_bmap_shift' variable below). On 7741aa4e9fSJuan Quintela * destination side, this should always be NULL, and the variable 7841aa4e9fSJuan Quintela * `clear_bmap_shift' is meaningless. 7941aa4e9fSJuan Quintela */ 8041aa4e9fSJuan Quintela unsigned long *clear_bmap; 8141aa4e9fSJuan Quintela uint8_t clear_bmap_shift; 82898ba906SDavid Hildenbrand 83898ba906SDavid Hildenbrand /* 84898ba906SDavid Hildenbrand * RAM block length that corresponds to the used_length on the migration 85898ba906SDavid Hildenbrand * source (after RAM block sizes were synchronized). Especially, after 86898ba906SDavid Hildenbrand * starting to run the guest, used_length and postcopy_length can differ. 87898ba906SDavid Hildenbrand * Used to register/unregister uffd handlers and as the size of the received 88898ba906SDavid Hildenbrand * bitmap. Receiving any page beyond this length will bail out, as it 89898ba906SDavid Hildenbrand * could not have been valid on the source. 90898ba906SDavid Hildenbrand */ 91898ba906SDavid Hildenbrand ram_addr_t postcopy_length; 9241aa4e9fSJuan Quintela }; 9341aa4e9fSJuan Quintela #endif 9441aa4e9fSJuan Quintela #endif 95