xref: /openbmc/qemu/include/exec/ramblock.h (revision 88daa112d4eda4e6c29f9f7004be09c13e4785df)
141aa4e9fSJuan Quintela /*
241aa4e9fSJuan Quintela  * Declarations for cpu physical memory functions
341aa4e9fSJuan Quintela  *
441aa4e9fSJuan Quintela  * Copyright 2011 Red Hat, Inc. and/or its affiliates
541aa4e9fSJuan Quintela  *
641aa4e9fSJuan Quintela  * Authors:
741aa4e9fSJuan Quintela  *  Avi Kivity <avi@redhat.com>
841aa4e9fSJuan Quintela  *
941aa4e9fSJuan Quintela  * This work is licensed under the terms of the GNU GPL, version 2 or
1041aa4e9fSJuan Quintela  * later.  See the COPYING file in the top-level directory.
1141aa4e9fSJuan Quintela  *
1241aa4e9fSJuan Quintela  */
1341aa4e9fSJuan Quintela 
1441aa4e9fSJuan Quintela /*
1541aa4e9fSJuan Quintela  * This header is for use by exec.c and memory.c ONLY.  Do not include it.
1641aa4e9fSJuan Quintela  * The functions declared here will be removed soon.
1741aa4e9fSJuan Quintela  */
1841aa4e9fSJuan Quintela 
1941aa4e9fSJuan Quintela #ifndef QEMU_EXEC_RAMBLOCK_H
2041aa4e9fSJuan Quintela #define QEMU_EXEC_RAMBLOCK_H
2141aa4e9fSJuan Quintela 
2241aa4e9fSJuan Quintela #ifndef CONFIG_USER_ONLY
2341aa4e9fSJuan Quintela #include "cpu-common.h"
2440d7ca33SPhilippe Mathieu-Daudé #include "qemu/rcu.h"
2540d7ca33SPhilippe Mathieu-Daudé #include "exec/ramlist.h"
2641aa4e9fSJuan Quintela 
2741aa4e9fSJuan Quintela struct RAMBlock {
2841aa4e9fSJuan Quintela     struct rcu_head rcu;
2941aa4e9fSJuan Quintela     struct MemoryRegion *mr;
3041aa4e9fSJuan Quintela     uint8_t *host;
3141aa4e9fSJuan Quintela     uint8_t *colo_cache; /* For colo, VM's ram cache */
3241aa4e9fSJuan Quintela     ram_addr_t offset;
3341aa4e9fSJuan Quintela     ram_addr_t used_length;
3441aa4e9fSJuan Quintela     ram_addr_t max_length;
3541aa4e9fSJuan Quintela     void (*resized)(const char*, uint64_t length, void *host);
3641aa4e9fSJuan Quintela     uint32_t flags;
37a4a411fbSStefan Hajnoczi     /* Protected by the BQL.  */
3841aa4e9fSJuan Quintela     char idstr[256];
3941aa4e9fSJuan Quintela     /* RCU-enabled, writes protected by the ramlist lock */
4041aa4e9fSJuan Quintela     QLIST_ENTRY(RAMBlock) next;
4141aa4e9fSJuan Quintela     QLIST_HEAD(, RAMBlockNotifier) ramblock_notifiers;
4241aa4e9fSJuan Quintela     int fd;
434b870dc4SAlexander Graf     uint64_t fd_offset;
4415f7a80cSXiaoyao Li     int guest_memfd;
4541aa4e9fSJuan Quintela     size_t page_size;
4641aa4e9fSJuan Quintela     /* dirty bitmap used during migration */
4741aa4e9fSJuan Quintela     unsigned long *bmap;
48c2d5c4a7SFabiano Rosas 
49c2d5c4a7SFabiano Rosas     /*
50c2d5c4a7SFabiano Rosas      * Below fields are only used by mapped-ram migration
51c2d5c4a7SFabiano Rosas      */
52c2d5c4a7SFabiano Rosas     /* bitmap of pages present in the migration file */
53c2d5c4a7SFabiano Rosas     unsigned long *file_bmap;
54c2d5c4a7SFabiano Rosas     /*
55c2d5c4a7SFabiano Rosas      * offset in the file pages belonging to this ramblock are saved,
56c2d5c4a7SFabiano Rosas      * used only during migration to a file.
57c2d5c4a7SFabiano Rosas      */
58c2d5c4a7SFabiano Rosas     off_t bitmap_offset;
59c2d5c4a7SFabiano Rosas     uint64_t pages_offset;
60c2d5c4a7SFabiano Rosas 
61*5ef7e26bSYuan Liu     /* Bitmap of already received pages.  Only used on destination side. */
6241aa4e9fSJuan Quintela     unsigned long *receivedmap;
6341aa4e9fSJuan Quintela 
6441aa4e9fSJuan Quintela     /*
6541aa4e9fSJuan Quintela      * bitmap to track already cleared dirty bitmap.  When the bit is
6641aa4e9fSJuan Quintela      * set, it means the corresponding memory chunk needs a log-clear.
6741aa4e9fSJuan Quintela      * Set this up to non-NULL to enable the capability to postpone
6841aa4e9fSJuan Quintela      * and split clearing of dirty bitmap on the remote node (e.g.,
6941aa4e9fSJuan Quintela      * KVM).  The bitmap will be set only when doing global sync.
7041aa4e9fSJuan Quintela      *
71cedb70eaSPeter Xu      * It is only used during src side of ram migration, and it is
72cedb70eaSPeter Xu      * protected by the global ram_state.bitmap_mutex.
73cedb70eaSPeter Xu      *
7441aa4e9fSJuan Quintela      * NOTE: this bitmap is different comparing to the other bitmaps
7541aa4e9fSJuan Quintela      * in that one bit can represent multiple guest pages (which is
7641aa4e9fSJuan Quintela      * decided by the `clear_bmap_shift' variable below).  On
7741aa4e9fSJuan Quintela      * destination side, this should always be NULL, and the variable
7841aa4e9fSJuan Quintela      * `clear_bmap_shift' is meaningless.
7941aa4e9fSJuan Quintela      */
8041aa4e9fSJuan Quintela     unsigned long *clear_bmap;
8141aa4e9fSJuan Quintela     uint8_t clear_bmap_shift;
82898ba906SDavid Hildenbrand 
83898ba906SDavid Hildenbrand     /*
84898ba906SDavid Hildenbrand      * RAM block length that corresponds to the used_length on the migration
85898ba906SDavid Hildenbrand      * source (after RAM block sizes were synchronized). Especially, after
86898ba906SDavid Hildenbrand      * starting to run the guest, used_length and postcopy_length can differ.
87898ba906SDavid Hildenbrand      * Used to register/unregister uffd handlers and as the size of the received
88898ba906SDavid Hildenbrand      * bitmap. Receiving any page beyond this length will bail out, as it
89898ba906SDavid Hildenbrand      * could not have been valid on the source.
90898ba906SDavid Hildenbrand      */
91898ba906SDavid Hildenbrand     ram_addr_t postcopy_length;
9241aa4e9fSJuan Quintela };
9341aa4e9fSJuan Quintela #endif
9441aa4e9fSJuan Quintela #endif
95