mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-01 23:03:54 -06:00

Add KVM guest_memfd support to RAMBlock so both normal hva based memory and kvm guest memfd based private memory can be associated in one RAMBlock. Introduce new flag RAM_GUEST_MEMFD. When it's set, it calls KVM ioctl to create private guest_memfd during RAMBlock setup. Allocating a new RAM_GUEST_MEMFD flag to instruct the setup of guest memfd is more flexible and extensible than simply relying on the VM type because in the future we may have the case that not all the memory of a VM need guest memfd. As a benefit, it also avoid getting MachineState in memory subsystem. Note, RAM_GUEST_MEMFD is supposed to be set for memory backends of confidential guests, such as TDX VM. How and when to set it for memory backends will be implemented in the following patches. Introduce memory_region_has_guest_memfd() to query if the MemoryRegion has KVM guest_memfd allocated. Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com> Reviewed-by: David Hildenbrand <david@redhat.com> Message-ID: <20240320083945.991426-7-michael.roth@amd.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
94 lines
3 KiB
C
94 lines
3 KiB
C
/*
|
|
* Declarations for cpu physical memory functions
|
|
*
|
|
* Copyright 2011 Red Hat, Inc. and/or its affiliates
|
|
*
|
|
* Authors:
|
|
* Avi Kivity <avi@redhat.com>
|
|
*
|
|
* This work is licensed under the terms of the GNU GPL, version 2 or
|
|
* later. See the COPYING file in the top-level directory.
|
|
*
|
|
*/
|
|
|
|
/*
|
|
* This header is for use by exec.c and memory.c ONLY. Do not include it.
|
|
* The functions declared here will be removed soon.
|
|
*/
|
|
|
|
#ifndef QEMU_EXEC_RAMBLOCK_H
|
|
#define QEMU_EXEC_RAMBLOCK_H
|
|
|
|
#ifndef CONFIG_USER_ONLY
|
|
#include "cpu-common.h"
|
|
#include "qemu/rcu.h"
|
|
#include "exec/ramlist.h"
|
|
|
|
struct RAMBlock {
|
|
struct rcu_head rcu;
|
|
struct MemoryRegion *mr;
|
|
uint8_t *host;
|
|
uint8_t *colo_cache; /* For colo, VM's ram cache */
|
|
ram_addr_t offset;
|
|
ram_addr_t used_length;
|
|
ram_addr_t max_length;
|
|
void (*resized)(const char*, uint64_t length, void *host);
|
|
uint32_t flags;
|
|
/* Protected by the BQL. */
|
|
char idstr[256];
|
|
/* RCU-enabled, writes protected by the ramlist lock */
|
|
QLIST_ENTRY(RAMBlock) next;
|
|
QLIST_HEAD(, RAMBlockNotifier) ramblock_notifiers;
|
|
int fd;
|
|
uint64_t fd_offset;
|
|
int guest_memfd;
|
|
size_t page_size;
|
|
/* dirty bitmap used during migration */
|
|
unsigned long *bmap;
|
|
|
|
/*
|
|
* Below fields are only used by mapped-ram migration
|
|
*/
|
|
/* bitmap of pages present in the migration file */
|
|
unsigned long *file_bmap;
|
|
/*
|
|
* offset in the file pages belonging to this ramblock are saved,
|
|
* used only during migration to a file.
|
|
*/
|
|
off_t bitmap_offset;
|
|
uint64_t pages_offset;
|
|
|
|
/* bitmap of already received pages in postcopy */
|
|
unsigned long *receivedmap;
|
|
|
|
/*
|
|
* bitmap to track already cleared dirty bitmap. When the bit is
|
|
* set, it means the corresponding memory chunk needs a log-clear.
|
|
* Set this up to non-NULL to enable the capability to postpone
|
|
* and split clearing of dirty bitmap on the remote node (e.g.,
|
|
* KVM). The bitmap will be set only when doing global sync.
|
|
*
|
|
* It is only used during src side of ram migration, and it is
|
|
* protected by the global ram_state.bitmap_mutex.
|
|
*
|
|
* NOTE: this bitmap is different comparing to the other bitmaps
|
|
* in that one bit can represent multiple guest pages (which is
|
|
* decided by the `clear_bmap_shift' variable below). On
|
|
* destination side, this should always be NULL, and the variable
|
|
* `clear_bmap_shift' is meaningless.
|
|
*/
|
|
unsigned long *clear_bmap;
|
|
uint8_t clear_bmap_shift;
|
|
|
|
/*
|
|
* RAM block length that corresponds to the used_length on the migration
|
|
* source (after RAM block sizes were synchronized). Especially, after
|
|
* starting to run the guest, used_length and postcopy_length can differ.
|
|
* Used to register/unregister uffd handlers and as the size of the received
|
|
* bitmap. Receiving any page beyond this length will bail out, as it
|
|
* could not have been valid on the source.
|
|
*/
|
|
ram_addr_t postcopy_length;
|
|
};
|
|
#endif
|
|
#endif
|