VirtualBox

Ignore:
Timestamp:
May 13, 2011 10:18:29 AM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
71699
Message:

VMM: Support for online/offlining of CPUs.

Location:
trunk/src/VBox/Runtime/r0drv/solaris/vbi
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/r0drv/solaris/vbi/mp-r0drv-solaris.c

    r36232 r37062  
    174174    PRTMPARGS pArgs = (PRTMPARGS)(uArg);
    175175
     176    /*
     177     * Solaris CPU cross calls execute on offline CPUs too. Check our CPU cache
     178     * set and ignore if it's offline.
     179     */
     180    if (!RTMpIsCpuOnline(RTMpCpuId()))
     181        return 0;
     182
    176183    pArgs->pfnWorker(RTMpCpuId(), pArgs->pvUser1, pArgs->pvUser2);
    177184
     
    279286        return VERR_CPU_NOT_FOUND;
    280287
     288    if (RT_UNLIKELY(!RTMpIsCpuOnline(idCpu)))
     289        return RTMpIsCpuPresent(idCpu) ? VERR_CPU_OFFLINE : VERR_CPU_NOT_FOUND;
     290
    281291    Args.pfnWorker = pfnWorker;
    282292    Args.pvUser1 = pvUser1;
  • trunk/src/VBox/Runtime/r0drv/solaris/vbi/mpnotification-r0drv-solaris.c

    r36555 r37062  
    3434#include <iprt/mp.h>
    3535#include <iprt/cpuset.h>
     36#include <iprt/string.h>
    3637#include "r0drv/mp-r0drv.h"
    3738
     
    4950
    5051
    51 static void rtMpNotificationSolarisCallback(void *pvUser, int iCpu, int online)
     52static void rtMpNotificationSolarisOnCurrentCpu(void *pvArgs, void *uIgnored1, void *uIgnored2)
    5253{
    53     NOREF(pvUser);
     54    NOREF(uIgnored1);
     55    NOREF(uIgnored2);
    5456
    55     /* ASSUMES iCpu == RTCPUID */
     57    PRTMPARGS pArgs = (PRTMPARGS)(pvArgs);
     58    AssertRelease(pArgs && pArgs->idCpu == RTMpCpuId());
     59    Assert(pArgs->pvUser2);
     60    Assert(!RTThreadPreemptIsEnabled(NIL_RTTHREAD));
     61
     62    int online = *(int *)pArgs->pvUser2;
    5663    if (online)
    5764    {
    58         RTCpuSetAdd(&g_rtMpSolarisCpuSet, iCpu);
    59         rtMpNotificationDoCallbacks(RTMPEVENT_ONLINE, iCpu);
     65        RTCpuSetAdd(&g_rtMpSolarisCpuSet, pArgs->idCpu);
     66        rtMpNotificationDoCallbacks(RTMPEVENT_ONLINE, pArgs->idCpu);
    6067    }
    6168    else
    6269    {
    63         RTCpuSetDel(&g_rtMpSolarisCpuSet, iCpu);
    64         rtMpNotificationDoCallbacks(RTMPEVENT_OFFLINE, iCpu);
     70        RTCpuSetDel(&g_rtMpSolarisCpuSet, pArgs->idCpu);
     71        rtMpNotificationDoCallbacks(RTMPEVENT_OFFLINE, pArgs->idCpu);
    6572    }
     73}
     74
     75
     76static void rtMpNotificationSolarisCallback(void *pvUser, int iCpu, int online)
     77{
     78    vbi_preempt_disable();
     79
     80    RTMPARGS Args;
     81    RT_ZERO(Args);
     82    Args.pvUser1 = pvUser;
     83    Args.pvUser2 = &online;
     84    Args.idCpu   = iCpu;
     85
     86    /*
     87     * If we're not on the target CPU, schedule (synchronous) the event notification callback
     88     * to run on the target CPU i.e. the one pertaining to the MP event.
     89     */
     90    bool fRunningOnTargetCpu = iCpu == RTMpCpuId();      /* ASSUMES iCpu == RTCPUID */
     91    if (fRunningOnTargetCpu)
     92        rtMpNotificationSolarisOnCurrentCpu(&Args, NULL /* pvIgnored1 */, NULL /* pvIgnored2 */);
     93    else
     94        vbi_execute_on_one(rtMpNotificationSolarisOnCurrentCpu, &Args, iCpu);
     95
     96    vbi_preempt_enable();
    6697}
    6798
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