From: David Daney <ddaney@caviumnetworks.com>
To: Matt Bennett <matt.bennett@alliedtelesis.co.nz>, <ralf@linux-mips.org>
Cc: <linux-mips@linux-mips.org>, <aleksey.makarov@auriga.com>,
<david.daney@cavium.com>
Subject: Re: [PATCH] MIPS: Octeon: Fix kernel panic on startup from memory corruption
Date: Fri, 2 Oct 2015 09:53:18 -0700 [thread overview]
Message-ID: <560EB67E.4070401@caviumnetworks.com> (raw)
In-Reply-To: <1443588042-21496-1-git-send-email-matt.bennett@alliedtelesis.co.nz>
On 09/29/2015 09:40 PM, Matt Bennett wrote:
> During development it was found that a number of builds would panic
> during the kernel init process, more specifically in 'delayed_fput()'.
> The panic showed the kernel trying to access a memory address of
> '0xb7fdc00' while traversing the 'delayed_fput_list' structure.
> Comparing this memory address to the value of the pointer used on
> builds that did not panic confirmed that the pointer on crashing
> builds must have been corrupted at some stage earlier in the init
> process.
>
> By traversing the list earlier and earlier in the code it was found
> that 'plat_mem_setup()' was responsible for corrupting the list.
> Specifically the line:
>
> memory = cvmx_bootmem_phy_alloc(mem_alloc_size,
> __pa_symbol(&__init_end), -1,
> 0x100000,
> CVMX_BOOTMEM_FLAG_NO_LOCKING);
>
> Which would eventually call:
>
> cvmx_bootmem_phy_set_size(new_ent_addr,
> cvmx_bootmem_phy_get_size
> (ent_addr) -
> (desired_min_addr -
> ent_addr));
>
> Where 'new_ent_addr'=0x4800000 (the address of 'delayed_fput_list')
> and the second argument (size)=0xb7fdc00 (the address causing the
> kernel panic). The job of this part of 'plat_mem_setup()' is to
> allocate chunks of memory for the kernel to use. At the start of
> each chunk of memory the size of the chunk is written, hence the
> value 0xb7fdc00 is written onto memory at 0x4800000, therefore the
> kernel panics when it goes back to access 'delayed_fput_list' later
> on in the initialisation process.
>
> On builds that were not crashing it was found that the compiler had
> placed 'delayed_fput_list' at 0x4800008, meaning it wasn't corrupted
> (but something else in memory was overwritten).
>
> As can be seen in the first function call above the code begins to
> allocate chunks of memory beginning from the symbol '__init_end'.
> The MIPS linker script (vmlinux.lds.S) however defines the .bss
> section to begin after '__init_end'. Therefore memory within the
> .bss section is allocated to the kernel to use (System.map shows
> 'delayed_fput_list' and other kernel structures to be in .bss).
>
> To stop the kernel panic (and the .bss section being corrupted)
> memory should begin being allocated from the symbol '_end'.
>
> Signed-off-by: Matt Bennett <matt.bennett@alliedtelesis.co.nz>
This is obviously correct. I wonder how it was able to work for so long
without failing for someone.
Acked-by: David Daney <david.daney@cavium.com>
It is probably suitable for stable as well.
David Daney
> ---
> arch/mips/cavium-octeon/setup.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/arch/mips/cavium-octeon/setup.c b/arch/mips/cavium-octeon/setup.c
> index 89a6284..bd63425 100644
> --- a/arch/mips/cavium-octeon/setup.c
> +++ b/arch/mips/cavium-octeon/setup.c
> @@ -933,7 +933,7 @@ void __init plat_mem_setup(void)
> while ((boot_mem_map.nr_map < BOOT_MEM_MAP_MAX)
> && (total < MAX_MEMORY)) {
> memory = cvmx_bootmem_phy_alloc(mem_alloc_size,
> - __pa_symbol(&__init_end), -1,
> + __pa_symbol(&_end), -1,
> 0x100000,
> CVMX_BOOTMEM_FLAG_NO_LOCKING);
> if (memory >= 0) {
>
WARNING: multiple messages have this Message-ID (diff)
From: David Daney <ddaney@caviumnetworks.com>
To: Matt Bennett <matt.bennett@alliedtelesis.co.nz>, ralf@linux-mips.org
Cc: linux-mips@linux-mips.org, aleksey.makarov@auriga.com,
david.daney@cavium.com
Subject: Re: [PATCH] MIPS: Octeon: Fix kernel panic on startup from memory corruption
Date: Fri, 2 Oct 2015 09:53:18 -0700 [thread overview]
Message-ID: <560EB67E.4070401@caviumnetworks.com> (raw)
Message-ID: <20151002165318.PZjLwzQeX88KW0-QfOrnana9y92eQ7vjkDxRg263QVg@z> (raw)
In-Reply-To: <1443588042-21496-1-git-send-email-matt.bennett@alliedtelesis.co.nz>
On 09/29/2015 09:40 PM, Matt Bennett wrote:
> During development it was found that a number of builds would panic
> during the kernel init process, more specifically in 'delayed_fput()'.
> The panic showed the kernel trying to access a memory address of
> '0xb7fdc00' while traversing the 'delayed_fput_list' structure.
> Comparing this memory address to the value of the pointer used on
> builds that did not panic confirmed that the pointer on crashing
> builds must have been corrupted at some stage earlier in the init
> process.
>
> By traversing the list earlier and earlier in the code it was found
> that 'plat_mem_setup()' was responsible for corrupting the list.
> Specifically the line:
>
> memory = cvmx_bootmem_phy_alloc(mem_alloc_size,
> __pa_symbol(&__init_end), -1,
> 0x100000,
> CVMX_BOOTMEM_FLAG_NO_LOCKING);
>
> Which would eventually call:
>
> cvmx_bootmem_phy_set_size(new_ent_addr,
> cvmx_bootmem_phy_get_size
> (ent_addr) -
> (desired_min_addr -
> ent_addr));
>
> Where 'new_ent_addr'=0x4800000 (the address of 'delayed_fput_list')
> and the second argument (size)=0xb7fdc00 (the address causing the
> kernel panic). The job of this part of 'plat_mem_setup()' is to
> allocate chunks of memory for the kernel to use. At the start of
> each chunk of memory the size of the chunk is written, hence the
> value 0xb7fdc00 is written onto memory at 0x4800000, therefore the
> kernel panics when it goes back to access 'delayed_fput_list' later
> on in the initialisation process.
>
> On builds that were not crashing it was found that the compiler had
> placed 'delayed_fput_list' at 0x4800008, meaning it wasn't corrupted
> (but something else in memory was overwritten).
>
> As can be seen in the first function call above the code begins to
> allocate chunks of memory beginning from the symbol '__init_end'.
> The MIPS linker script (vmlinux.lds.S) however defines the .bss
> section to begin after '__init_end'. Therefore memory within the
> .bss section is allocated to the kernel to use (System.map shows
> 'delayed_fput_list' and other kernel structures to be in .bss).
>
> To stop the kernel panic (and the .bss section being corrupted)
> memory should begin being allocated from the symbol '_end'.
>
> Signed-off-by: Matt Bennett <matt.bennett@alliedtelesis.co.nz>
This is obviously correct. I wonder how it was able to work for so long
without failing for someone.
Acked-by: David Daney <david.daney@cavium.com>
It is probably suitable for stable as well.
David Daney
> ---
> arch/mips/cavium-octeon/setup.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/arch/mips/cavium-octeon/setup.c b/arch/mips/cavium-octeon/setup.c
> index 89a6284..bd63425 100644
> --- a/arch/mips/cavium-octeon/setup.c
> +++ b/arch/mips/cavium-octeon/setup.c
> @@ -933,7 +933,7 @@ void __init plat_mem_setup(void)
> while ((boot_mem_map.nr_map < BOOT_MEM_MAP_MAX)
> && (total < MAX_MEMORY)) {
> memory = cvmx_bootmem_phy_alloc(mem_alloc_size,
> - __pa_symbol(&__init_end), -1,
> + __pa_symbol(&_end), -1,
> 0x100000,
> CVMX_BOOTMEM_FLAG_NO_LOCKING);
> if (memory >= 0) {
>
next prev parent reply other threads:[~2015-10-02 16:53 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-30 4:40 [PATCH] MIPS: Octeon: Fix kernel panic on startup from memory corruption Matt Bennett
2015-10-02 16:53 ` David Daney [this message]
2015-10-02 16:53 ` David Daney
2015-10-02 17:21 ` Ralf Baechle
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=560EB67E.4070401@caviumnetworks.com \
--to=ddaney@caviumnetworks.com \
--cc=aleksey.makarov@auriga.com \
--cc=david.daney@cavium.com \
--cc=linux-mips@linux-mips.org \
--cc=matt.bennett@alliedtelesis.co.nz \
--cc=ralf@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.