From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jes Sorensen Subject: [Fwd: [patch] first boot allocator to not scan hole on every allocation] Date: Mon, 11 Dec 2006 16:40:49 +0100 Message-ID: <457D7C01.1020703@sgi.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------090908040304020004090706" Return-path: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org This is a multi-part message in MIME format. --------------090908040304020004090706 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Hi, Alex suggested I send this one straight to xen-devel given it's generic code. I would claim it's harmless to architectures which have memory starting 0x00 and it's absolutely vital for those architectures that don't. Cheers, Jes --------------090908040304020004090706 Content-Type: message/rfc822; name*0="[patch] first boot allocator to not scan hole on every allocatio"; name*1="n" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename*0="[patch] first boot allocator to not scan hole on every alloc"; filename*1="ation" Message-ID: <457D72CF.5030806@sgi.com> Date: Mon, 11 Dec 2006 16:01:35 +0100 From: Jes Sorensen User-Agent: Thunderbird 1.5.0.4 (X11/20060527) MIME-Version: 1.0 To: xen-ia64-devel@lists.xensource.com CC: Alex Williamson Subject: [patch] first boot allocator to not scan hole on every allocation X-Enigmail-Version: 0.94.0.0 Content-Type: multipart/mixed; boundary="------------070008060908020407070600" This is a multi-part message in MIME format. --------------070008060908020407070600 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Hi, Ok, I finally figured out why the boot allocator took .0172 seconds for each single page allocation on a small Altix (a partitioned system would be even worse). I posted a patch for this earlier, but it was wrong (by a factor of 0x40 :-( ). This patch goes into common/page_alloc.c but it should be obviously correct. It's really vital for the SN2 port to get this one in. Cheers, Jes --------------070008060908020407070600 Content-Type: text/plain; name="xen-boot-alloc-skip-hole.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="xen-boot-alloc-skip-hole.diff" Keep track of which page is the first available to the boot allocator to avoid scanning the hole "0 ... first_pg" on every allocation, on platforms that do not have physical memory starting at address 0x00. This reduces the Xen boot time by roughly 150 seconds on a small Altix with 6GB of RAM. Signed-off-by: Jes Sorensen diff -r 66609699c9d0 xen/common/page_alloc.c --- a/xen/common/page_alloc.c Fri Dec 08 14:29:42 2006 +0100 +++ b/xen/common/page_alloc.c Mon Dec 11 15:54:10 2006 +0100 @@ -137,6 +137,8 @@ static void map_alloc(unsigned long firs } +static unsigned long first_pg = -1UL; + static void map_free(unsigned long first_page, unsigned long nr_pages) { unsigned long start_off, end_off, curr_idx, end_idx; @@ -152,6 +154,13 @@ static void map_free(unsigned long first start_off = first_page & (PAGES_PER_MAPWORD-1); end_idx = (first_page + nr_pages) / PAGES_PER_MAPWORD; end_off = (first_page + nr_pages) & (PAGES_PER_MAPWORD-1); + + /* + * Set first_pg to the first entry initialized so the boot + * allocator can avoid scanning the hole from 0 for no reason + */ + if (first_page < first_pg) + first_pg = first_page; if ( curr_idx == end_idx ) { @@ -258,7 +267,7 @@ unsigned long alloc_boot_pages(unsigned { unsigned long pg, i = 0; - for ( pg = 0; (pg + nr_pfns) < max_page; pg += pfn_align ) + for ( pg = first_pg; (pg + nr_pfns) < max_page; pg += pfn_align ) { i = alloc_boot_pages_at(nr_pfns, pg); if (i != 0) @@ -301,7 +310,7 @@ void end_boot_allocator(void) INIT_LIST_HEAD(&heap[i][j][k]); /* Pages that are free now go to the domain sub-allocator. */ - for ( i = 0; i < max_page; i++ ) + for ( i = first_pg; i < max_page; i++ ) { curr_free = next_free; next_free = !allocated_in_map(i+1); @@ -482,7 +491,7 @@ void scrub_heap_pages(void) printk("Scrubbing Free RAM: "); - for ( pfn = 0; pfn < max_page; pfn++ ) + for ( pfn = first_pg; pfn < max_page; pfn++ ) { /* Every 100MB, print a progress dot. */ if ( (pfn % ((100*1024*1024)/PAGE_SIZE)) == 0 ) --------------070008060908020407070600-- --------------090908040304020004090706 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel --------------090908040304020004090706--