| From jejb@kernel.org Tue Nov 4 11:42:52 2008 |
| From: Ravikiran G Thirumalai <kiran@scalex86.org> |
| Date: Fri, 31 Oct 2008 01:40:03 GMT |
| Subject: x86: fix /dev/mem mmap breakage when PAT is disabled |
| To: jejb@kernel.org, stable@kernel.org |
| Message-ID: <200810310140.m9V1e3kj005479@hera.kernel.org> |
| |
| From: Ravikiran G Thirumalai <kiran@scalex86.org> |
| |
| commit 9e41bff2708e420e61e6b89a54c15232857069b1 upstream |
| |
| Impact: allow /dev/mem mmaps on non-PAT CPUs/platforms |
| |
| Fix mmap to /dev/mem when CONFIG_X86_PAT is off and CONFIG_STRICT_DEVMEM is |
| off |
| |
| mmap to /dev/mem on kernel memory has been failing since the |
| introduction of PAT (CONFIG_STRICT_DEVMEM=n case). Seems like |
| the check to avoid cache aliasing with PAT is kicking in even |
| when PAT is disabled. The bug seems to have crept in 2.6.26. |
| |
| This patch makes sure that the mmap to regular |
| kernel memory succeeds if CONFIG_STRICT_DEVMEM=n and |
| PAT is disabled, and the checks to avoid cache aliasing |
| still happens if PAT is enabled. |
| |
| Signed-off-by: Ravikiran Thirumalai <kiran@scalex86.org> |
| Tested-by: Tim Sirianni <tim@scalemp.com> |
| Acked-by: H. Peter Anvin <hpa@zytor.com> |
| Signed-off-by: Ingo Molnar <mingo@elte.hu> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| arch/x86/mm/pat.c | 4 ++++ |
| 1 file changed, 4 insertions(+) |
| |
| --- a/arch/x86/mm/pat.c |
| +++ b/arch/x86/mm/pat.c |
| @@ -403,12 +403,16 @@ static inline int range_is_allowed(unsig |
| return 1; |
| } |
| #else |
| +/* This check is needed to avoid cache aliasing when PAT is enabled */ |
| static inline int range_is_allowed(unsigned long pfn, unsigned long size) |
| { |
| u64 from = ((u64)pfn) << PAGE_SHIFT; |
| u64 to = from + size; |
| u64 cursor = from; |
| |
| + if (!pat_enabled) |
| + return 1; |
| + |
| while (cursor < to) { |
| if (!devmem_is_allowed(pfn)) { |
| printk(KERN_INFO |