[PATCH] Display progress during getmemsize() so the kernel doesn't look like it hanged

Allan Jude allanjude at freebsd.org
Mon Jan 12 05:34:12 UTC 2015


On 2015-01-12 00:24, Pokala, Ravi wrote:
> Hi folks,
> 
> Several of us have noticed that there's a long pause at the start of
> booting the kernel on amd64 systems with large amounts of RAM. During this
> pause, the kernel is mapping in the memory ranges, but does not emit any
> progress indicators. Because this can take quite a while, it can look like
> the kernel has hung. I filed PR 196650 about this issue; this patch just
> prints out a dot for every GB that's mapped in. We've been using this
> patch for years at Panasas, and I'm hoping someone can submit it for me.
> 
> Thanks,
> 
> Ravi
> 
> 
> Index: sys/amd64/amd64/machdep.c
> ===================================================================
> --- sys/amd64/amd64/machdep.c	(revision 276903)
> +++ sys/amd64/amd64/machdep.c	(working copy)
> @@ -1575,6 +1575,9 @@
>  	u_long physmem_start, physmem_tunable, memtest;
>  	pt_entry_t *pte;
>  	quad_t dcons_addr, dcons_size;
> +	u_int32_t page_counter;
> +	int PAGES_PER_MB = ((1024 * 1024) / PAGE_SIZE);
> +	int PAGES_PER_GB = (PAGES_PER_MB * 1024);
>  
>  	bzero(physmap, sizeof(physmap));
>  	basemem = 0;
> @@ -1678,6 +1681,8 @@
>  	 * physmap is in bytes, so when converting to page boundaries,
>  	 * round up the start address and round down the end address.
>  	 */
> +	printf("Mapping system memory");
> +	page_counter = 0;
>  	for (i = 0; i <= physmap_idx; i += 2) {
>  		vm_paddr_t end;
>  
> @@ -1688,6 +1693,14 @@
>  			int tmp, page_bad, full;
>  			int *ptr = (int *)CADDR1;
>  
> +			/*
> +			 * Print a "." every GB, to show we're making progress
> +			 */
> +			page_counter++;
> +			if ((page_counter % PAGES_PER_GB) == 0) {
> +				printf(".");
> +			}
> +
>  			full = FALSE;
>  			/*
>  			 * block out kernel memory as not available.
> @@ -1792,6 +1805,9 @@
>  				break;
>  		}
>  	}
> +	printf("\nMapped %d GB + %d MB total\n",
> +	    (page_counter / PAGES_PER_GB),
> +	    ((page_counter % PAGES_PER_GB) / PAGES_PER_MB));
>  	*pte = 0;
>  	invltlb();
>  
> 
> 
> _______________________________________________
> freebsd-hackers at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> To unsubscribe, send any mail to "freebsd-hackers-unsubscribe at freebsd.org"
> 

Which version(s) of FreeBSD were you seeing this delay on?

I know older versions had it, quite badly.

setting hw.memtest.tests=0 in /boot/loader.conf makes most of the delay
go away, and the default on -CURRENT is now 0 instead of 1.

IIRC, in 10, it defaults to 1, but is switched to 0 in the case of
virtual machines, because touching every page of memory ruined memory
over-commit type features.

Is this feature still useful with memtest.tests=0?


-- 
Allan Jude

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 834 bytes
Desc: OpenPGP digital signature
URL: <http://lists.freebsd.org/pipermail/freebsd-hackers/attachments/20150112/4fb2fb3c/attachment.sig>


More information about the freebsd-hackers mailing list