Skip site navigation (1)Skip section navigation (2)
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>