Re: [stable] [3/3] powerpc: rtas_flash needs to use rtas_data_buf

From: Kamalesh Babulal
Date: Tue Mar 22 2011 - 04:56:50 EST


* Greg KH <greg@xxxxxxxxx> [2011-03-21 14:45:01]:

> On Sat, Mar 19, 2011 at 11:46:58PM +0530, Kamalesh Babulal wrote:
> > powerpc: rtas_flash needs to use rtas_data_buf
> >
> > Commit: bd2b64a12bf55bec0d1b949e3dca3f8863409646 upstream
> >
> > When trying to flash a machine via the update_flash command, Anton received the
> > following error:
> >
> > Restarting system.
> > FLASH: kernel bug...flash list header addr above 4GB
> >
> > The code in question has a comment that the flash list should be in
> > the kernel data and therefore under 4GB:
> >
> > /* NOTE: the "first" block list is a global var with no data
> > * blocks in the kernel data segment. We do this because
> > * we want to ensure this block_list addr is under 4GB.
> > */
> >
> > Unfortunately the Kconfig option is marked tristate which means the variable
> > may not be in the kernel data and could be above 4GB.
> >
> > Instead of relying on the data segment being below 4GB, use the static
> > data buffer allocated by the kernel for use by rtas. Since we don't
> > use the header struct directly anymore, convert it to a simple pointer.
> >
> > Reported-By: Anton Blanchard <anton@xxxxxxxxx>
> > Signed-off-by: Milton Miller <miltonm@xxxxxxx
> > Tested-By: Anton Blanchard <anton@xxxxxxxxx>
> > Signed-off-by: Benjamin Herrenschmidt <benh@xxxxxxxxxxxxxxxxxxx>
> > Signed-off-by: Kamalesh Babulal <kamalesh@xxxxxxxxxxxxxxxxxx>
> > ---
> > arch/powerpc/kernel/rtas_flash.c | 41 ++++++++++++++++++++-----------------
> > 1 files changed, 22 insertions(+), 19 deletions(-)
>
> This diffstat differs from what the original commit had:
> arch/powerpc/kernel/rtas_flash.c | 39 +++++++++++++++++++++------------------
> 1 file changed, 21 insertions(+), 18 deletions(-)
>
> So I went with the original commit, ok?
>

Sorry, my bad the mismatch was due to the indentation difference in the hunk

@@ -592,8 +589,8 @@ static void rtas_flash_firmware(int reboot_type)
unsigned long rtas_block_list;
int i, status, update_token;

- if (rtas_firmware_flash_list.next == NULL)
- return; /* nothing to do */
+ if (rtas_firmware_flash_list == NULL)
+ return; /* nothing to do */

will make sure, it does not happens again.

> Why are you diverging from the original?
>
> thanks,
>
> greg k-h

Kamalesh
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/