On 08/05/19 01:15, Peter Xu wrote: > 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. > > Signed-off-by: Peter Xu <pet...@redhat.com> > --- > include/exec/memory.h | 2 ++ > include/exec/ram_addr.h | 12 +++++++++++- > memory.c | 2 +- > 3 files changed, 14 insertions(+), 2 deletions(-) > > diff --git a/include/exec/memory.h b/include/exec/memory.h > index e6140e8a04..f29300c54d 100644 > --- a/include/exec/memory.h > +++ b/include/exec/memory.h > @@ -46,6 +46,8 @@ > OBJECT_GET_CLASS(IOMMUMemoryRegionClass, (obj), \ > TYPE_IOMMU_MEMORY_REGION) > > +extern bool global_dirty_log; > + > typedef struct MemoryRegionOps MemoryRegionOps; > typedef struct MemoryRegionMmio MemoryRegionMmio; > > diff --git a/include/exec/ram_addr.h b/include/exec/ram_addr.h > index 993fb760f3..86bc8e1a4a 100644 > --- a/include/exec/ram_addr.h > +++ b/include/exec/ram_addr.h > @@ -348,8 +348,13 @@ static inline void > cpu_physical_memory_set_dirty_lebitmap(unsigned long *bitmap, > if (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); > + > + if (global_dirty_log) { > + atomic_or(&blocks[DIRTY_MEMORY_MIGRATION][idx][offset], > + temp); > + } > + > if (tcg_enabled()) { > atomic_or(&blocks[DIRTY_MEMORY_CODE][idx][offset], temp); > } > @@ -366,6 +371,11 @@ static inline void > cpu_physical_memory_set_dirty_lebitmap(unsigned long *bitmap, > xen_hvm_modified_memory(start, pages << TARGET_PAGE_BITS); > } else { > 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...) > * especially when most of the memory is not dirty. > diff --git a/memory.c b/memory.c > index 0cce3a6fc5..1cc3531df5 100644 > --- a/memory.c > +++ b/memory.c > @@ -38,7 +38,7 @@ > static unsigned memory_region_transaction_depth; > static bool memory_region_update_pending; > static bool ioeventfd_update_pending; > -static bool global_dirty_log = false; > +bool global_dirty_log; > > static QTAILQ_HEAD(, MemoryListener) memory_listeners > = QTAILQ_HEAD_INITIALIZER(memory_listeners); >
Reviewed-by: Paolo Bonzini <pbonz...@redhat.com>