Checks dependent on only d and x can be pulled out, thus allowing to
skip the flush mask calculation.
Signed-off-by: Jan Beulich
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -3020,7 +3020,10 @@ static int _get_page_type(struct page_in
if ( d && shadow_mode_enabled(d) )
shadow_prepare_page_type_change(d, page);
-if ( (x ^ type) & PGT_type_mask )
+if ( ((x ^ type) & PGT_type_mask) &&
+ /* Shadow mode: track only writable pages. */
+ (!shadow_mode_enabled(d) ||
+ ((x & PGT_type_mask) == PGT_writable_page)) )
{
/*
* On type change we check to flush stale TLB entries. It is
@@ -3035,10 +3038,7 @@ static int _get_page_type(struct page_in
/* Don't flush if the timestamp is old enough */
tlbflush_filter(mask, page->tlbflush_timestamp);
-if ( unlikely(!cpumask_empty(mask)) &&
- /* Shadow mode: track only writable pages. */
- (!shadow_mode_enabled(d) ||
- ((x & PGT_type_mask) == PGT_writable_page)) )
+if ( unlikely(!cpumask_empty(mask)) )
{
perfc_incr(need_flush_tlb_flush);
/*