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