Date: Mon, 12 Jan 2015 05:24:31 +0000 From: "Pokala, Ravi" <rpokala@panasas.com> To: "freebsd-hackers@freebsd.org" <freebsd-hackers@freebsd.org> Subject: [PATCH] Display progress during getmemsize() so the kernel doesn't look like it hanged Message-ID: <D0D89A8E.129518%rpokala@panasas.com>
next in thread | raw e-mail | index | archive | help
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 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- 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 =3D ((1024 * 1024) / PAGE_SIZE); + int PAGES_PER_GB =3D (PAGES_PER_MB * 1024); =20 bzero(physmap, sizeof(physmap)); basemem =3D 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 =3D 0; for (i =3D 0; i <=3D physmap_idx; i +=3D 2) { vm_paddr_t end; =20 @@ -1688,6 +1693,14 @@ int tmp, page_bad, full; int *ptr =3D (int *)CADDR1; =20 + /* + * Print a "." every GB, to show we're making progress + */ + page_counter++; + if ((page_counter % PAGES_PER_GB) =3D=3D 0) { + printf("."); + } + full =3D 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 =3D 0; invltlb(); =20
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?D0D89A8E.129518%rpokala>