if ( !paging_mode_log_dirty(d) )
{
hap_logdirty_init(d);
- rc = paging_log_dirty_enable(d);
+ rc = paging_log_dirty_enable(d, 0);
if ( rc )
goto out;
}
/* HAP LOG DIRTY SUPPORT */
/************************************************/
-/* hap code to call when log_dirty is enable. return 0 if no problem found. */
-static int hap_enable_log_dirty(struct domain *d)
+/*
+ * hap code to call when log_dirty is enable. return 0 if no problem found.
+ *
+ * NB: Domain that having device assigned should not set log_global. Because
+ * there is no way to track the memory updating from device.
+ */
+static int hap_enable_log_dirty(struct domain *d, bool_t log_global)
{
/* turn on PG_log_dirty bit in paging mode */
paging_lock(d);
d->arch.paging.mode |= PG_log_dirty;
paging_unlock(d);
- /* set l1e entries of P2M table to be read-only. */
- p2m_change_entry_type_global(d, p2m_ram_rw, p2m_ram_logdirty);
- flush_tlb_mask(d->domain_dirty_cpumask);
+ if ( log_global )
+ {
+ /* set l1e entries of P2M table to be read-only. */
+ p2m_change_entry_type_global(d, p2m_ram_rw, p2m_ram_logdirty);
+ flush_tlb_mask(d->domain_dirty_cpumask);
+ }
return 0;
}
paging_unlock(d);
}
-int paging_log_dirty_enable(struct domain *d)
+int paging_log_dirty_enable(struct domain *d, bool_t log_global)
{
int ret;
return -EINVAL;
domain_pause(d);
- ret = d->arch.paging.log_dirty.enable_log_dirty(d);
+ ret = d->arch.paging.log_dirty.enable_log_dirty(d, log_global);
domain_unpause(d);
return ret;
* These function pointers must not be followed with the log-dirty lock held.
*/
void paging_log_dirty_init(struct domain *d,
- int (*enable_log_dirty)(struct domain *d),
+ int (*enable_log_dirty)(struct domain *d,
+ bool_t log_global),
int (*disable_log_dirty)(struct domain *d),
void (*clean_dirty_bitmap)(struct domain *d))
{
case XEN_DOMCTL_SHADOW_OP_ENABLE_LOGDIRTY:
if ( hap_enabled(d) )
hap_logdirty_init(d);
- return paging_log_dirty_enable(d);
+ return paging_log_dirty_enable(d, 1);
case XEN_DOMCTL_SHADOW_OP_OFF:
if ( paging_mode_log_dirty(d) )
/* Shadow specific code which is called in paging_log_dirty_enable().
* Return 0 if no problem found.
*/
-int shadow_enable_log_dirty(struct domain *d)
+int shadow_enable_log_dirty(struct domain *d, bool_t log_global)
{
int ret;
unsigned int dirty_count;
/* functions which are paging mode specific */
- int (*enable_log_dirty )(struct domain *d);
+ int (*enable_log_dirty )(struct domain *d, bool_t log_global);
int (*disable_log_dirty )(struct domain *d);
void (*clean_dirty_bitmap )(struct domain *d);
};
uint8_t *dirty_bitmap);
/* enable log dirty */
-int paging_log_dirty_enable(struct domain *d);
+int paging_log_dirty_enable(struct domain *d, bool_t log_global);
/* disable log dirty */
int paging_log_dirty_disable(struct domain *d);
/* log dirty initialization */
void paging_log_dirty_init(struct domain *d,
- int (*enable_log_dirty)(struct domain *d),
+ int (*enable_log_dirty)(struct domain *d,
+ bool_t log_global),
int (*disable_log_dirty)(struct domain *d),
void (*clean_dirty_bitmap)(struct domain *d));
void shadow_final_teardown(struct domain *d);
/* shadow code to call when log dirty is enabled */
-int shadow_enable_log_dirty(struct domain *d);
+int shadow_enable_log_dirty(struct domain *d, bool_t log_global);
/* shadow code to call when log dirty is disabled */
int shadow_disable_log_dirty(struct domain *d);