use logical operation instead of / and % to increase the performance

This commit is contained in:
Stefan Lankes 2011-04-19 07:23:00 +02:00
parent 4fc507bc6b
commit df250721b5

View file

@ -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; i<mb_info->mods_count; i++, mmodule++) {
for(addr=mmodule->mod_start; addr<mmodule->mod_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<PRIVATE_MEM1_END; addr+=PAGE_SIZE) {
page_clear_mark(addr / PAGE_SIZE);
page_clear_mark(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<PRIVATE_MEM2_END; addr+=PAGE_SIZE) {
page_clear_mark(addr / PAGE_SIZE);
page_clear_mark(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<npages) && (i+j < BITMAP_SIZE) && (k < BITMAP_SIZE); j++, k++) {
if (page_marked(i+j)) {
i = (i+j) % BITMAP_SIZE;
i = (i+j) & (BITMAP_SIZE-1);
goto next_try;
}
}
@ -259,7 +259,7 @@ oom:
int put_page(size_t phyaddr)
{
uint32_t index = phyaddr / PAGE_SIZE;
uint32_t index = phyaddr >> 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);
}