VirtualBox

Changeset 12633 in vbox


Ignore:
Timestamp:
Sep 22, 2008 12:02:48 PM (17 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
36913
Message:

Solaris/vboxnetflt: attempt to address setactive race during teardown.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified trunk/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFlt-solaris.c

    r12622 r12633  
    194194    ddi_prop_op,                    /* property ops */
    195195    &g_VBoxNetFltSolarisStreamTab,
    196     D_NEW | D_MP | D_MTPERMOD,      /* compat. flag */
     196    D_NEW | D_MP | D_MTPERQ,        /* compat. flag */
    197197    CB_REV                          /* revision */
    198198};
     
    303303    queue_t *pReadQueue;                  /* read side queue */
    304304    struct vboxnetflt_stream_t *pNext;    /* next stream in list */
    305     PVBOXNETFLTINS pThis;                 /* the backend instance */
     305    PVBOXNETFLTINS volatile pThis;        /* the backend instance */
    306306    VBOXNETFLTSTREAMTYPE Type;            /* the type of the stream Ip/Arp */
    307307} vboxnetflt_stream_t;
     
    701701     * the one that we will associate this stream with.
    702702     */
    703     pStream->pThis = pThis;
     703    ASMAtomicUoWritePtr((void * volatile *)&pStream->pThis, pThis);
    704704    pStream->Type = pState->CurType;
    705705    switch (pStream->Type)
    706706    {
    707         case kIpStream:         ASMAtomicUoWritePtr(&pThis->u.s.pvIpStream, pStream);         break;
    708         case kArpStream:        ASMAtomicUoWritePtr(&pThis->u.s.pvArpStream, pStream);        break;
    709         case kPromiscStream:    ASMAtomicUoWritePtr(&pThis->u.s.pvPromiscStream, pStream);    break;
     707        case kIpStream:         ASMAtomicUoWritePtr((void * volatile *)&pThis->u.s.pvIpStream, pStream);         break;
     708        case kArpStream:        ASMAtomicUoWritePtr((void * volatile *)&pThis->u.s.pvArpStream, pStream);        break;
     709        case kPromiscStream:    ASMAtomicUoWritePtr((void * volatile *)&pThis->u.s.pvPromiscStream, pStream);    break;
    710710        default:    /* Heh. */
    711711        {
     
    806806
    807807    RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER;
    808     PVBOXNETFLTINS pThis = pStream->pThis;
     808    PVBOXNETFLTINS pThis = ASMAtomicUoReadPtr((void * volatile *)&pStream->pThis);
    809809    RTSpinlockAcquire(pThis->hSpinlock, &Tmp);
    810810
     
    871871    bool fSendUpstream = true;
    872872    bool fActive = false;
     873    bool fRetained = false;
    873874    vboxnetflt_stream_t *pStream = pQueue->q_ptr;
    874875    PVBOXNETFLTINS pThis = NULL;
     
    881882        && pStream->Type == kPromiscStream)
    882883    {
    883         pThis = vboxNetFltSolarisFindInstance(pStream);
     884        pThis = ASMAtomicUoReadPtr((void * volatile *)&pStream->pThis);
    884885        if (RT_LIKELY(pThis))
    885886        {
     
    890891            RTSpinlockAcquire(pThis->hSpinlock, &Tmp);
    891892            fActive = ASMAtomicUoReadBool(&pThis->fActive);
    892             if (fActive)
    893                 vboxNetFltRetain(pThis, true);
     893            vboxNetFltRetain(pThis, true);
     894            fRetained = true;
    894895            RTSpinlockRelease(pThis->hSpinlock, &Tmp);
    895896
     
    10351036    }
    10361037
    1037     if (fActive)
     1038    if (fRetained)
    10381039        vboxNetFltRelease(pThis, true);
    10391040
     
    17741775    RTSpinlockAcquire(pThis->hSpinlock, &Tmp);
    17751776
    1776     vboxnetflt_promisc_stream_t *pPromiscStream = pThis->u.s.pvPromiscStream;
     1777    vboxnetflt_promisc_stream_t *pPromiscStream = ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.pvPromiscStream);
    17771778    if (pPromiscStream)
    17781779    {
     
    23772378 *
    23782379 * @returns VBox status code.
    2379  * @param   pThis       The instance.
     2380 * @param   pThis               The instance.
    23802381 * @param   pPromiscStream      Pointer to the promiscuous stream.
    2381  * @param   pMsg        Pointer to the message.
     2382 * @param   pMsg                Pointer to the message.
    23822383 */
    23832384static int vboxNetFltSolarisQueueLoopback(PVBOXNETFLTINS pThis, vboxnetflt_promisc_stream_t *pPromiscStream, mblk_t *pMsg)
     
    23902391    LogFlow((DEVICE_NAME ":vboxNetFltSolarisQueueLoopback pThis=%p pPromiscStream=%p pMsg=%p\n", pThis, pPromiscStream, pMsg));
    23912392
     2393    if (RT_UNLIKELY(pMsg->b_cont))
     2394    {
     2395        /*
     2396         * We don't currently make chained messages in on Xmit
     2397         * so this only needs to be supported when we do that.
     2398         */
     2399        return VERR_NOT_SUPPORTED;
     2400    }
     2401
    23922402    size_t cbMsg = MBLKL(pMsg);
    2393     if (cbMsg < sizeof(RTNETETHERHDR))
     2403    if (RT_UNLIKELY(cbMsg < sizeof(RTNETETHERHDR)))
    23942404        return VERR_NET_MSG_SIZE;
    2395 
    2396     if (pMsg->b_cont)
    2397     {
    2398         /* @todo -XXX- handle chained messages */
    2399         return VERR_NOT_IMPLEMENTED;
    2400     }
    24012405
    24022406    RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER;
     
    25022506    if (pMsg->b_cont)
    25032507    {
    2504         /** @todo -XXX- implement chained message handling. */
     2508        /** Handle this when Xmit makes chained messages */
    25052509        return false;
    25062510    }
     
    25102514        return false;
    25112515
     2516    PVBOXNETFLTPACKETID pPrev = NULL;
    25122517    PVBOXNETFLTPACKETID pCur = pPromiscStream->pHead;
    25132518    bool fIsOur = false;
    25142519    while (pCur)
    25152520    {
    2516         if (pCur->cbPacket != cbMsg)
    2517         {
    2518             pCur = pCur->pNext;
    2519             continue;
    2520         }
    2521 
    25222521        PCRTNETETHERHDR pEthHdr = (PCRTNETETHERHDR)pMsg->b_rptr;
    2523         if (   pCur->SrcMac.au8[0] != pEthHdr->SrcMac.au8[0]
     2522        if (   pCur->cbPacket != cbMsg
     2523            || pCur->SrcMac.au8[0] != pEthHdr->SrcMac.au8[0]
    25242524            || pCur->SrcMac.au8[1] != pEthHdr->SrcMac.au8[1]
    25252525            || pCur->SrcMac.au8[2] != pEthHdr->SrcMac.au8[2]
     
    25342534            || pCur->DstMac.au8[5] != pEthHdr->DstMac.au8[5])
    25352535        {
     2536            pPrev = pCur;
    25362537            pCur = pCur->pNext;
    25372538            continue;
     
    25412542        if (pCur->Checksum != Checksum)
    25422543        {
     2544            pPrev = pCur;
    25432545            pCur = pCur->pNext;
    25442546            continue;
     
    25472549        /*
    25482550         * Yes, it really is our own packet, mark it as handled
    2549          * and return it's found.
     2551         * and move it to the tail and return it's found.
    25502552         */
    25512553        pCur->cbPacket = 0;
     2554        if (pPrev)
     2555        {
     2556            pPrev->pNext = pCur->pNext;
     2557            pPromiscStream->pTail->pNext = pCur;
     2558            pPromiscStream->pTail = pCur;
     2559            pCur->pNext = NULL;
     2560        }
     2561
    25522562        LogFlow((DEVICE_NAME ":vboxNetFltSolarisIsOurMBlk found packet %p cLoopback=%d\n", pMsg, pPromiscStream->cLoopback));
    25532563        return true;
     
    25782588     * Don't loopback packets we transmit to the wire.
    25792589     */
    2580     vboxnetflt_promisc_stream_t *pPromiscStream = pThis->u.s.pvPromiscStream;
     2590    vboxnetflt_promisc_stream_t *pPromiscStream = ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.pvPromiscStream);
    25812591    if (vboxNetFltSolarisIsOurMBlk(pThis, pPromiscStream, pMsg))
    25822592    {
     
    28892899     * Enable/disable promiscuous mode.
    28902900     */
    2891     vboxnetflt_stream_t *pStream = pThis->u.s.pvPromiscStream;
     2901    vboxnetflt_stream_t *pStream = ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.pvPromiscStream);
    28922902    if (pStream)
    28932903    {
     
    29612971    if (fDst & INTNETTRUNKDIR_WIRE)
    29622972    {
    2963         vboxnetflt_promisc_stream_t *pPromiscStream = pThis->u.s.pvPromiscStream;
     2973        vboxnetflt_promisc_stream_t *pPromiscStream = ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.pvPromiscStream);
    29642974        if (!pPromiscStream)
    29652975            return VERR_INVALID_POINTER;
    29662976
    29672977        queue_t *pPromiscWriteQueue = WR(pPromiscStream->Stream.pReadQueue);
     2978        Assert(pPromiscWriteQueue);
    29682979
    29692980        mblk_t *pMsg = vboxNetFltSolarisMBlkFromSG(pThis, pSG, fDst);
     
    30153026             * Send message up ARP stream.
    30163027             */
    3017             vboxnetflt_stream_t *pArpStream = pThis->u.s.pvArpStream;
     3028            vboxnetflt_stream_t *pArpStream = ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.pvArpStream);
    30183029            queue_t *pArpReadQueue = pArpStream->pReadQueue;
     3030            Assert(pArpReadQueue);
     3031
    30193032            putnext(pArpReadQueue, pMsg);
    30203033        }
     
    30263039             * Send messages up IP stream.
    30273040             */
    3028             vboxnetflt_stream_t *pIpStream = pThis->u.s.pvIpStream;
     3041            vboxnetflt_stream_t *pIpStream = ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.pvIpStream);
    30293042            queue_t *pIpReadQueue = pIpStream->pReadQueue;
     3043            Assert(pIpReadQueue);
     3044
    30303045            putnext(pIpReadQueue, pMsg);
    30313046        }
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