From df250721b54e7b658077b8620b1c6eebf58391d7 Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Tue, 19 Apr 2011 07:23:00 +0200 Subject: [PATCH] use logical operation instead of / and % to increase the performance --- mm/memory.c | 54 ++++++++++++++++++++++++++--------------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/mm/memory.c b/mm/memory.c index cf7f5e48..ed6057e7 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -52,8 +52,8 @@ extern const void kernel_end; inline static int page_marked(unsigned int i) { - unsigned int index = i / 8; - unsigned int mod = i % 8; + unsigned int index = i >> 3; + unsigned int mod = i & 0x7; return (bitmap[index] & (1 << mod)); } @@ -65,8 +65,8 @@ inline static int page_unmarked(unsigned int i) inline static void page_set_mark(unsigned int i) { - unsigned int index = i / 8; - unsigned int mod = i % 8; + unsigned int index = i >> 3; + unsigned int mod = i & 0x7; //if (page_marked(i)) // kprintf("page %u is alread marked\n", i); @@ -104,7 +104,7 @@ int mmu_init(void) end_addr = addr + mmap->len; while (addr < end_addr) { - page_clear_mark(addr / PAGE_SIZE); + page_clear_mark(addr >> PAGE_SHIFT); addr += PAGE_SIZE; atomic_int32_inc(&total_pages); atomic_int32_inc(&total_available_pages); @@ -129,13 +129,13 @@ int mmu_init(void) /* * Mark the mb_info as used. */ - page_set_mark((size_t)mb_info / PAGE_SIZE); + page_set_mark((size_t)mb_info >> PAGE_SHIFT); atomic_int32_inc(&total_allocated_pages); atomic_int32_dec(&total_available_pages); for(i=0; imods_count; i++, mmodule++) { for(addr=mmodule->mod_start; addrmod_end; addr+=PAGE_SIZE) { - page_set_mark(addr / PAGE_SIZE); + page_set_mark(addr >> PAGE_SHIFT); atomic_int32_inc(&total_allocated_pages); atomic_int32_dec(&total_available_pages); } @@ -143,7 +143,7 @@ int mmu_init(void) } #elif defined(CONFIG_ROCKCREEK) for(addr=PRIVATE_MEM1_START; addr> PAGE_SHIFT); if (addr > addr + PAGE_SIZE) break; atomic_int32_inc(&total_pages); @@ -151,7 +151,7 @@ int mmu_init(void) } for(addr=PRIVATE_MEM2_START; addr> PAGE_SHIFT); if (addr > addr + PAGE_SIZE) break; atomic_int32_inc(&total_pages); @@ -161,7 +161,7 @@ int mmu_init(void) /* * Mark the bootinfo as used. */ - page_set_mark((size_t)bootinfo / PAGE_SIZE); + page_set_mark((size_t)bootinfo >> PAGE_SHIFT); atomic_int32_inc(&total_allocated_pages); atomic_int32_dec(&total_available_pages); @@ -170,7 +170,7 @@ int mmu_init(void) * Therefore, we set these pages as used. */ for(addr=bootinfo->addr; addr < bootinfo->addr+bootinfo->size; addr+=PAGE_SIZE) { - page_set_mark(addr / PAGE_SIZE); + page_set_mark(addr >> PAGE_SHIFT); atomic_int32_inc(&total_allocated_pages); atomic_int32_dec(&total_available_pages); } @@ -179,19 +179,19 @@ int mmu_init(void) #endif kernel_size = (size_t) &kernel_end - (size_t) &kernel_start; - if (kernel_size % PAGE_SIZE) - kernel_size += PAGE_SIZE - kernel_size % PAGE_SIZE; - atomic_int32_add(&total_allocated_pages, kernel_size/PAGE_SIZE); - atomic_int32_sub(&total_available_pages, kernel_size/PAGE_SIZE); + if (kernel_size & (PAGE_SIZE-1)) + kernel_size += PAGE_SIZE - (kernel_size & (PAGE_SIZE-1)); + atomic_int32_add(&total_allocated_pages, kernel_size >> PAGE_SHIFT); + atomic_int32_sub(&total_available_pages, kernel_size >> PAGE_SHIFT); /* set kernel space as used */ - for(i=(size_t) &kernel_start / PAGE_SIZE; i < (size_t) &kernel_end / PAGE_SIZE; i++) + for(i=(size_t) &kernel_start >> PAGE_SHIFT; i < (size_t) &kernel_end >> PAGE_SHIFT; i++) page_set_mark(i); - if ((size_t) &kernel_end % PAGE_SIZE) + if ((size_t) &kernel_end & (PAGE_SIZE-1)) page_set_mark(i); - alloc_start = (size_t) &kernel_end / PAGE_SIZE; - if ((size_t) &kernel_end % PAGE_SIZE) + alloc_start = (size_t) &kernel_end >> PAGE_SHIFT; + if ((size_t) &kernel_end & (PAGE_SIZE-1)) alloc_start++; return paging_init(); @@ -217,7 +217,7 @@ size_t get_pages(uint32_t npages) next_try: while((k < BITMAP_SIZE) && page_marked(i)) { k++; - i = (i+1) % BITMAP_SIZE; + i = (i+1) & (BITMAP_SIZE-1); } if (k >= BITMAP_SIZE) @@ -225,7 +225,7 @@ next_try: for(j=1; (j> PAGE_SHIFT; if (BUILTIN_EXPECT(!phyaddr, 0)) return -EINVAL; @@ -277,9 +277,9 @@ int put_page(size_t phyaddr) void* mem_allocation(size_t sz, uint32_t flags) { size_t phyaddr, viraddr; - uint32_t npages = sz / PAGE_SIZE; + uint32_t npages = sz >> PAGE_SHIFT; - if (sz % PAGE_SIZE) + if (sz & (PAGE_SIZE-1)) npages++; phyaddr = get_pages(npages); @@ -304,8 +304,8 @@ void kfree(void* addr, size_t sz) if (BUILTIN_EXPECT(!addr && !sz, 0)) return; - npages = sz / PAGE_SIZE; - if (sz % PAGE_SIZE) + npages = sz >> PAGE_SHIFT; + if (sz & (PAGE_SIZE-1)) npages++; spinlock_lock(&bitmap_lock); @@ -316,7 +316,7 @@ void kfree(void* addr, size_t sz) if (!phyaddr) continue; - index = phyaddr / PAGE_SIZE; + index = phyaddr >> PAGE_SHIFT; page_clear_mark(index); }