xref: /openbmc/qemu/include/system/ramblock.h (revision 548a01650c9be153b352406cd4afb86cb350788e)
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