From 23313590bef320908ecd0a09b78433bc717e99d0 Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Tue, 19 Apr 2011 20:01:18 +0200 Subject: [PATCH] use logical operations instead of / and % to increase the performance --- arch/x86/mm/page.c | 16 ++++++++-------- include/metalsvm/config.h.example | 1 + 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/arch/x86/mm/page.c b/arch/x86/mm/page.c index cd3f210b..4e5c4f7c 100644 --- a/arch/x86/mm/page.c +++ b/arch/x86/mm/page.c @@ -640,8 +640,8 @@ int arch_paging_init(void) * Set the page table and page directory entries for the kernel. We map the kernel's physical address * to the same virtual address. */ - npages = ((size_t) &kernel_end - (size_t) &kernel_start) / PAGE_SIZE; - if ((size_t)&kernel_end % PAGE_SIZE) + npages = ((size_t) &kernel_end - (size_t) &kernel_start) >> PAGE_SHIFT; + if ((size_t)&kernel_end & (PAGE_SIZE-1)) npages++; map_region((size_t)&kernel_start, (size_t)&kernel_start, npages, MAP_KERNEL_SPACE); @@ -686,8 +686,8 @@ int arch_paging_init(void) for(i=0; imods_count; i++, mmodule++) { // map physical address to the same virtual address - npages = (mmodule->mod_end - mmodule->mod_start) / PAGE_SIZE; - if (mmodule->mod_end % PAGE_SIZE) + npages = (mmodule->mod_end - mmodule->mod_start) >> PAGE_SHIFT; + if (mmodule->mod_end & (PAGE_SIZE-1)) npages++; map_region((size_t) (mmodule->mod_start), (size_t) (mmodule->mod_start), npages, MAP_KERNEL_SPACE); } @@ -699,17 +699,17 @@ int arch_paging_init(void) map_region(SCC_BOOTINFO, SCC_BOOTINFO, 1, MAP_KERNEL_SPACE); // map the initial ramdisk - npages = bootinfo->size / PAGE_SIZE; - if (bootinfo->size % PAGE_SIZE) + npages = bootinfo->size >> PAGE_SHIFT; + if (bootinfo->size & (PAGE_SIZE-1)) npages++; map_region(bootinfo->addr, bootinfo->addr, npages, MAP_KERNEL_SPACE); // map SCC's configuration registers - viraddr = map_region(CRB_X0_Y0, CRB_X0_Y0, (CRB_OWN-CRB_X0_Y0+16*1024*1024)/PAGE_SIZE, MAP_KERNEL_SPACE|MAP_NO_CACHE); + viraddr = map_region(CRB_X0_Y0, CRB_X0_Y0, (CRB_OWN-CRB_X0_Y0+16*1024*1024) >> PAGE_SHIFT, MAP_KERNEL_SPACE|MAP_NO_CACHE); kprintf("Map configuration registers at 0x%x\n", viraddr); // map SCC's message passing buffers - viraddr = map_region(MPB_X0_Y0, MPB_X0_Y0, (MPB_OWN-MPB_X0_Y0+16*1024*1024)/PAGE_SIZE, MAP_KERNEL_SPACE|MAP_MPE); + viraddr = map_region(MPB_X0_Y0, MPB_X0_Y0, (MPB_OWN-MPB_X0_Y0+16*1024*1024) >> PAGE_SHIFT, MAP_KERNEL_SPACE|MAP_MPE); kprintf("Map message passing buffers at 0x%x\n", viraddr); #endif diff --git a/include/metalsvm/config.h.example b/include/metalsvm/config.h.example index b5c0536e..bb405699 100644 --- a/include/metalsvm/config.h.example +++ b/include/metalsvm/config.h.example @@ -32,6 +32,7 @@ extern "C" { #define KERNEL_STACK_SIZE 8192 #define KMSG_SIZE (128*1024) #define PAGE_SIZE 4096 +#define PAGE_SHIFT 12 #define CACHE_LINE 64 #define MAILBOX_SIZE 8 #define TIMER_FREQ 100 /* in HZ */