Re: [PATCH]sparc64: Flush locked TLB entries used to map initmem

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



We can't move BSS up. I use non-standard bootloader and it eats this.
But SILO doesn't want, he says about multiple loadable segments in ELF file.
So the patch is not applicable. Sorry.

05.08.2013, 21:06, "Kirill Tkhai" <tkhai@xxxxxxxxx>:
> Check if __init_begin <= (some 4Mb aligned address) < __init_end.
> If true then flush corresponding 4Mb TLB page.
>
> Move BSS at the middle of the image to make initmem be last range
> of mapped kernel area.
>
> It's not likely case, but sometimes can be useful.
>
> I use flush_tlb_kernel_range which flushes 8K pages sequentially
> and only the first flush() has a result. It seems it's not necessary
> to introduce new function for one-time boot use...
>
> Signed-off-by: Kirill Tkhai <tkhai@xxxxxxxxx>
> CC: David Miller <davem@xxxxxxxxxxxxx>
> ---
>  arch/sparc/kernel/head_64.S     |    4 ++--
>  arch/sparc/kernel/vmlinux.lds.S |    3 ++-
>  arch/sparc/mm/init_64.c         |   17 +++++++++++++++++
>  3 files changed, 21 insertions(+), 3 deletions(-)
> diff --git a/arch/sparc/kernel/head_64.S b/arch/sparc/kernel/head_64.S
> index 26b706a..81dbb74 100644
> --- a/arch/sparc/kernel/head_64.S
> +++ b/arch/sparc/kernel/head_64.S
> @@ -681,8 +681,8 @@ tlb_fixup_done:
>          /* Clear the bss */
>          sethi %hi(__bss_start), %o0
>          or %o0, %lo(__bss_start), %o0
> - sethi %hi(_end), %o1
> - or %o1, %lo(_end), %o1
> + sethi %hi(__bss_stop), %o1
> + or %o1, %lo(__bss_stop), %o1
>          call __bzero
>           sub %o1, %o0, %o1
>
> diff --git a/arch/sparc/kernel/vmlinux.lds.S b/arch/sparc/kernel/vmlinux.lds.S
> index 0bacceb..be57226 100644
> --- a/arch/sparc/kernel/vmlinux.lds.S
> +++ b/arch/sparc/kernel/vmlinux.lds.S
> @@ -64,6 +64,8 @@ SECTIONS
>          /* End of data section */
>          _edata = .;
>
> + BSS_SECTION(0, 0, 0)
> +
>          .fixup : {
>                  __start___fixup = .;
>                  *(.fixup)
> @@ -141,7 +143,6 @@ SECTIONS
>
>          . = ALIGN(PAGE_SIZE);
>          __init_end = .;
> - BSS_SECTION(0, 0, 0)
>          _end = . ;
>
>          STABS_DEBUG
> diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c
> index ed82eda..52bfcf8 100644
> --- a/arch/sparc/mm/init_64.c
> +++ b/arch/sparc/mm/init_64.c
> @@ -2079,6 +2079,21 @@ void __init mem_init(void)
>                  cheetah_ecache_flush_init();
>  }
>
> +/* Flush locked TLB entry (entries) if it is used to map initmem range
> + * only, i.e. __init_begin <= (some 4Mb aligned address) < __init_end.
> + */
> +static void flush_initmem_tlb_entries(void)
> +{
> + unsigned long begin = round_up((unsigned long)(__init_begin), 1 << 22);
> + unsigned long end = round_up((unsigned long)(__init_end), 1 << 22);
> +
> + if (begin >= end)
> + return;
> +
> + pr_info("TLB: Flushing initmem range [%016lx, %016lx]\n", begin, end-1);
> + flush_tlb_kernel_range(begin, end);
> +}
> +
>  void free_initmem(void)
>  {
>          unsigned long addr, initend;
> @@ -2108,6 +2123,8 @@ void free_initmem(void)
>                  if (do_free)
>                          free_reserved_page(virt_to_page(page));
>          }
> +
> + flush_initmem_tlb_entries();
>  }
>
>  #ifdef CONFIG_BLK_DEV_INITRD
> --
> To unsubscribe from this list: send the line "unsubscribe sparclinux" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe sparclinux" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Kernel Development]     [DCCP]     [Linux ARM Development]     [Linux]     [Photo]     [Yosemite Help]     [Linux ARM Kernel]     [Linux SCSI]     [Linux x86_64]     [Linux Hams]

  Powered by Linux