Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 12 Jan 2015 19:43:22 +0000
From:      "Pokala, Ravi" <rpokala@panasas.com>
To:        "freebsd-hackers@freebsd.org" <freebsd-hackers@freebsd.org>
Subject:   Re: [PATCH] Display progress during getmemsize() so the  kernel doesn't look like it hanged
Message-ID:  <D0D9354E.129583%rpokala@panasas.com>

next in thread | raw e-mail | index | archive | help
-----Original Message-----
>Date: Mon, 12 Jan 2015 00:27:18 -0500
>From: Allan Jude <allanjude@freebsd.org>
>To: freebsd-hackers@freebsd.org
>Subject: Re: [PATCH] Display progress during getmemsize() so the
>	kernel doesn't look like it hanged
>Message-ID: <54B35B36.4040504@freebsd.org>
>Content-Type: text/plain; charset=3D"windows-1252"
>
>On 2015-01-12 00:24, Pokala, Ravi wrote:
>> Hi folks,
>>=20
>> 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.
>>=20
>> Thanks,
>>=20
>> Ravi
>>=20
>>=20
>>
>>... =20
>>=20
>>=20
>>
>Which version(s) of FreeBSD were you seeing this delay on?

We first noted it with 7.2, because that's what we used on our first amd64
systems with > 4GB RAM. We're still seeing it with 10.1.

>I know older versions had it, quite badly.
>
>setting hw.memtest.tests=3D0 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=3D0?

You're right; when I set hw.memtest.tests=3D0, the pause goes away in 10.1.
I thought it defaulted to 0 in 10.1.

So that changes this slightly - could we either change the default in
10-STABLE, or commit the following patch against 10-STABLE?

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
diff --git a/stable/10/sys/amd64/amd64/machdep.c
b/stable/10/sys/amd64/amd64/machdep.c
--- a/stable/10/sys/amd64/amd64/machdep.c	(revision 277085)
+++ b/stable/10/sys/amd64/amd64/machdep.c	(working copy)
@@ -1541,6 +1541,9 @@
 	struct bios_smap *smapbase;
 	struct efi_map_header *efihdr;
 	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;
@@ -1651,6 +1654,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
@@ -1661,6 +1666,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.
@@ -1765,6 +1778,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?D0D9354E.129583%rpokala>