| /* |
| * Declarations for cpu physical memory functions |
| * |
| * Copyright 2011 Red Hat, Inc. and/or its affiliates |
| * |
| * Authors: |
| * Avi Kivity <avi@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. |
| * |
| */ |
| |
| /* |
| * This header is for use by exec.c and memory.c ONLY. Do not include it. |
| * The functions declared here will be removed soon. |
| */ |
| |
| #ifndef QEMU_EXEC_RAMBLOCK_H |
| #define QEMU_EXEC_RAMBLOCK_H |
| |
| #ifndef CONFIG_USER_ONLY |
| #include "cpu-common.h" |
| #include "qemu/rcu.h" |
| #include "exec/ramlist.h" |
| |
| struct RAMBlock { |
| struct rcu_head rcu; |
| struct MemoryRegion *mr; |
| uint8_t *host; |
| uint8_t *colo_cache; /* For colo, VM's ram cache */ |
| ram_addr_t offset; |
| ram_addr_t used_length; |
| ram_addr_t max_length; |
| void (*resized)(const char*, uint64_t length, void *host); |
| uint32_t flags; |
| /* Protected by the BQL. */ |
| char idstr[256]; |
| /* RCU-enabled, writes protected by the ramlist lock */ |
| QLIST_ENTRY(RAMBlock) next; |
| QLIST_HEAD(, RAMBlockNotifier) ramblock_notifiers; |
| int fd; |
| uint64_t fd_offset; |
| int guest_memfd; |
| size_t page_size; |
| /* dirty bitmap used during migration */ |
| unsigned long *bmap; |
| |
| /* |
| * Below fields are only used by mapped-ram migration |
| */ |
| /* bitmap of pages present in the migration file */ |
| unsigned long *file_bmap; |
| /* |
| * offset in the file pages belonging to this ramblock are saved, |
| * used only during migration to a file. |
| */ |
| off_t bitmap_offset; |
| uint64_t pages_offset; |
| |
| /* Bitmap of already received pages. Only used on destination side. */ |
| unsigned long *receivedmap; |
| |
| /* |
| * bitmap to track already cleared dirty bitmap. When the bit is |
| * set, it means the corresponding memory chunk needs a log-clear. |
| * Set this up to non-NULL to enable the capability to postpone |
| * and split clearing of dirty bitmap on the remote node (e.g., |
| * KVM). The bitmap will be set only when doing global sync. |
| * |
| * It is only used during src side of ram migration, and it is |
| * protected by the global ram_state.bitmap_mutex. |
| * |
| * NOTE: this bitmap is different comparing to the other bitmaps |
| * in that one bit can represent multiple guest pages (which is |
| * decided by the `clear_bmap_shift' variable below). On |
| * destination side, this should always be NULL, and the variable |
| * `clear_bmap_shift' is meaningless. |
| */ |
| unsigned long *clear_bmap; |
| uint8_t clear_bmap_shift; |
| |
| /* |
| * RAM block length that corresponds to the used_length on the migration |
| * source (after RAM block sizes were synchronized). Especially, after |
| * starting to run the guest, used_length and postcopy_length can differ. |
| * Used to register/unregister uffd handlers and as the size of the received |
| * bitmap. Receiving any page beyond this length will bail out, as it |
| * could not have been valid on the source. |
| */ |
| ram_addr_t postcopy_length; |
| }; |
| #endif |
| #endif |