use logical operation instead of / and % to increase the performance
This commit is contained in:
parent
4fc507bc6b
commit
df250721b5
1 changed files with 27 additions and 27 deletions
54
mm/memory.c
54
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; 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);
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue