VirtualBox

Changeset 40812 in vbox


Ignore:
Timestamp:
Apr 7, 2012 10:13:10 AM (12 years ago)
Author:
vboxsync
Message:

SUPDrv: Corrected supdrvTracerCommonDeregisterImpl so the tracer module can be reloaded and re-register the providers of modules/drivers that aren't unloaded in the mean time. This means that we can demand-load the tracer module when needed and doesn't need to have it stick around the whole time.

Location:
trunk/src/VBox/HostDrivers/Support
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/Support/SUPDrvTracer.cpp

    r40811 r40812  
    6666    PSUPDRVSESSION          pSession;
    6767
    68     /** Set when the module is unloaded or the driver deregisters its probes. */
     68    /** Used to indicate that we've called pfnProviderDeregistered already and it
     69     * failed because the provider was busy.  Next time we must try
     70     * pfnProviderDeregisterZombie.
     71     *
     72     * @remarks This does not necessiarly mean the provider is in the zombie
     73     *          list.  See supdrvTracerCommonDeregisterImpl. */
    6974    bool                    fZombie;
    7075    /** Set if the provider has been successfully registered with the
     
    8186*   Defined Constants And Macros                                               *
    8287*******************************************************************************/
    83 #if 0
     88#ifdef DEBUG_bird
    8489# define LOG_TRACER(a_Args)  SUPR0Printf a_Args
    8590#else
     
    552557            if (RT_SUCCESS(rc))
    553558            {
    554                 if (pDevExt->pTracerOps)
     559                if (   pDevExt->pTracerOps
     560                    && !pDevExt->fTracerUnloading)
    555561                    rc = pDevExt->pTracerOps->pfnProviderRegister(pDevExt->pTracerOps, &pProv->Core);
    556562                else
     
    563569                    RTListAppend(&pDevExt->TracerProviderList, &pProv->ListEntry);
    564570                    RTSemFastMutexRelease(pDevExt->mtxTracer);
    565                     LOG_TRACER(("Registered DTrace provider '%s' in '%s' -> %p\n",
     571                    LOG_TRACER(("Registered Tracer provider '%s' in '%s' -> %p\n",
    566572                                pProv->szName, pszModName, pProv->Core.TracerData.DTrace.idProvider));
    567573                }
     
    680686    int             rc;
    681687
     688    LOG_TRACER(("SUPR0TracerRegisterModule: %p\n", pVtgHdr));
     689
    682690    /*
    683691     * Validate input and context.
     
    702710
    703711    rc = supdrvTracerRegisterVtgObj(pDevExt, pVtgHdr, cbVtgObj, pImage, NULL, pImage->szName);
     712    LOG_TRACER(("SUPR0TracerRegisterModule: rc=%d\n", rc));
    704713
    705714    /*
     
    725734SUPR0DECL(int) SUPR0TracerRegisterImpl(void *hMod, PSUPDRVSESSION pSession, PCSUPDRVTRACERREG pReg, PCSUPDRVTRACERHLP *ppHlp)
    726735{
    727     PSUPDRVLDRIMAGE pImage = (PSUPDRVLDRIMAGE)hMod;
    728     PSUPDRVDEVEXT   pDevExt;
    729     int             rc;
     736    PSUPDRVLDRIMAGE     pImage = (PSUPDRVLDRIMAGE)hMod;
     737    PSUPDRVDEVEXT       pDevExt;
     738    PSUPDRVTPPROVIDER   pProv;
     739    int                 rc;
    730740
    731741    /*
     
    753763    }
    754764
     765    AssertReturn(pReg->u32Magic   == SUPDRVTRACERREG_MAGIC, VERR_INVALID_MAGIC);
     766    AssertReturn(pReg->u32Version == SUPDRVTRACERREG_VERSION, VERR_VERSION_MISMATCH);
     767    AssertReturn(pReg->uEndMagic  == SUPDRVTRACERREG_MAGIC, VERR_VERSION_MISMATCH);
    755768    AssertPtrReturn(pReg->pfnProbeFireKernel, VERR_INVALID_POINTER);
    756769    AssertPtrReturn(pReg->pfnProbeFireUser, VERR_INVALID_POINTER);
     
    770783        if (!pDevExt->pTracerOps)
    771784        {
     785            LOG_TRACER(("SUPR0TracerRegisterImpl: pReg=%p\n", pReg));
    772786            pDevExt->pTracerOps     = pReg;
    773787            pDevExt->pTracerSession = pSession;
     
    775789
    776790            *ppHlp = &pDevExt->TracerHlp;
     791
    777792            rc = VINF_SUCCESS;
     793
     794            /*
     795             * Iterate the already loaded modules and register their providers.
     796             */
     797            RTListForEach(&pDevExt->TracerProviderList, pProv, SUPDRVTPPROVIDER, ListEntry)
     798            {
     799                Assert(!pProv->fRegistered);
     800                pProv->fRegistered = true;
     801                int rc2 = pDevExt->pTracerOps->pfnProviderRegister(pDevExt->pTracerOps, &pProv->Core);
     802                if (RT_FAILURE(rc2))
     803                {
     804                    pProv->fRegistered = false;
     805                    SUPR0Printf("SUPR0TracerRegisterImpl: Failed to register provider %s::%s - rc=%d\n",
     806                                pProv->Core.pszModName, pProv->szName, rc2);
     807                }
     808            }
    778809        }
    779810        else
     
    796827static void supdrvTracerCommonDeregisterImpl(PSUPDRVDEVEXT pDevExt)
    797828{
    798     supdrvTracerRemoveAllProviders(pDevExt);
     829    uint32_t            i;
     830    PSUPDRVTPPROVIDER   pProv;
     831    PSUPDRVTPPROVIDER   pProvNext;
    799832
    800833    RTSemFastMutexRequest(pDevExt->mtxTracer);
     834
     835    /*
     836     * Disassociate the tracer implementation from all providers.
     837     * We will have to wait on busy providers.
     838     */
     839    for (i = 0; ; i++)
     840    {
     841        uint32_t cZombies = 0;
     842
     843        /* Live providers. */
     844        RTListForEachSafe(&pDevExt->TracerProviderList, pProv, pProvNext, SUPDRVTPPROVIDER, ListEntry)
     845        {
     846            int rc;
     847            LOG_TRACER(("supdrvTracerRemoveAllProviders: Attemting to unregister '%s' / %p...\n",
     848                        pProv->szName, pProv->Core.TracerData.DTrace.idProvider));
     849
     850            if (!pProv->fRegistered)
     851                continue;
     852            if (!pProv->fZombie)
     853            {
     854                rc = pDevExt->pTracerOps->pfnProviderDeregister(pDevExt->pTracerOps, &pProv->Core);
     855                if (RT_FAILURE(rc))
     856                    pProv->fZombie = true;
     857            }
     858            else
     859                rc = pDevExt->pTracerOps->pfnProviderDeregisterZombie(pDevExt->pTracerOps, &pProv->Core);
     860            if (RT_SUCCESS(rc))
     861                pProv->fZombie = pProv->fRegistered = false;
     862            else
     863            {
     864                cZombies++;
     865                if (!(i & 0xf))
     866                    SUPR0Printf("supdrvTracerCommonDeregisterImpl: Waiting on busy provider '%s' / %p (rc=%d)\n",
     867                                pProv->szName, pProv->Core.TracerData.DTrace.idProvider, rc);
     868                else
     869                    LOG_TRACER(("supdrvTracerCommonDeregisterImpl: Failed to unregister provider '%s' / %p - rc=%d\n",
     870                                pProv->szName, pProv->Core.TracerData.DTrace.idProvider, rc));
     871            }
     872        }
     873
     874        /* Zombies providers. */
     875        RTListForEachSafe(&pDevExt->TracerProviderZombieList, pProv, pProvNext, SUPDRVTPPROVIDER, ListEntry)
     876        {
     877            int rc;
     878            LOG_TRACER(("supdrvTracerRemoveAllProviders: Attemting to unregister '%s' / %p (zombie)...\n",
     879                        pProv->szName, pProv->Core.TracerData.DTrace.idProvider));
     880
     881            rc = pDevExt->pTracerOps->pfnProviderDeregisterZombie(pDevExt->pTracerOps, &pProv->Core);
     882            if (RT_SUCCESS(rc))
     883            {
     884                RTListNodeRemove(&pProv->ListEntry);
     885                supdrvTracerFreeProvider(pProv);
     886            }
     887            else
     888            {
     889                cZombies++;
     890                if (!(i & 0xf))
     891                    SUPR0Printf("supdrvTracerRemoveAllProviders: Waiting on busy provider '%s' / %p (rc=%d)\n",
     892                                pProv->szName, pProv->Core.TracerData.DTrace.idProvider, rc);
     893                else
     894                    LOG_TRACER(("supdrvTracerRemoveAllProviders: Failed to unregister provider '%s' / %p - rc=%d\n",
     895                                pProv->szName, pProv->Core.TracerData.DTrace.idProvider, rc));
     896            }
     897        }
     898
     899        if (cZombies == 0)
     900            break;
     901
     902        /* Delay...*/
     903        RTSemFastMutexRelease(pDevExt->mtxTracer);
     904        RTThreadSleep(1000);
     905        RTSemFastMutexRequest(pDevExt->mtxTracer);
     906    }
     907
     908    /*
     909     * Deregister the tracer implementation.
     910     */
    801911    pDevExt->pTracerImage     = NULL;
    802912    pDevExt->pTracerSession   = NULL;
    803913    pDevExt->pTracerOps       = NULL;
    804914    pDevExt->fTracerUnloading = false;
     915
    805916    RTSemFastMutexRelease(pDevExt->mtxTracer);
    806917}
     
    849960            : pDevExt->pTracerSession == pSession)
    850961        {
     962            LOG_TRACER(("SUPR0TracerDeregisterImpl: Unloading ...\n"));
    851963            pDevExt->fTracerUnloading = true;
    852964            RTSemFastMutexRelease(pDevExt->mtxTracer);
    853965            supdrvTracerCommonDeregisterImpl(pDevExt);
     966            LOG_TRACER(("SUPR0TracerDeregisterImpl: ... done.\n"));
    854967        }
    855968        else
     
    9221035    if (pDevExt->pTracerImage == pImage)
    9231036    {
     1037        LOG_TRACER(("supdrvTracerModuleUnloading: Unloading tracer ...\n"));
    9241038        pDevExt->fTracerUnloading = true;
    9251039        RTSemFastMutexRelease(pDevExt->mtxTracer);
    9261040        supdrvTracerCommonDeregisterImpl(pDevExt);
     1041        LOG_TRACER(("supdrvTracerModuleUnloading: ... done.\n"));
    9271042    }
    9281043    else
  • trunk/src/VBox/HostDrivers/Support/testcase/tstSupLoadModule.cpp

    r40810 r40812  
    5454    static const RTGETOPTDEF s_aOptions[] =
    5555    {
    56         { "--keep",             'k', RTGETOPT_REQ_NOTHING }
     56        { "--keep",             'k', RTGETOPT_REQ_NOTHING },
     57        { "--no-keep",          'n', RTGETOPT_REQ_NOTHING },
    5758    };
    5859
     
    9697                break;
    9798
     99            case 'n':
     100                fKeepLoaded = false;
     101                break;
     102
    98103            case 'h':
    99104                RTPrintf("%s [mod1 [mod2...]]\n");
Note: See TracChangeset for help on using the changeset viewer.

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