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));
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to