[patch] x86, cpa: consider alias mapping changes also in the flushtlb decisions

From: Suresh Siddha
Date: Wed Feb 24 2010 - 16:55:25 EST


Page attributes like RWX may be different for the kernel mappings
and its aliases. So it is quite possible that the change page attribute of
main mapping may not change any attribute and hence no flush tlb is necessary.
But cpa() of the kernel alias mappings may change the attributes and hence
we need to consider the result of cpa_process_alias() in making a decision
for flushing the tlb.

We haven't seen a problem yet because of this issue, as all the current usages
result in an attribute change of main mapping and the alias mapping may or
maynot change. But the current code can break easily if there is any usage
of cpa() where the main mapping doesn't change the attribute but the alias
mapping can (on 64bit kernel, original cpa() using the kernel identity mapping
vs the kernel text mapping can behave differently because of this bug).

Fix it by forwarding the CPA_FLUSHTLB flag from the alias_cpa to the
original cpa.

Signed-off-by: Suresh Siddha <suresh.b.siddha@xxxxxxxxx>
---

diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
index cf07c26..cc62a0d 100644
--- a/arch/x86/mm/pageattr.c
+++ b/arch/x86/mm/pageattr.c
@@ -757,6 +757,7 @@ static int cpa_process_alias(struct cpa_data *cpa)
alias_cpa.flags &= ~(CPA_PAGES_ARRAY | CPA_ARRAY);

ret = __change_page_attr_set_clr(&alias_cpa, 0);
+ cpa->flags |= (alias_cpa.flags & CPA_FLUSHTLB);
if (ret)
return ret;
}
@@ -780,6 +781,7 @@ static int cpa_process_alias(struct cpa_data *cpa)
* return value.
*/
__change_page_attr_set_clr(&alias_cpa, 0);
+ cpa->flags |= (alias_cpa.flags & CPA_FLUSHTLB);
}
#endif



--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/