VirtualBox

Changeset 40842 in vbox for trunk/src/VBox/Additions/WINNT


Ignore:
Timestamp:
Apr 10, 2012 8:47:25 AM (13 years ago)
Author:
vboxsync
Message:

wddm: ppen allocation fixes

Location:
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPVidModes.cpp

    r38112 r40842  
    536536    if (!VBoxLikesVideoMode(iDisplay, xres, yres, bpp))
    537537    {
    538         WARN(("host does not like special mode %dx%d:%d for display %d", xres, yres, bpp, iDisplay));
     538        WARN_NOBP(("host does not like special mode %dx%d:%d for display %d", xres, yres, bpp, iDisplay));
    539539        return FALSE;
    540540    }
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPTypes.h

    r40747 r40842  
    142142    uint32_t iIndex;
    143143    uint32_t cOpens;
     144    KSPIN_LOCK OpenLock;
    144145    LIST_ENTRY OpenList;
    145146    /* helps tracking when to release wine shared resource */
     
    287288    PVBOXWDDM_DEVICE pDevice;
    288289    uint32_t cShRcRefs;
     290    uint32_t cOpens;
    289291} VBOXWDDM_OPENALLOCATION, *PVBOXWDDM_OPENALLOCATION;
    290292
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp

    r40785 r40842  
    4949{
    5050    ExFreePool(pvMem);
     51}
     52
     53DECLINLINE(void) VBoxWddmOaRelease(PVBOXWDDM_OPENALLOCATION pOa)
     54{
     55    PVBOXWDDM_ALLOCATION pAllocation = pOa->pAllocation;
     56    KIRQL OldIrql;
     57    KeAcquireSpinLock(&pAllocation->OpenLock, &OldIrql);
     58    Assert(pAllocation->cOpens);
     59    --pAllocation->cOpens;
     60    uint32_t cOpens = --pOa->cOpens;
     61    Assert(cOpens < UINT32_MAX/2);
     62    if (!cOpens)
     63    {
     64        RemoveEntryList(&pOa->ListEntry);
     65        KeReleaseSpinLock(&pAllocation->OpenLock, OldIrql);
     66        vboxWddmMemFree(pOa);
     67    }
     68    else
     69        KeReleaseSpinLock(&pAllocation->OpenLock, OldIrql);
     70}
     71
     72DECLINLINE(PVBOXWDDM_OPENALLOCATION) VBoxWddmOaSearchLocked(PVBOXWDDM_DEVICE pDevice, PVBOXWDDM_ALLOCATION pAllocation)
     73{
     74    for (PLIST_ENTRY pCur = pAllocation->OpenList.Flink; pCur != &pAllocation->OpenList; pCur = pCur->Flink)
     75    {
     76        PVBOXWDDM_OPENALLOCATION pCurOa = CONTAINING_RECORD(pCur, VBOXWDDM_OPENALLOCATION, ListEntry);
     77        if (pCurOa->pDevice == pDevice)
     78        {
     79            return pCurOa;
     80        }
     81    }
     82    return NULL;
     83}
     84
     85DECLINLINE(PVBOXWDDM_OPENALLOCATION) VBoxWddmOaSearch(PVBOXWDDM_DEVICE pDevice, PVBOXWDDM_ALLOCATION pAllocation)
     86{
     87    PVBOXWDDM_OPENALLOCATION pOa;
     88    KIRQL OldIrql;
     89    KeAcquireSpinLock(&pAllocation->OpenLock, &OldIrql);
     90    pOa = VBoxWddmOaSearchLocked(pDevice, pAllocation);
     91    KeReleaseSpinLock(&pAllocation->OpenLock, OldIrql);
     92    return pOa;
    5193}
    5294
     
    20202062            pAllocation->bVisible = FALSE;
    20212063            pAllocation->bAssigned = FALSE;
     2064            KeInitializeSpinLock(&pAllocation->OpenLock);
    20222065            InitializeListHead(&pAllocation->OpenList);
    20232066
     
    39914034                }
    39924035
    3993                 PVBOXWDDM_OPENALLOCATION pOa = NULL;
    3994                 for (PLIST_ENTRY pCur = pAlloc->OpenList.Flink; pCur != &pAlloc->OpenList; pCur = pCur->Flink)
    3995                 {
    3996                     PVBOXWDDM_OPENALLOCATION pCurOa = CONTAINING_RECORD(pCur, VBOXWDDM_OPENALLOCATION, ListEntry);
    3997                     if (pCurOa->pDevice == pDevice)
    3998                     {
    3999                         pOa = pCurOa;
    4000                         break;
    4001                     }
    4002                 }
    4003 
     4036                PVBOXWDDM_OPENALLOCATION pOa = VBoxWddmOaSearch(pDevice, pAlloc);
    40044037                if (!pOa)
    40054038                {
     
    48674900}
    48684901
     4902
     4903
    48694904/*
    48704905 * DxgkDdiOpenAllocation
     
    49164951            }
    49174952
    4918             PVBOXWDDM_OPENALLOCATION pOa = (PVBOXWDDM_OPENALLOCATION)vboxWddmMemAllocZero(sizeof (VBOXWDDM_OPENALLOCATION));
    4919             if (!pOa)
    4920             {
    4921                 WARN(("failed to allocation alloc info"));
    4922                 Status = STATUS_INSUFFICIENT_RESOURCES;
    4923                 break;
    4924             }
    4925 
    49264953#ifdef DEBUG
    4927             for (PLIST_ENTRY pCur = pAllocation->OpenList.Flink; pCur != &pAllocation->OpenList; pCur = pCur->Flink)
    4928             {
    4929                 PVBOXWDDM_OPENALLOCATION pCurOa = CONTAINING_RECORD(pCur, VBOXWDDM_OPENALLOCATION, ListEntry);
    4930                 if (pCurOa->pDevice == pDevice)
    4931                 {
    4932                     /* should not happen */
    4933                     Assert(0);
    4934                     break;
    4935                 }
    4936             }
    49374954            Assert(!pAllocation->fAssumedDeletion);
    49384955#endif
    4939             InsertHeadList(&pAllocation->OpenList, &pOa->ListEntry);
    4940             pOa->hAllocation = pInfo->hAllocation;
    4941             pOa->pAllocation = pAllocation;
    4942             pOa->pDevice = pDevice;
    4943             pInfo->hDeviceSpecificAllocation = pOa;
    4944 
    4945 
    49464956            if (pRcInfo)
    49474957            {
    49484958                Assert(pAllocation->enmType == VBOXWDDM_ALLOC_TYPE_UMD_RC_GENERIC);
    49494959
    4950                 if (pInfo->PrivateDriverDataSize < sizeof (VBOXWDDM_ALLOCINFO)
     4960                if (pInfo->PrivateDriverDataSize != sizeof (VBOXWDDM_ALLOCINFO)
    49514961                        || !pInfo->pPrivateDriverData)
    49524962                {
    49534963                    WARN(("invalid data size"));
    4954                     vboxWddmMemFree(pOa);
    49554964                    Status = STATUS_INVALID_PARAMETER;
    49564965                    break;
     
    49694978            }
    49704979
    4971             ++pAllocation->cOpens;
     4980            KIRQL OldIrql;
     4981            PVBOXWDDM_OPENALLOCATION pOa;
     4982            KeAcquireSpinLock(&pAllocation->OpenLock, &OldIrql);
     4983            pOa = VBoxWddmOaSearchLocked(pDevice, pAllocation);
     4984            if (pOa)
     4985            {
     4986                ++pOa->cOpens;
     4987                ++pAllocation->cOpens;
     4988                KeReleaseSpinLock(&pAllocation->OpenLock, OldIrql);
     4989            }
     4990            else
     4991            {
     4992                KeReleaseSpinLock(&pAllocation->OpenLock, OldIrql);
     4993                pOa = (PVBOXWDDM_OPENALLOCATION)vboxWddmMemAllocZero(sizeof (VBOXWDDM_OPENALLOCATION));
     4994                if (!pOa)
     4995                {
     4996                    WARN(("failed to allocation alloc info"));
     4997                    Status = STATUS_INSUFFICIENT_RESOURCES;
     4998                    break;
     4999                }
     5000
     5001                pOa->hAllocation = pInfo->hAllocation;
     5002                pOa->pAllocation = pAllocation;
     5003                pOa->pDevice = pDevice;
     5004                pOa->cOpens = 1;
     5005
     5006                PVBOXWDDM_OPENALLOCATION pConcurrentOa;
     5007                KeAcquireSpinLock(&pAllocation->OpenLock, &OldIrql);
     5008                pConcurrentOa = VBoxWddmOaSearchLocked(pDevice, pAllocation);
     5009                if (!pConcurrentOa)
     5010                    InsertHeadList(&pAllocation->OpenList, &pOa->ListEntry);
     5011                else
     5012                    ++pConcurrentOa->cOpens;
     5013                ++pAllocation->cOpens;
     5014                KeReleaseSpinLock(&pAllocation->OpenLock, OldIrql);
     5015                if (pConcurrentOa)
     5016                {
     5017                    vboxWddmMemFree(pOa);
     5018                    pOa = pConcurrentOa;
     5019                }
     5020            }
     5021
     5022            pInfo->hDeviceSpecificAllocation = pOa;
    49725023        }
    49735024
     
    49785029                DXGK_OPENALLOCATIONINFO* pInfo2Free = &pOpenAllocation->pOpenAllocation[j];
    49795030                PVBOXWDDM_OPENALLOCATION pOa2Free = (PVBOXWDDM_OPENALLOCATION)pInfo2Free->hDeviceSpecificAllocation;
    4980                 PVBOXWDDM_ALLOCATION pAllocation = pOa2Free->pAllocation;
    4981                 RemoveEntryList(&pOa2Free->ListEntry);
    4982                 Assert(pAllocation->cOpens);
    4983                 --pAllocation->cOpens;
    4984                 vboxWddmMemFree(pOa2Free);
     5031                VBoxWddmOaRelease(pOa2Free);
    49855032            }
    49865033        }
     
    50115058        PVBOXWDDM_OPENALLOCATION pOa2Free = (PVBOXWDDM_OPENALLOCATION)pCloseAllocation->pOpenHandleList[i];
    50125059        PVBOXWDDM_ALLOCATION pAllocation = pOa2Free->pAllocation;
    5013         RemoveEntryList(&pOa2Free->ListEntry);
    50145060        Assert(pAllocation->cShRcRefs >= pOa2Free->cShRcRefs);
    50155061        pAllocation->cShRcRefs -= pOa2Free->cShRcRefs;
    5016         Assert(pAllocation->cOpens);
    5017         --pAllocation->cOpens;
    5018         vboxWddmMemFree(pOa2Free);
     5062        VBoxWddmOaRelease(pOa2Free);
    50195063    }
    50205064
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