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:
Peter Xu 2019-06-03 14:50:48 +08:00 committed by Juan Quintela
parent 267691b65c
commit ae7a2bca8a
3 changed files with 14 additions and 2 deletions

View File

@ -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;

View File

@ -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.

View File

@ -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);