From: Greg Ungerer <gerg@snapgear.com>
To: linux-mips@linux-mips.org
Subject: system lockup with 2.6.29 on Cavium/Octeon
Date: Wed, 20 May 2009 16:12:32 +1000 [thread overview]
Message-ID: <4A139F50.7050409@snapgear.com> (raw)
Hi All,
I have a system lockup problem that I have been looking at on a custom
Cavium/Octeon 5010 based design. I am running on linux-2.6.29 with
David Daney's latest round of PCI and ethernet patches (posted here
on this list).
I have tracked the problem back to local_flush_tlb_kernel_range() in
arch/mips/mm/tlb-r4k.c. At the top of this function is:
void local_flush_tlb_kernel_range(unsigned long start, unsigned
long end)
{
unsigned long flags;
int size;
ENTER_CRITICAL(flags);
size = (end - start + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
size = (size + 1) >> 1;
if (size <= current_cpu_data.tlbsize / 2) {
The problem is that typical example values I see passed in for start
and end are:
start = c000000000006000
end = ffffffffc01d8000
Now the vmalloc area starts at 0xc000000000000000 and the kernel code
and data is all at 0xffffffff80000000 and above. I don't know if the
start and end are reasonable values, but I can see some logic as to
where they come from. The code path that leads to this is via
__vunmap() and __purge_vmap_area_lazy(). So it is not too difficult
to see how we end up with values like this.
But the size calculation above with these types of values will result
in still a large number. Larger than the 32bit "int" that is "size".
I see large negative values fall out as size, and so the following
tlbsize check becomes true, and the code spins inside the loop inside
that if statement for a _very_ long time trying to flush tlb entries.
This is of course easily fixed, by making that size "unsigned long".
The patch below trivially does this.
But is this analysis correct?
Regards
Greg
The address range size calculation inside local_flush_tlb_kernel_range()
is being truncated by a too small size variable holder on 64bit systems.
The truncated size can result in an erroneous tlbsize check that means
we sit spinning inside a loop trying to flush a hige number of TLB
entries. This is for all intents and purposes a system hang. Fix by
using an appropriately sized valiable to hold the size.
Signed-off-by: Greg Ungerer <gerg@snapgear.com>
---
--- ORG.linux-2.6.29/arch/mips/mm/tlb-r4k.c.org 2009-05-20
15:30:28.000000000 +1000
+++ ORG.linux-2.6.29/arch/mips/mm/tlb-r4k.c 2009-05-20
15:30:56.000000000 +1000
@@ -161,7 +161,7 @@ void local_flush_tlb_range(struct vm_are
void local_flush_tlb_kernel_range(unsigned long start, unsigned long end)
{
unsigned long flags;
- int size;
+ unsigned long size;
ENTER_CRITICAL(flags);
size = (end - start + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
------------------------------------------------------------------------
Greg Ungerer -- Principal Engineer EMAIL: gerg@snapgear.com
SnapGear Group, McAfee PHONE: +61 7 3435 2888
825 Stanley St, FAX: +61 7 3891 3630
Woolloongabba, QLD, 4102, Australia WEB: http://www.SnapGear.com
next reply other threads:[~2009-05-20 6:12 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-05-20 6:12 Greg Ungerer [this message]
2009-05-20 14:26 ` system lockup with 2.6.29 on Cavium/Octeon Ralf Baechle
2009-05-21 5:29 ` Greg Ungerer
2009-05-21 6:28 ` Ralf Baechle
2009-05-21 14:50 ` Atsushi Nemoto
2009-05-22 1:19 ` Greg Ungerer
2009-05-22 9:23 ` Ralf Baechle
2009-05-22 11:53 ` Atsushi Nemoto
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4A139F50.7050409@snapgear.com \
--to=gerg@snapgear.com \
--cc=linux-mips@linux-mips.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.