> Module Name: src > Committed By: matt > Date: Fri Jan 22 05:17:32 UTC 2010 > > Modified Files: > src/sys/uvm [matt-nb5-mips64]: uvm_pglist.c > > Log Message: > Rework the algorithm to allocate contiguous pages to be much much faster. > (read the comments if you want to know how it's done). > > > To generate a diff of this commit: > cvs rdiff -u -r1.42 -r1.42.16.1 src/sys/uvm/uvm_pglist.c
> /* > * Test both the ending and starting pages to see if they are > * both free. If the ending and starting pages are same page, > * we only test one of them. If the pages aren't free, there > * is no reason to continue this iteration so advance to the > * next address and try again. > */ > if (VM_PAGE_IS_FREE(&pgs[end - 1]) == 0 > || end - 1 == tryidx + skip > || VM_PAGE_IS_FREE(&pgs[tryidx + skip]) == 0) { > try += roundup(num, align); > skip = 0; > continue; > } I guess this part can be improved and/or fixed as below. enami. /* * If the last page is not free, skip entire region. */ if (VM_PAGE_IS_FREE(&pgs[end - 1]) == 0) { try += roundup(num, align); skip = 0; continue; } /* * If the last page is the only page to check, * we found enough space. */ if (end - 1 == tryidx + skip) { while (skip-- > 0) { KDASSERT(VM_PAGE_IS_FREE(&pgs[tryidx + skip])); } #ifdef PGALLOC_VERBOSE printf(": ok\n"); #endif break; } /* * If the start page is not free, start from next boundary * to the start page. */ if (VM_PAGE_IS_FREE(&pgs[tryidx + skip]) == 0) { try += roundup(skip + 1, align); skip = 0; continue; }