Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 23 Feb 2009 21:57:40 -0800
From:      Maxim Sobolev <sobomax@FreeBSD.org>
To:        Robert Watson <rwatson@FreeBSD.org>
Cc:        Frank Behrens <frank@ilse.behrens.de>, Jeff Roberson <jeff@FreeBSD.org>, "current@freebsd.org" <current@FreeBSD.org>, stable@FreeBSD.org
Subject:   Re: The machdep.hyperthreading_allowed & ULE weirdness in 7.1
Message-ID:  <49A38C54.7070601@FreeBSD.org>
In-Reply-To: <alpine.BSF.2.00.0902232026180.92010@fledge.watson.org>
References:  <alpine.BSF.2.00.0902231000300.98609@fledge.watson.org> <200902231652.n1NGqMxH047731@post.behrens.de> <49A2DE9D.4090902@FreeBSD.org> <alpine.BSF.2.00.0902231801450.92010@fledge.watson.org> <49A2ED6A.9040202@FreeBSD.org> <alpine.BSF.2.00.0902231853040.92010@fledge.watson.org> <49A30456.5010400@FreeBSD.org> <alpine.BSF.2.00.0902232026180.92010@fledge.watson.org>

next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------080303000001020500010202
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Robert Watson wrote:
>> So, are you suggesting that we should disable 
>> machdep.hyperthreading_allowed with ULE in 7.x and current to avoid 
>> confusion?
> 
> Possibly even without ULE.

I've verified - the tunable/sysctl works just fine with SCHED_4BSD in 
7.1, so that I am not sure it's worth ripping it off.

Instead, I've re-implemented the feature differently - by disabling HT 
cores at detection time when SCHED_ULE is compiled in and 
machdep.hyperthreading_allowed is set to 0 in loader.conf. Patch for 7.1 
is attached.  Apart from the fact that it's not possible to change the 
setting at run-time, this version should be even better by not starting 
up HT cores in the first place.

I would appreciate if somebody familiar with the code in question can 
review the patch, particularly part that moves assign_cpu_ids() and 
start_all_aps() calls little bit further in the cpu_mp_start(). I need 
them there so that I can use hyperthreading_cpus in assign_cpu_ids().

Thanks in advance.

-Maxim

--------------080303000001020500010202
Content-Type: text/plain;
 name="machdep.hyperthreading_allowed.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="machdep.hyperthreading_allowed.diff"

--- i386/i386/mp_machdep.c	2009-01-19 07:34:49.000000000 -0800
+++ /tmp/mp_machdep.c	2009-02-23 21:38:18.000000000 -0800
@@ -209,6 +210,7 @@
 	int	cpu_present:1;
 	int	cpu_bsp:1;
 	int	cpu_disabled:1;
+	int	cpu_hyperthread:1;
 } static cpu_info[MAX_APIC_ID + 1];
 int cpu_apic_ids[MAXCPU];
 
@@ -405,11 +407,6 @@
 		    ("BSP's APIC ID doesn't match boot_cpu_id"));
 	cpu_apic_ids[0] = boot_cpu_id;
 
-	assign_cpu_ids();
-
-	/* Start each Application Processor */
-	start_all_aps();
-
 	/* Setup the initial logical CPUs info. */
 	logical_cpus = logical_cpus_mask = 0;
 	if (cpu_feature & CPUID_HTT)
@@ -457,6 +454,11 @@
 			hyperthreading_cpus = logical_cpus;
 	}
 
+	assign_cpu_ids();
+
+	/* Start each Application Processor */
+	start_all_aps();
+
 	set_interrupt_apic_ids();
 
 	/* Last, setup the cpu topology now that we have probed CPUs */
@@ -471,18 +473,26 @@
 cpu_mp_announce(void)
 {
 	int i, x;
+	const char *hyperthread;
 
 	/* List CPUs */
 	printf(" cpu0 (BSP): APIC ID: %2d\n", boot_cpu_id);
 	for (i = 1, x = 0; x <= MAX_APIC_ID; x++) {
 		if (!cpu_info[x].cpu_present || cpu_info[x].cpu_bsp)
 			continue;
+		if (cpu_info[x].cpu_hyperthread) {
+			hyperthread = "/HT";
+		} else {
+			hyperthread = "";
+		}
 		if (cpu_info[x].cpu_disabled)
-			printf("  cpu (AP): APIC ID: %2d (disabled)\n", x);
+			printf("  cpu (AP%s): APIC ID: %2d (disabled)\n",
+			    hyperthread, x);
 		else {
 			KASSERT(i < mp_ncpus,
 			    ("mp_ncpus and actual cpus are out of whack"));
-			printf(" cpu%d (AP): APIC ID: %2d\n", i++, x);
+			printf(" cpu%d (AP%s): APIC ID: %2d\n", i++,
+			    hyperthread, x);
 		}
 	}
 }
@@ -691,11 +701,24 @@
 {
 	u_int i;
 
+	TUNABLE_INT_FETCH("machdep.hyperthreading_allowed",
+	    &hyperthreading_allowed);
+
 	/* Check for explicitly disabled CPUs. */
 	for (i = 0; i <= MAX_APIC_ID; i++) {
 		if (!cpu_info[i].cpu_present || cpu_info[i].cpu_bsp)
 			continue;
 
+		if (hyperthreading_cpus > 1 && i % hyperthreading_cpus != 0) {
+			cpu_info[i].cpu_hyperthread = 1;
+#if defined(SCHED_ULE)
+			if (hyperthreading_allowed == 0) {
+				cpu_info[i].cpu_disabled = 1;
+				continue;
+			}
+#endif
+		}
+
 		/* Don't use this CPU if it has been disabled by a tunable. */
 		if (resource_disabled("lapic", i)) {
 			cpu_info[i].cpu_disabled = 1;
@@ -1410,6 +1433,12 @@
 	if (error || !req->newptr)
 		return (error);
 
+#ifdef SCHED_ULE
+	if (allowed != hyperthreading_allowed)
+		return (ENOTSUP);
+	return (error);
+#endif
+
 	if (allowed)
 		hlt_cpus_mask &= ~hyperthreading_cpus_mask;
 	else
@@ -1454,8 +1483,6 @@
 		 * of hlt_logical_cpus.
 		 */
 		if (hyperthreading_cpus_mask) {
-			TUNABLE_INT_FETCH("machdep.hyperthreading_allowed",
-			    &hyperthreading_allowed);
 			SYSCTL_ADD_PROC(&logical_cpu_clist,
 			    SYSCTL_STATIC_CHILDREN(_machdep), OID_AUTO,
 			    "hyperthreading_allowed", CTLTYPE_INT|CTLFLAG_RW,

--------------080303000001020500010202--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?49A38C54.7070601>