VirtualBox

Changeset 53106 in vbox for trunk


Ignore:
Timestamp:
Oct 21, 2014 1:34:40 PM (11 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
96633
Message:

HostDrivers/Support: Nominal TSC frequency fixes for Windows.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/Support/SUPDrv.c

    r53095 r53106  
    59365936        uint8_t     idApicAfter;
    59375937
    5938         uFlags = ASMIntDisableFlags();
     5938        /*
     5939         * Synchronize with the host OS clock tick before reading the TSC.
     5940         * Especially important on Windows where the granularity is terrible.
     5941         */
     5942        u64NanoTs = RTTimeSystemNanoTS();
     5943        while (RTTimeSystemNanoTS() == u64NanoTs)
     5944            ASMNopPause();
     5945
     5946        uFlags       = ASMIntDisableFlags();
    59395947        idApicBefore = ASMGetApicId();
    5940         ASMSerializeInstruction();
    59415948        u64TscBefore = ASMReadTSC();
     5949        u64NanoTs    = RTTimeSystemNanoTS();
    59425950        ASMSetFlags(uFlags);
    5943         u64NanoTs = RTTimeSystemNanoTS();
    59445951
    59455952        if (supdrvIsInvariantTsc())
    59465953        {
    5947             /* Sleep wait, eases host load, since the TSC frequency is reported as constant. */
    5948             RTThreadSleep(9);
     5954            /*
     5955             * Sleep wait since the TSC frequency is constant, eases host load.
     5956             */
     5957#if 0
     5958            RTThreadSleep(98);
    59495959            do
    59505960            {
    5951                 int64_t cNsDiff;
     5961                int64_t cNsWaited;
    59525962                u64NanoTsAfter = RTTimeSystemNanoTS();
    5953                 cNsDiff        = u64NanoTsAfter - u64NanoTs;
    5954                 if (cNsDiff > 9 * RT_NS_1MS)
     5963                cNsWaited      = u64NanoTsAfter - u64NanoTs;
     5964                if (cNsWaited > RT_NS_100MS)
    59555965                {
    5956                     uint64_t cNsWait = RT_NS_10MS;
    5957                     if (cNsDiff >= RT_NS_10MS)
    5958                         cNsWait += 1;
     5966                    uint64_t cNsBusyWait = RT_NS_1MS;
    59595967                    for (;;)
    59605968                    {
    59615969                        u64NanoTsAfter = RTTimeSystemNanoTS();
    5962                         if (u64NanoTsAfter < cNsWait - cNsDiff + u64NanoTs)
     5970                        if (u64NanoTsAfter < cNsBusyWait + cNsWaited + u64NanoTs)
    59635971                            ASMNopPause();
    59645972                        else
     
    59685976                }
    59695977            } while (1);
     5978#else
     5979            RTThreadSleep(200);   /* Sleeping shorter produces a tad more variance in the frequency than I'd like. */
     5980            u64NanoTsAfter = RTTimeSystemNanoTS();
     5981            while (RTTimeSystemNanoTS() == u64NanoTsAfter)
     5982                ASMNopPause();
     5983            u64NanoTsAfter = RTTimeSystemNanoTS();
     5984#endif
    59705985        }
    59715986        else
     
    59755990            {
    59765991                u64NanoTsAfter = RTTimeSystemNanoTS();
    5977                 if (u64NanoTsAfter < RT_NS_10MS + u64NanoTs)
     5992                if (u64NanoTsAfter < RT_NS_100MS + u64NanoTs)
    59785993                    ASMNopPause();
    59795994                else
     
    60066021                u64TscAfter  += pGipCpuAfter->i64TSCDelta;
    60076022
    6008                 SUPR0Printf("vboxdrv: TSC frequency is (%'RU64) Hz - invariant, kernel timer granularity is (%RU32) Ns\n",
     6023                SUPR0Printf("vboxdrv: TSC frequency is %lu Hz - invariant, kernel timer granularity is %lu Ns\n",
    60096024                            ((u64TscAfter - u64TscBefore) * RT_NS_1SEC_64) / (u64NanoTsAfter - u64NanoTs),
    60106025                            RTTimerGetSystemGranularity());
     
    60196034        else
    60206035        {
    6021             SUPR0Printf("vboxdrv: TSC frequency is (%'RU64) Hz - maybe variant, kernel timer granularity is (%RU32) Ns\n",
     6036            SUPR0Printf("vboxdrv: TSC frequency is %lu Hz - maybe variant, kernel timer granularity is %lu Ns\n",
    60226037                        ((u64TscAfter - u64TscBefore) * RT_NS_1SEC_64) / (u64NanoTsAfter - u64NanoTs),
    60236038                        RTTimerGetSystemGranularity());
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette