Now that it's obvious that only a single dirty CPU can exist for a vCPU,
it becomes clear that flush_mask() doesn't need to be invoked when
sync_local_execstate() was already run. And with the IPI handler
clearing FLUSH_TLB from the passed flags anyway if
__sync_local_execstate() returns true, it also becomes clear that
FLUSH_TLB doesn't need to be passed here in the first place; neither of
the two places actually have a need to flush the TLB in any event (quite
possibly FLUSH_TLB was being passed there solely for flush_area_mask()
to make it past its no-op check).
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
if ( unlikely(dirty_cpu != cpu) && dirty_cpu != VCPU_CPU_CLEAN )
{
/* Remote CPU calls __sync_local_execstate() from flush IPI handler. */
- flush_mask(cpumask_of(dirty_cpu), FLUSH_TLB | FLUSH_VCPU_STATE);
+ flush_mask(cpumask_of(dirty_cpu), FLUSH_VCPU_STATE);
}
if ( prev != next )
{
if ( v->dirty_cpu == smp_processor_id() )
sync_local_execstate();
-
- if ( vcpu_cpu_dirty(v) )
+ else if ( vcpu_cpu_dirty(v) )
{
/* Remote CPU calls __sync_local_execstate() from flush IPI handler. */
- flush_mask(cpumask_of(v->dirty_cpu), FLUSH_TLB | FLUSH_VCPU_STATE);
+ flush_mask(cpumask_of(v->dirty_cpu), FLUSH_VCPU_STATE);
}
}