diff --git a/xen/arch/x86/include/asm/paging.h b/xen/arch/x86/include/asm/paging.h index f0b4efc66e..b7ecfd4721 100644 --- a/xen/arch/x86/include/asm/paging.h +++ b/xen/arch/x86/include/asm/paging.h @@ -160,9 +160,6 @@ void paging_log_dirty_range(struct domain *d, unsigned long nr, uint8_t *dirty_bitmap); -/* enable log dirty */ -int paging_log_dirty_enable(struct domain *d, bool log_global); - /* log dirty initialization */ void paging_log_dirty_init(struct domain *d, const struct log_dirty_ops *ops); diff --git a/xen/arch/x86/mm/hap/hap.c b/xen/arch/x86/mm/hap/hap.c index c19e337d65..79929774e8 100644 --- a/xen/arch/x86/mm/hap/hap.c +++ b/xen/arch/x86/mm/hap/hap.c @@ -69,13 +69,6 @@ int hap_track_dirty_vram(struct domain *d, { unsigned int size = DIV_ROUND_UP(nr_frames, BITS_PER_BYTE); - if ( !paging_mode_log_dirty(d) ) - { - rc = paging_log_dirty_enable(d, false); - if ( rc ) - goto out; - } - rc = -ENOMEM; dirty_bitmap = vzalloc(size); if ( !dirty_bitmap ) @@ -107,6 +100,10 @@ int hap_track_dirty_vram(struct domain *d, paging_unlock(d); + domain_pause(d); + p2m_enable_hardware_log_dirty(d); + domain_unpause(d); + if ( oend > ostart ) p2m_change_type_range(d, ostart, oend, p2m_ram_logdirty, p2m_ram_rw); diff --git a/xen/arch/x86/mm/paging.c b/xen/arch/x86/mm/paging.c index 1f0b94ad21..b7e2750817 100644 --- a/xen/arch/x86/mm/paging.c +++ b/xen/arch/x86/mm/paging.c @@ -212,7 +212,7 @@ static int paging_free_log_dirty_bitmap(struct domain *d, int rc) return rc; } -int paging_log_dirty_enable(struct domain *d, bool log_global) +static int paging_log_dirty_enable(struct domain *d, bool log_global) { int ret;