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