1*548a0165SRichard Henderson /* 2*548a0165SRichard Henderson * Declarations for cpu physical memory functions 3*548a0165SRichard Henderson * 4*548a0165SRichard Henderson * Copyright 2011 Red Hat, Inc. and/or its affiliates 5*548a0165SRichard Henderson * 6*548a0165SRichard Henderson * Authors: 7*548a0165SRichard Henderson * Avi Kivity <avi@redhat.com> 8*548a0165SRichard Henderson * 9*548a0165SRichard Henderson * This work is licensed under the terms of the GNU GPL, version 2 or 10*548a0165SRichard Henderson * later. See the COPYING file in the top-level directory. 11*548a0165SRichard Henderson * 12*548a0165SRichard Henderson */ 13*548a0165SRichard Henderson 14*548a0165SRichard Henderson /* 15*548a0165SRichard Henderson * This header is for use by exec.c and memory.c ONLY. Do not include it. 16*548a0165SRichard Henderson * The functions declared here will be removed soon. 17*548a0165SRichard Henderson */ 18*548a0165SRichard Henderson 19*548a0165SRichard Henderson #ifndef SYSTEM_RAMBLOCK_H 20*548a0165SRichard Henderson #define SYSTEM_RAMBLOCK_H 21*548a0165SRichard Henderson 22*548a0165SRichard Henderson #include "exec/cpu-common.h" 23*548a0165SRichard Henderson #include "qemu/rcu.h" 24*548a0165SRichard Henderson #include "exec/ramlist.h" 25*548a0165SRichard Henderson 26*548a0165SRichard Henderson struct RAMBlock { 27*548a0165SRichard Henderson struct rcu_head rcu; 28*548a0165SRichard Henderson struct MemoryRegion *mr; 29*548a0165SRichard Henderson uint8_t *host; 30*548a0165SRichard Henderson uint8_t *colo_cache; /* For colo, VM's ram cache */ 31*548a0165SRichard Henderson ram_addr_t offset; 32*548a0165SRichard Henderson ram_addr_t used_length; 33*548a0165SRichard Henderson ram_addr_t max_length; 34*548a0165SRichard Henderson void (*resized)(const char*, uint64_t length, void *host); 35*548a0165SRichard Henderson uint32_t flags; 36*548a0165SRichard Henderson /* Protected by the BQL. */ 37*548a0165SRichard Henderson char idstr[256]; 38*548a0165SRichard Henderson /* RCU-enabled, writes protected by the ramlist lock */ 39*548a0165SRichard Henderson QLIST_ENTRY(RAMBlock) next; 40*548a0165SRichard Henderson QLIST_HEAD(, RAMBlockNotifier) ramblock_notifiers; 41*548a0165SRichard Henderson Error *cpr_blocker; 42*548a0165SRichard Henderson int fd; 43*548a0165SRichard Henderson uint64_t fd_offset; 44*548a0165SRichard Henderson int guest_memfd; 45*548a0165SRichard Henderson size_t page_size; 46*548a0165SRichard Henderson /* dirty bitmap used during migration */ 47*548a0165SRichard Henderson unsigned long *bmap; 48*548a0165SRichard Henderson 49*548a0165SRichard Henderson /* 50*548a0165SRichard Henderson * Below fields are only used by mapped-ram migration 51*548a0165SRichard Henderson */ 52*548a0165SRichard Henderson /* bitmap of pages present in the migration file */ 53*548a0165SRichard Henderson unsigned long *file_bmap; 54*548a0165SRichard Henderson /* 55*548a0165SRichard Henderson * offset in the file pages belonging to this ramblock are saved, 56*548a0165SRichard Henderson * used only during migration to a file. 57*548a0165SRichard Henderson */ 58*548a0165SRichard Henderson off_t bitmap_offset; 59*548a0165SRichard Henderson uint64_t pages_offset; 60*548a0165SRichard Henderson 61*548a0165SRichard Henderson /* Bitmap of already received pages. Only used on destination side. */ 62*548a0165SRichard Henderson unsigned long *receivedmap; 63*548a0165SRichard Henderson 64*548a0165SRichard Henderson /* 65*548a0165SRichard Henderson * bitmap to track already cleared dirty bitmap. When the bit is 66*548a0165SRichard Henderson * set, it means the corresponding memory chunk needs a log-clear. 67*548a0165SRichard Henderson * Set this up to non-NULL to enable the capability to postpone 68*548a0165SRichard Henderson * and split clearing of dirty bitmap on the remote node (e.g., 69*548a0165SRichard Henderson * KVM). The bitmap will be set only when doing global sync. 70*548a0165SRichard Henderson * 71*548a0165SRichard Henderson * It is only used during src side of ram migration, and it is 72*548a0165SRichard Henderson * protected by the global ram_state.bitmap_mutex. 73*548a0165SRichard Henderson * 74*548a0165SRichard Henderson * NOTE: this bitmap is different comparing to the other bitmaps 75*548a0165SRichard Henderson * in that one bit can represent multiple guest pages (which is 76*548a0165SRichard Henderson * decided by the `clear_bmap_shift' variable below). On 77*548a0165SRichard Henderson * destination side, this should always be NULL, and the variable 78*548a0165SRichard Henderson * `clear_bmap_shift' is meaningless. 79*548a0165SRichard Henderson */ 80*548a0165SRichard Henderson unsigned long *clear_bmap; 81*548a0165SRichard Henderson uint8_t clear_bmap_shift; 82*548a0165SRichard Henderson 83*548a0165SRichard Henderson /* 84*548a0165SRichard Henderson * RAM block length that corresponds to the used_length on the migration 85*548a0165SRichard Henderson * source (after RAM block sizes were synchronized). Especially, after 86*548a0165SRichard Henderson * starting to run the guest, used_length and postcopy_length can differ. 87*548a0165SRichard Henderson * Used to register/unregister uffd handlers and as the size of the received 88*548a0165SRichard Henderson * bitmap. Receiving any page beyond this length will bail out, as it 89*548a0165SRichard Henderson * could not have been valid on the source. 90*548a0165SRichard Henderson */ 91*548a0165SRichard Henderson ram_addr_t postcopy_length; 92*548a0165SRichard Henderson }; 93*548a0165SRichard Henderson 94*548a0165SRichard Henderson #endif 95