Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 7 Sep 2017 20:20:12 +0000 (UTC)
From:      Conrad Meyer <cem@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r323286 - head/sys/x86/cpufreq
Message-ID:  <201709072020.v87KKCcB023855@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: cem
Date: Thu Sep  7 20:20:12 2017
New Revision: 323286
URL: https://svnweb.freebsd.org/changeset/base/323286

Log:
  cpufreq(4) hwpstate: Yield CPU awaiting frequency change
  
  It doesn't seem necessary to busy the CPU while waiting to transition
  into a different p-state.
  
  PR:		221621 (related, but does not completely address)
  Reviewed by:	truckman
  Sponsored by:	Dell EMC Isilon
  Differential Revision:	https://reviews.freebsd.org/D12260

Modified:
  head/sys/x86/cpufreq/hwpstate.c

Modified: head/sys/x86/cpufreq/hwpstate.c
==============================================================================
--- head/sys/x86/cpufreq/hwpstate.c	Thu Sep  7 20:18:57 2017	(r323285)
+++ head/sys/x86/cpufreq/hwpstate.c	Thu Sep  7 20:20:12 2017	(r323286)
@@ -160,6 +160,7 @@ DRIVER_MODULE(hwpstate, cpu, hwpstate_driver, hwpstate
 static int
 hwpstate_goto_pstate(device_t dev, int pstate)
 {
+	sbintime_t sbt;
 	int i;
 	uint64_t msr;
 	int j;
@@ -170,7 +171,7 @@ hwpstate_goto_pstate(device_t dev, int pstate)
 	/* get the current pstate limit */
 	msr = rdmsr(MSR_AMD_10H_11H_LIMIT);
 	limit = AMD_10H_11H_GET_PSTATE_LIMIT(msr);
-	if(limit > id)
+	if (limit > id)
 		id = limit;
 
 	/*
@@ -184,7 +185,7 @@ hwpstate_goto_pstate(device_t dev, int pstate)
 		sched_bind(curthread, i);
 		thread_unlock(curthread);
 		HWPSTATE_DEBUG(dev, "setting P%d-state on cpu%d\n",
-			id, PCPU_GET(cpuid));
+		    id, PCPU_GET(cpuid));
 		/* Go To Px-state */
 		wrmsr(MSR_AMD_10H_11H_CONTROL, id);
 	}
@@ -194,13 +195,14 @@ hwpstate_goto_pstate(device_t dev, int pstate)
 		sched_bind(curthread, i);
 		thread_unlock(curthread);
 		/* wait loop (100*100 usec is enough ?) */
-		for(j = 0; j < 100; j++){
+		for (j = 0; j < 100; j++){
 			/* get the result. not assure msr=id */
 			msr = rdmsr(MSR_AMD_10H_11H_STATUS);
-			if(msr == id){
+			if (msr == id)
 				break;
-			}
-			DELAY(100);
+			sbt = SBT_1MS / 10;
+			tsleep_sbt(dev, PZERO, "pstate_goto", sbt,
+			    sbt >> tc_precexp, 0);
 		}
 		HWPSTATE_DEBUG(dev, "result: P%d-state on cpu%d\n",
 		    (int)msr, PCPU_GET(cpuid));



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