lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [day] [month] [year] [list]
Date:	Wed, 24 Feb 2010 13:54:18 -0800
From:	Suresh Siddha <suresh.b.siddha@...el.com>
To:	"H. Peter Anvin" <hpa@...or.com>, Ingo Molnar <mingo@...e.hu>,
	Thomas Gleixner <tglx@...utronix.de>
Cc:	"Pallipadi, Venkatesh" <venkatesh.pallipadi@...el.com>,
	LKML <linux-kernel@...r.kernel.org>
Subject: [patch] x86, cpa: consider alias mapping changes also in the flush
 tlb decisions

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@...el.com>
---

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@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ