Skip to content

Commit

Permalink
microblaze: Allow PAGE_SIZE configuration
Browse files Browse the repository at this point in the history
Allow developer to configure memory page size at compile time.
Larger pages can improve performance on some workloads.

Based on PowerPC code.

Signed-off-by: Steven J. Magnani <steve@digidescorp.com>
Signed-off-by: Michal Simek <monstr@monstr.eu>
  • Loading branch information
Steven J. Magnani authored and Michal Simek committed Aug 4, 2010
1 parent 0d9ec76 commit ba9c4f8
Show file tree
Hide file tree
Showing 6 changed files with 50 additions and 11 deletions.
30 changes: 30 additions & 0 deletions arch/microblaze/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,36 @@ config TASK_SIZE
hex "Size of user task space" if TASK_SIZE_BOOL
default "0x80000000"

choice
prompt "Page size"
default MICROBLAZE_4K_PAGES
depends on ADVANCED_OPTIONS && !MMU
help
Select the kernel logical page size. Increasing the page size
will reduce software overhead at each page boundary, allow
hardware prefetch mechanisms to be more effective, and allow
larger dma transfers increasing IO efficiency and reducing
overhead. However the utilization of memory will increase.
For example, each cached file will using a multiple of the
page size to hold its contents and the difference between the
end of file and the end of page is wasted.

If unsure, choose 4K_PAGES.

config MICROBLAZE_4K_PAGES
bool "4k page size"

config MICROBLAZE_8K_PAGES
bool "8k page size"

config MICROBLAZE_16K_PAGES
bool "16k page size"

config MICROBLAZE_32K_PAGES
bool "32k page size"

endchoice

endmenu

source "mm/Kconfig"
Expand Down
2 changes: 1 addition & 1 deletion arch/microblaze/include/asm/elf.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
#define ELF_DATA ELFDATA2MSB
#endif

#define ELF_EXEC_PAGESIZE 4096
#define ELF_EXEC_PAGESIZE PAGE_SIZE


#define ELF_CORE_COPY_REGS(_dest, _regs) \
Expand Down
12 changes: 10 additions & 2 deletions arch/microblaze/include/asm/page.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,16 @@
#ifdef __KERNEL__

/* PAGE_SHIFT determines the page size */
#define PAGE_SHIFT (12)
#define PAGE_SIZE (_AC(1, UL) << PAGE_SHIFT)
#if defined(CONFIG_MICROBLAZE_32K_PAGES)
#define PAGE_SHIFT 15
#elif defined(CONFIG_MICROBLAZE_16K_PAGES)
#define PAGE_SHIFT 14
#elif defined(CONFIG_MICROBLAZE_8K_PAGES)
#define PAGE_SHIFT 13
#else
#define PAGE_SHIFT 12
#endif
#define PAGE_SIZE (ASM_CONST(1) << PAGE_SHIFT)
#define PAGE_MASK (~(PAGE_SIZE-1))

#define LOAD_OFFSET ASM_CONST((CONFIG_KERNEL_START-CONFIG_KERNEL_BASE_ADDR))
Expand Down
1 change: 1 addition & 0 deletions arch/microblaze/kernel/cpu/mb.c
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@ static int show_cpuinfo(struct seq_file *m, void *v)
cpuinfo.pvr_user1,
cpuinfo.pvr_user2);

count += seq_printf(m, "Page size:\t%lu\n", PAGE_SIZE);
return 0;
}

Expand Down
4 changes: 2 additions & 2 deletions arch/microblaze/kernel/head.S
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,10 @@
.global empty_zero_page
.align 12
empty_zero_page:
.space 4096
.space PAGE_SIZE
.global swapper_pg_dir
swapper_pg_dir:
.space 4096
.space PAGE_SIZE

#endif /* CONFIG_MMU */

Expand Down
12 changes: 6 additions & 6 deletions arch/microblaze/kernel/vmlinux.lds.S
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ SECTIONS {
*/
.sdata2 : AT(ADDR(.sdata2) - LOAD_OFFSET) {
_ssrw = .;
. = ALIGN(4096); /* page aligned when MMU used - origin 0x8 */
. = ALIGN(PAGE_SIZE); /* page aligned when MMU used */
*(.sdata2)
. = ALIGN(8);
_essrw = .;
Expand All @@ -70,7 +70,7 @@ SECTIONS {
/* Reserve some low RAM for r0 based memory references */
. = ALIGN(0x4) ;
r0_ram = . ;
. = . + 4096; /* a page should be enough */
. = . + PAGE_SIZE; /* a page should be enough */

/* Under the microblaze ABI, .sdata and .sbss must be contiguous */
. = ALIGN(8);
Expand Down Expand Up @@ -120,7 +120,7 @@ SECTIONS {

__init_end_before_initramfs = .;

.init.ramfs ALIGN(4096) : AT(ADDR(.init.ramfs) - LOAD_OFFSET) {
.init.ramfs ALIGN(PAGE_SIZE) : AT(ADDR(.init.ramfs) - LOAD_OFFSET) {
__initramfs_start = .;
*(.init.ramfs)
__initramfs_end = .;
Expand All @@ -132,11 +132,11 @@ SECTIONS {
* so that __init_end == __bss_start. This will make image.elf
* consistent with the image.bin
*/
/* . = ALIGN(4096); */
/* . = ALIGN(PAGE_SIZE); */
}
__init_end = .;

.bss ALIGN (4096) : AT(ADDR(.bss) - LOAD_OFFSET) {
.bss ALIGN (PAGE_SIZE) : AT(ADDR(.bss) - LOAD_OFFSET) {
/* page aligned when MMU used */
__bss_start = . ;
*(.bss*)
Expand All @@ -145,7 +145,7 @@ SECTIONS {
__bss_stop = . ;
_ebss = . ;
}
. = ALIGN(4096);
. = ALIGN(PAGE_SIZE);
_end = .;

DISCARDS
Expand Down

0 comments on commit ba9c4f8

Please sign in to comment.