1548a0165SRichard Henderson /* 2548a0165SRichard Henderson * Declarations for cpu physical memory functions 3548a0165SRichard Henderson * 4548a0165SRichard Henderson * Copyright 2011 Red Hat, Inc. and/or its affiliates 5548a0165SRichard Henderson * 6548a0165SRichard Henderson * Authors: 7548a0165SRichard Henderson * Avi Kivity <avi@redhat.com> 8548a0165SRichard Henderson * 9548a0165SRichard Henderson * This work is licensed under the terms of the GNU GPL, version 2 or 10548a0165SRichard Henderson * later. See the COPYING file in the top-level directory. 11548a0165SRichard Henderson * 12548a0165SRichard Henderson */ 13548a0165SRichard Henderson 14548a0165SRichard Henderson /* 15548a0165SRichard Henderson * This header is for use by exec.c and memory.c ONLY. Do not include it. 16548a0165SRichard Henderson * The functions declared here will be removed soon. 17548a0165SRichard Henderson */ 18548a0165SRichard Henderson 19548a0165SRichard Henderson #ifndef SYSTEM_RAMBLOCK_H 20548a0165SRichard Henderson #define SYSTEM_RAMBLOCK_H 21548a0165SRichard Henderson 22548a0165SRichard Henderson #include "exec/cpu-common.h" 23548a0165SRichard Henderson #include "qemu/rcu.h" 24548a0165SRichard Henderson #include "exec/ramlist.h" 25*5d6483edSChenyi Qiang #include "system/hostmem.h" 26*5d6483edSChenyi Qiang 27*5d6483edSChenyi Qiang #define TYPE_RAM_BLOCK_ATTRIBUTES "ram-block-attributes" 28*5d6483edSChenyi Qiang OBJECT_DECLARE_SIMPLE_TYPE(RamBlockAttributes, RAM_BLOCK_ATTRIBUTES) 29548a0165SRichard Henderson 30548a0165SRichard Henderson struct RAMBlock { 31548a0165SRichard Henderson struct rcu_head rcu; 32548a0165SRichard Henderson struct MemoryRegion *mr; 33548a0165SRichard Henderson uint8_t *host; 34548a0165SRichard Henderson uint8_t *colo_cache; /* For colo, VM's ram cache */ 35548a0165SRichard Henderson ram_addr_t offset; 36548a0165SRichard Henderson ram_addr_t used_length; 37548a0165SRichard Henderson ram_addr_t max_length; 38548a0165SRichard Henderson void (*resized)(const char*, uint64_t length, void *host); 39548a0165SRichard Henderson uint32_t flags; 40548a0165SRichard Henderson /* Protected by the BQL. */ 41548a0165SRichard Henderson char idstr[256]; 42548a0165SRichard Henderson /* RCU-enabled, writes protected by the ramlist lock */ 43548a0165SRichard Henderson QLIST_ENTRY(RAMBlock) next; 44548a0165SRichard Henderson QLIST_HEAD(, RAMBlockNotifier) ramblock_notifiers; 45548a0165SRichard Henderson Error *cpr_blocker; 46548a0165SRichard Henderson int fd; 47548a0165SRichard Henderson uint64_t fd_offset; 48548a0165SRichard Henderson int guest_memfd; 49548a0165SRichard Henderson size_t page_size; 50548a0165SRichard Henderson /* dirty bitmap used during migration */ 51548a0165SRichard Henderson unsigned long *bmap; 52548a0165SRichard Henderson 53548a0165SRichard Henderson /* 54548a0165SRichard Henderson * Below fields are only used by mapped-ram migration 55548a0165SRichard Henderson */ 56548a0165SRichard Henderson /* bitmap of pages present in the migration file */ 57548a0165SRichard Henderson unsigned long *file_bmap; 58548a0165SRichard Henderson /* 59548a0165SRichard Henderson * offset in the file pages belonging to this ramblock are saved, 60548a0165SRichard Henderson * used only during migration to a file. 61548a0165SRichard Henderson */ 62548a0165SRichard Henderson off_t bitmap_offset; 63548a0165SRichard Henderson uint64_t pages_offset; 64548a0165SRichard Henderson 65548a0165SRichard Henderson /* Bitmap of already received pages. Only used on destination side. */ 66548a0165SRichard Henderson unsigned long *receivedmap; 67548a0165SRichard Henderson 68548a0165SRichard Henderson /* 69548a0165SRichard Henderson * bitmap to track already cleared dirty bitmap. When the bit is 70548a0165SRichard Henderson * set, it means the corresponding memory chunk needs a log-clear. 71548a0165SRichard Henderson * Set this up to non-NULL to enable the capability to postpone 72548a0165SRichard Henderson * and split clearing of dirty bitmap on the remote node (e.g., 73548a0165SRichard Henderson * KVM). The bitmap will be set only when doing global sync. 74548a0165SRichard Henderson * 75548a0165SRichard Henderson * It is only used during src side of ram migration, and it is 76548a0165SRichard Henderson * protected by the global ram_state.bitmap_mutex. 77548a0165SRichard Henderson * 78548a0165SRichard Henderson * NOTE: this bitmap is different comparing to the other bitmaps 79548a0165SRichard Henderson * in that one bit can represent multiple guest pages (which is 80548a0165SRichard Henderson * decided by the `clear_bmap_shift' variable below). On 81548a0165SRichard Henderson * destination side, this should always be NULL, and the variable 82548a0165SRichard Henderson * `clear_bmap_shift' is meaningless. 83548a0165SRichard Henderson */ 84548a0165SRichard Henderson unsigned long *clear_bmap; 85548a0165SRichard Henderson uint8_t clear_bmap_shift; 86548a0165SRichard Henderson 87548a0165SRichard Henderson /* 88548a0165SRichard Henderson * RAM block length that corresponds to the used_length on the migration 89548a0165SRichard Henderson * source (after RAM block sizes were synchronized). Especially, after 90548a0165SRichard Henderson * starting to run the guest, used_length and postcopy_length can differ. 91548a0165SRichard Henderson * Used to register/unregister uffd handlers and as the size of the received 92548a0165SRichard Henderson * bitmap. Receiving any page beyond this length will bail out, as it 93548a0165SRichard Henderson * could not have been valid on the source. 94548a0165SRichard Henderson */ 95548a0165SRichard Henderson ram_addr_t postcopy_length; 96548a0165SRichard Henderson }; 97548a0165SRichard Henderson 98*5d6483edSChenyi Qiang struct RamBlockAttributes { 99*5d6483edSChenyi Qiang Object parent; 100*5d6483edSChenyi Qiang 101*5d6483edSChenyi Qiang RAMBlock *ram_block; 102*5d6483edSChenyi Qiang 103*5d6483edSChenyi Qiang /* 1-setting of the bitmap represents ram is populated (shared) */ 104*5d6483edSChenyi Qiang unsigned bitmap_size; 105*5d6483edSChenyi Qiang unsigned long *bitmap; 106*5d6483edSChenyi Qiang 107*5d6483edSChenyi Qiang QLIST_HEAD(, RamDiscardListener) rdl_list; 108*5d6483edSChenyi Qiang }; 109*5d6483edSChenyi Qiang 110*5d6483edSChenyi Qiang RamBlockAttributes *ram_block_attributes_create(RAMBlock *ram_block); 111*5d6483edSChenyi Qiang void ram_block_attributes_destroy(RamBlockAttributes *attr); 112*5d6483edSChenyi Qiang int ram_block_attributes_state_change(RamBlockAttributes *attr, uint64_t offset, 113*5d6483edSChenyi Qiang uint64_t size, bool to_discard); 114*5d6483edSChenyi Qiang 115548a0165SRichard Henderson #endif 116