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

John Baldwin jhb at freebsd.org
Tue Jan 13 18:53:31 UTC 2015


On 1/13/15 10:48 AM, Eric van Gyzen wrote:
> On 01/13/2015 04:11, Lars Engels wrote:
>> On Mon, Jan 12, 2015 at 12:27:18AM -0500, Allan Jude wrote:
>>> Is this feature still useful with memtest.tests=0?
>> This feature is useful for everyone who has it set to 1, if they know
>> about it or not. So it's a very useful feature.
> 
> Agreed.
> 
> Comments on the patch:
> 
> The patch will divide by zero when PAGE_SIZE > 1 MiB.  Maybe remove
> PAGES_PER_MB, and just use PAGES_PER_GB.  Make it const, too.
> 
> The "total" line is mostly redundant with the later messages regarding
> "real memory" and "avail memory".  I suggest removing it.

I agree with these.  One other nit is that FreeBSD tends to use all caps
for a macro rather than variables.  Ravi, how about this variant, it
also only displays the dots if the memory test is enabled.  Also, I
think the commit to disable the test should probably be merged to 10, yes.

Index: machdep.c
===================================================================
--- machdep.c	(revision 277075)
+++ machdep.c	(working copy)
@@ -1557,6 +1557,8 @@ native_parse_memmap(caddr_t kmdp, vm_paddr_t *phys
 	}
 }
 
+#define	PAGES_PER_GB	(1024 * 1024 * 1024 / PAGE_SIZE)
+
 /*
  * Populate the (physmap) array with base/bound pairs describing the
  * available physical memory in the system, then test this memory and
@@ -1575,6 +1577,7 @@ getmemsize(caddr_t kmdp, u_int64_t first)
 	u_long physmem_start, physmem_tunable, memtest;
 	pt_entry_t *pte;
 	quad_t dcons_addr, dcons_size;
+	int page_counter;
 
 	bzero(physmap, sizeof(physmap));
 	basemem = 0;
@@ -1678,6 +1681,9 @@ getmemsize(caddr_t kmdp, u_int64_t first)
 	 * physmap is in bytes, so when converting to page boundaries,
 	 * round up the start address and round down the end address.
 	 */
+	page_counter = 0;
+	if (memtest != 0)
+		printf("Testing system memory");
 	for (i = 0; i <= physmap_idx; i += 2) {
 		vm_paddr_t end;
 
@@ -1708,6 +1714,14 @@ getmemsize(caddr_t kmdp, u_int64_t first)
 				goto skip_memtest;
 
 			/*
+			 * Print a "." every GB to show we're making
+			 * progress.
+			 */
+			page_counter++;
+			if ((page_counter % PAGES_PER_GB) == 0)
+				printf(".");
+
+			/*
 			 * map page into kernel: valid, read/write,non-cacheable
 			 */
 			*pte = pa | PG_V | PG_RW | PG_NC_PWT | PG_NC_PCD;
@@ -1794,6 +1808,8 @@ do_next:
 	}
 	*pte = 0;
 	invltlb();
+	if (memtest != 0)
+		printf("\n");
 
 	/*
 	 * XXX

-- 
John Baldwin


More information about the freebsd-hackers mailing list