Messages in this thread | | | Date | Tue, 6 Jul 2010 23:58:15 +0100 | From | Russell King <> | Subject | Re: [patch 071/149] ARM: 6166/1: Proper prefetch abort handling on pre-ARMv6 |
| |
On Tue, Jul 06, 2010 at 04:06:18PM +0300, Kirill A. Shutemov wrote: > I've investigated the issue. It's reproducible if you try to jump to > the megabyte next to section mapping.
Okay, this is specific to the way that OMAP sets up its mappings, which is why it doesn't appear everywhere.
> On ARM one Linux PGD entry contains two hardware entry. But there is error > in do_translation_fault(). It's always call pmd_none() check for the first > entry of two, not for the entry corresponded to address. So in case if we > try to jump the megabyte next to section mapping, we will have inifinity > loop of translation faults.
Okay, now that we know _why_ it happens, I'm satisfied that the fix previously committed will help this situation.
> diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c > index 9634fe1..825b9da 100644 > --- a/arch/arm/mm/fault.c > +++ b/arch/arm/mm/fault.c > @@ -406,7 +406,8 @@ do_translation_fault(unsigned long addr, unsigned int fsr, > pmd_k = pmd_offset(pgd_k, addr); > pmd = pmd_offset(pgd, addr); > > - if (pmd_none(*pmd_k)) > + index = (addr >> SECTION_SHIFT) & 1; > + if (pmd_none(pmd_k[index]))
I do think this is extremely obscure, and therefore requires a comment to help people understand what is going on here and why. Leaving it in the commit log would be an invitation for this to be needlessly cut'n'pasted.
-- Russell King Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/ maintainer of:
| |