memory: Don't set migration bitmap when without migration
Similar to 9460dee4b2
("memory: do not touch code dirty bitmap unless
TCG is enabled", 2015-06-05) but for the migration bitmap - we can
skip the MIGRATION bitmap update if migration not enabled.
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
Signed-off-by: Peter Xu <peterx@redhat.com>
Message-Id: <20190603065056.25211-4-peterx@redhat.com>
Signed-off-by: Juan Quintela <quintela@redhat.com>
This commit is contained in:
parent
267691b65c
commit
ae7a2bca8a
@ -46,6 +46,8 @@
|
|||||||
OBJECT_GET_CLASS(IOMMUMemoryRegionClass, (obj), \
|
OBJECT_GET_CLASS(IOMMUMemoryRegionClass, (obj), \
|
||||||
TYPE_IOMMU_MEMORY_REGION)
|
TYPE_IOMMU_MEMORY_REGION)
|
||||||
|
|
||||||
|
extern bool global_dirty_log;
|
||||||
|
|
||||||
typedef struct MemoryRegionOps MemoryRegionOps;
|
typedef struct MemoryRegionOps MemoryRegionOps;
|
||||||
typedef struct MemoryRegionMmio MemoryRegionMmio;
|
typedef struct MemoryRegionMmio MemoryRegionMmio;
|
||||||
|
|
||||||
|
@ -349,8 +349,13 @@ static inline void cpu_physical_memory_set_dirty_lebitmap(unsigned long *bitmap,
|
|||||||
if (bitmap[k]) {
|
if (bitmap[k]) {
|
||||||
unsigned long temp = leul_to_cpu(bitmap[k]);
|
unsigned long temp = leul_to_cpu(bitmap[k]);
|
||||||
|
|
||||||
atomic_or(&blocks[DIRTY_MEMORY_MIGRATION][idx][offset], temp);
|
|
||||||
atomic_or(&blocks[DIRTY_MEMORY_VGA][idx][offset], temp);
|
atomic_or(&blocks[DIRTY_MEMORY_VGA][idx][offset], temp);
|
||||||
|
|
||||||
|
if (global_dirty_log) {
|
||||||
|
atomic_or(&blocks[DIRTY_MEMORY_MIGRATION][idx][offset],
|
||||||
|
temp);
|
||||||
|
}
|
||||||
|
|
||||||
if (tcg_enabled()) {
|
if (tcg_enabled()) {
|
||||||
atomic_or(&blocks[DIRTY_MEMORY_CODE][idx][offset], temp);
|
atomic_or(&blocks[DIRTY_MEMORY_CODE][idx][offset], temp);
|
||||||
}
|
}
|
||||||
@ -367,6 +372,11 @@ static inline void cpu_physical_memory_set_dirty_lebitmap(unsigned long *bitmap,
|
|||||||
xen_hvm_modified_memory(start, pages << TARGET_PAGE_BITS);
|
xen_hvm_modified_memory(start, pages << TARGET_PAGE_BITS);
|
||||||
} else {
|
} else {
|
||||||
uint8_t clients = tcg_enabled() ? DIRTY_CLIENTS_ALL : DIRTY_CLIENTS_NOCODE;
|
uint8_t clients = tcg_enabled() ? DIRTY_CLIENTS_ALL : DIRTY_CLIENTS_NOCODE;
|
||||||
|
|
||||||
|
if (!global_dirty_log) {
|
||||||
|
clients &= ~(1 << DIRTY_MEMORY_MIGRATION);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* bitmap-traveling is faster than memory-traveling (for addr...)
|
* bitmap-traveling is faster than memory-traveling (for addr...)
|
||||||
* especially when most of the memory is not dirty.
|
* especially when most of the memory is not dirty.
|
||||||
|
2
memory.c
2
memory.c
@ -38,7 +38,7 @@
|
|||||||
static unsigned memory_region_transaction_depth;
|
static unsigned memory_region_transaction_depth;
|
||||||
static bool memory_region_update_pending;
|
static bool memory_region_update_pending;
|
||||||
static bool ioeventfd_update_pending;
|
static bool ioeventfd_update_pending;
|
||||||
static bool global_dirty_log = false;
|
bool global_dirty_log;
|
||||||
|
|
||||||
static QTAILQ_HEAD(, MemoryListener) memory_listeners
|
static QTAILQ_HEAD(, MemoryListener) memory_listeners
|
||||||
= QTAILQ_HEAD_INITIALIZER(memory_listeners);
|
= QTAILQ_HEAD_INITIALIZER(memory_listeners);
|
||||||
|
Loading…
Reference in New Issue
Block a user