VirtualBox

Changeset 3617 in kBuild for trunk


Ignore:
Timestamp:
Oct 21, 2024 8:43:04 PM (6 months ago)
Author:
bird
Message:

kmk/winchildren.c: Use GetLogicalProcessorInformationEx/RelationGroup to get the group affinity masks and use these in calls to SetThreadGroupAffinity when we have them.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kmk/w32/winchildren.c

    r3359 r3617  
    345345/** Array detailing how many active processors there are in each group. */
    346346static unsigned const      *g_pacProcessorsInGroup = &g_cProcessorGroups;
     347/** Info from the GetLogicalProcessorInformationEx call - can be NULL. */
     348static GROUP_RELATIONSHIP const *g_pGroupInfo = NULL;
     349
    347350/** Kernel32!GetActiveProcessorGroupCount */
    348351static WORD (WINAPI        *g_pfnGetActiveProcessorGroupCount)(VOID);
    349352/** Kernel32!GetActiveProcessorCount */
    350353static DWORD (WINAPI       *g_pfnGetActiveProcessorCount)(WORD);
     354/** Kernel32!GetLogicalProcessorInformationEx */
     355static DWORD (WINAPI       *g_pfnGetLogicalProcessorInformationEx)(LOGICAL_PROCESSOR_RELATIONSHIP,
     356                                                                   PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX, PDWORD);
    351357/** Kernel32!SetThreadGroupAffinity */
    352358static BOOL (WINAPI        *g_pfnSetThreadGroupAffinity)(HANDLE, CONST GROUP_AFFINITY *, GROUP_AFFINITY *);
     
    460466    {
    461467        hmod = GetModuleHandleA("KERNEL32.DLL");
    462         *(FARPROC *)&g_pfnGetActiveProcessorGroupCount = GetProcAddress(hmod, "GetActiveProcessorGroupCount");
    463         *(FARPROC *)&g_pfnGetActiveProcessorCount      = GetProcAddress(hmod, "GetActiveProcessorCount");
    464         *(FARPROC *)&g_pfnSetThreadGroupAffinity       = GetProcAddress(hmod, "SetThreadGroupAffinity");
     468        *(FARPROC *)&g_pfnGetActiveProcessorGroupCount     = GetProcAddress(hmod, "GetActiveProcessorGroupCount");
     469        *(FARPROC *)&g_pfnGetActiveProcessorCount          = GetProcAddress(hmod, "GetActiveProcessorCount");
     470        *(FARPROC *)&g_pfnSetThreadGroupAffinity           = GetProcAddress(hmod, "SetThreadGroupAffinity");
     471        *(FARPROC *)&g_pfnGetLogicalProcessorInformationEx = GetProcAddress(hmod, "GetLogicalProcessorInformationEx");
     472        /*(FARPROC *)&g_pfnGetSystemCpuSetInformation       = GetProcAddress(hmod, "GetSystemCpuSetInformation"); / * W10 */
     473        /*(FARPROC *)&g_pfnSetThreadSelectedCpuSetMasks     = GetProcAddress(hmod, "SetThreadSelectedCpuSetMasks"); / * W11 */
    465474        if (   g_pfnSetThreadGroupAffinity
    466475            && g_pfnGetActiveProcessorCount
    467             && g_pfnGetActiveProcessorGroupCount)
     476            && g_pfnGetActiveProcessorGroupCount
     477            && g_pfnGetLogicalProcessorInformationEx)
    468478        {
    469479            unsigned int *pacProcessorsInGroup;
     
    478488                pacProcessorsInGroup[iGroup] = g_pfnGetActiveProcessorCount(iGroup);
    479489
     490            /* Get active process group affinity masks so we can set them correctly. */
     491            {
     492                DWORD cbNeeded = cbNeeded = offsetof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX, Group)
     493                               + offsetof(GROUP_RELATIONSHIP, GroupInfo)
     494                               + sizeof(PROCESSOR_GROUP_INFO) * (g_cProcessorGroups + 4);
     495                PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX pInfo = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX)xcalloc(cbNeeded);
     496                BOOL fRet = g_pfnGetLogicalProcessorInformationEx(RelationGroup, pInfo, &cbNeeded);
     497                if (!fRet && GetLastError() == ERROR_BUFFER_OVERFLOW)
     498                {
     499                    free(pInfo);
     500                    pInfo = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX)xcalloc(cbNeeded);
     501                    fRet = g_pfnGetLogicalProcessorInformationEx(RelationGroup, pInfo, &cbNeeded);
     502                }
     503                if (   fRet
     504                    && pInfo->Group.ActiveGroupCount > 0
     505                    && pInfo->Group.ActiveGroupCount <= pInfo->Group.MaximumGroupCount)
     506                {
     507                    g_pGroupInfo = &pInfo->Group; /* leaked */
     508                    pInfo = NULL;
     509                }
     510                else
     511                    free(pInfo);
     512            }
     513
    480514            MkWinChildInitCpuGroupAllocator(&g_ProcessorGroupAllocator);
    481515        }
    482516        else
    483517        {
    484             g_pfnSetThreadGroupAffinity       = NULL;
    485             g_pfnGetActiveProcessorCount      = NULL;
    486             g_pfnGetActiveProcessorGroupCount = NULL;
     518            g_pfnSetThreadGroupAffinity           = NULL;
     519            g_pfnGetActiveProcessorCount          = NULL;
     520            g_pfnGetActiveProcessorGroupCount     = NULL;
     521            g_pfnGetLogicalProcessorInformationEx = NULL;
    487522        }
    488523    }
     
    13431378        if (g_cProcessorGroups > 1)
    13441379        {
    1345             GROUP_AFFINITY Affinity = { 0 /* == all active apparently */, pWorker->iProcessorGroup, { 0, 0, 0 } };
     1380            GROUP_AFFINITY Affinity = { 0, pWorker->iProcessorGroup, { 0, 0, 0 } };
     1381            if (g_pGroupInfo && pWorker->iProcessorGroup < g_pGroupInfo->ActiveGroupCount)
     1382                Affinity.Mask = g_pGroupInfo->GroupInfo[pWorker->iProcessorGroup].ActiveProcessorMask;
    13461383            fRet = g_pfnSetThreadGroupAffinity(ProcInfo.hThread, &Affinity, NULL);
    13471384            assert(fRet);
     
    25612598    if (g_cProcessorGroups > 1)
    25622599    {
    2563         GROUP_AFFINITY Affinity = { 0 /* == all active apparently */, pWorker->iProcessorGroup, { 0, 0, 0 } };
    2564         BOOL fRet = g_pfnSetThreadGroupAffinity(GetCurrentThread(), &Affinity, NULL);
     2600        BOOL           fRet;
     2601        GROUP_AFFINITY Affinity = { 0, pWorker->iProcessorGroup, { 0, 0, 0 } };
     2602        if (g_pGroupInfo && pWorker->iProcessorGroup < g_pGroupInfo->ActiveGroupCount)
     2603            Affinity.Mask = g_pGroupInfo->GroupInfo[pWorker->iProcessorGroup].ActiveProcessorMask;
     2604
     2605        fRet = g_pfnSetThreadGroupAffinity(GetCurrentThread(), &Affinity, NULL);
    25652606        assert(fRet); (void)fRet;
    25662607# ifndef NDEBUG
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