VirtualBox

Ignore:
Timestamp:
Sep 22, 2008 5:08:10 PM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
36946
Message:

Solaris/vboxnetflt: More threading/race fixes. Ugh.

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/VBoxNetFltInternal.h

    r12597 r12656  
    154154             * @{ */
    155155            /** Pointer to the bound IP stream. */
    156             void *pvIpStream;
     156            void volatile *pvIpStream;
    157157            /** Pointer to the bound ARP stream. */
    158             void *pvArpStream;
     158            void volatile *pvArpStream;
    159159            /** Pointer to the unbound promiscuous stream. */
    160             void *pvPromiscStream;
     160            void volatile *pvPromiscStream;
    161161            /** Layered device handle to the interface. */
    162162            ldi_handle_t hIface;
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFlt-solaris.c

    r12633 r12656  
    194194    ddi_prop_op,                    /* property ops */
    195195    &g_VBoxNetFltSolarisStreamTab,
    196     D_NEW | D_MP | D_MTPERQ,        /* compat. flag */
     196    D_NEW | D_MP | D_MTQPAIR,       /* compat. flag */
    197197    CB_REV                          /* revision */
    198198};
     
    23812381 * @param   pPromiscStream      Pointer to the promiscuous stream.
    23822382 * @param   pMsg                Pointer to the message.
     2383 * @remarks Warning!! Assumes caller has taken care of any locking necessary.
    23832384 */
    23842385static int vboxNetFltSolarisQueueLoopback(PVBOXNETFLTINS pThis, vboxnetflt_promisc_stream_t *pPromiscStream, mblk_t *pMsg)
     
    24272428                pPromiscStream->pHead = pCur;
    24282429                pPromiscStream->pTail = pCur;
     2430                pCur->pNext = NULL;
    24292431                pPromiscStream->cLoopback++;
    24302432
     
    24452447            }
    24462448
    2447             Assert(pPromiscStream->pTail);
     2449            AssertRelease(pPromiscStream->pTail);
    24482450
    24492451            pCur = RTMemAllocZ(sizeof(VBOXNETFLTPACKETID));
     
    24542456            }
    24552457
     2458            vboxNetFltSolarisInitPacketId(pCur, pMsg);
    24562459            pPromiscStream->pTail->pNext = pCur;
    2457             vboxNetFltSolarisInitPacketId(pCur, pMsg);
     2460            pPromiscStream->pTail = pCur;
     2461            pCur->pNext = NULL;
    24582462            pPromiscStream->cLoopback++;
    24592463
     
    24822486    }
    24832487
    2484     RTSpinlockRelease(pThis->hSpinlock, &Tmp);       
     2488    RTSpinlockRelease(pThis->hSpinlock, &Tmp);
    24852489    return rc;
    24862490}
     
    25582562            pPromiscStream->pTail = pCur;
    25592563            pCur->pNext = NULL;
     2564            pPromiscStream->cLoopback--;
    25602565        }
    25612566
     
    29692974     * Create a message block and send it down the wire (downstream).
    29702975     */
     2976    int rc = VINF_SUCCESS;
    29712977    if (fDst & INTNETTRUNKDIR_WIRE)
    29722978    {
    29732979        vboxnetflt_promisc_stream_t *pPromiscStream = ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.pvPromiscStream);
    2974         if (!pPromiscStream)
    2975             return VERR_INVALID_POINTER;
    2976 
    2977         queue_t *pPromiscWriteQueue = WR(pPromiscStream->Stream.pReadQueue);
    2978         Assert(pPromiscWriteQueue);
    2979 
     2980        if (RT_LIKELY(pPromiscStream))
     2981        {
     2982            queue_t *pPromiscWriteQueue = WR(pPromiscStream->Stream.pReadQueue);
     2983            Assert(pPromiscWriteQueue);
     2984
     2985            mblk_t *pMsg = vboxNetFltSolarisMBlkFromSG(pThis, pSG, fDst);
     2986            if (RT_LIKELY(pMsg))
     2987            {
     2988                LogFlow((DEVICE_NAME ":vboxNetFltPortOsXmit INTNETTRUNKDIR_WIRE\n"));
     2989
     2990                rc = vboxNetFltSolarisQueueLoopback(pThis, pPromiscStream, pMsg);
     2991                putnext(pPromiscWriteQueue, pMsg);
     2992            }
     2993            else
     2994                rc = VERR_NO_MEMORY;
     2995        }
     2996        else
     2997            rc = VERR_INVALID_POINTER;
     2998    }
     2999
     3000
     3001    /*
     3002     * Create a message block and send it up the host stack (upstream).
     3003     */
     3004    if (fDst & INTNETTRUNKDIR_HOST)
     3005    {
    29803006        mblk_t *pMsg = vboxNetFltSolarisMBlkFromSG(pThis, pSG, fDst);
    2981         if (RT_UNLIKELY(!pMsg))
    2982         {
    2983             LogRel((DEVICE_NAME ":vboxNetFltPortOsXmit vboxNetFltSolarisMBlkFromSG failed.\n"));
    2984             return VERR_NO_MEMORY;
    2985         }
    2986 
    2987         LogFlow((DEVICE_NAME ":vboxNetFltPortOsXmit INTNETTRUNKDIR_WIRE\n"));
    2988 
    2989         vboxNetFltSolarisQueueLoopback(pThis, pPromiscStream, pMsg);
    2990         putnext(pPromiscWriteQueue, pMsg);
    2991     }
    2992 
    2993     /*
    2994      * Create a message block and send it up the host stack (upstream).
    2995      */
    2996     if (fDst & INTNETTRUNKDIR_HOST)
    2997     {
    2998         mblk_t *pMsg = vboxNetFltSolarisMBlkFromSG(pThis, pSG, fDst);
    2999         if (RT_UNLIKELY(!pMsg))
    3000         {
    3001             LogRel((DEVICE_NAME ":vboxNetFltPortOsXmit vboxNetFltSolarisMBlkFromSG failed.\n"));
    3002             return VERR_NO_MEMORY;
    3003         }
    3004 
    3005         PCRTNETETHERHDR pEthHdr = (PCRTNETETHERHDR)pMsg->b_rptr;
    3006         bool fArp = (pEthHdr->EtherType == RT_H2BE_U16(RTNET_ETHERTYPE_ARP));
    3007 
    3008         /*
    3009          * Construct a DL_UNITDATA_IND style message.
    3010          */
    3011         mblk_t *pDlpiMsg;
    3012         int rc = vboxNetFltSolarisRawToUnitData(pMsg, &pDlpiMsg);
    3013         if (RT_FAILURE(rc))
    3014         {
    3015             LogRel((DEVICE_NAME ":vboxNetFltSolarisRawToUnitData failed! rc=%d\n", rc));
    3016             freemsg(pMsg);
    3017             return VERR_NO_MEMORY;
    3018         }
    3019         pMsg = pDlpiMsg;
    3020 
    3021         if (fArp)
    3022         {
    3023             LogFlow((DEVICE_NAME ":vboxNetFltPortOsXmit INTNETTRUNKDIR_HOST ARP\n"));
     3007        if (RT_LIKELY(pMsg))
     3008        {
     3009            PCRTNETETHERHDR pEthHdr = (PCRTNETETHERHDR)pMsg->b_rptr;
     3010            bool fArp = (pEthHdr->EtherType == RT_H2BE_U16(RTNET_ETHERTYPE_ARP));
    30243011
    30253012            /*
    3026              * Send message up ARP stream.
     3013             * Construct a DL_UNITDATA_IND style message.
    30273014             */
    3028             vboxnetflt_stream_t *pArpStream = ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.pvArpStream);
    3029             queue_t *pArpReadQueue = pArpStream->pReadQueue;
    3030             Assert(pArpReadQueue);
    3031 
    3032             putnext(pArpReadQueue, pMsg);
     3015            mblk_t *pDlpiMsg;
     3016            int rc = vboxNetFltSolarisRawToUnitData(pMsg, &pDlpiMsg);
     3017            if (RT_SUCCESS(rc))
     3018            {
     3019                pMsg = pDlpiMsg;
     3020
     3021                if (fArp)
     3022                {
     3023                    LogFlow((DEVICE_NAME ":vboxNetFltPortOsXmit INTNETTRUNKDIR_HOST ARP\n"));
     3024
     3025                    /*
     3026                     * Send message up ARP stream.
     3027                     */
     3028                    vboxnetflt_stream_t *pArpStream = ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.pvArpStream);
     3029                    queue_t *pArpReadQueue = pArpStream->pReadQueue;
     3030                    Assert(pArpReadQueue);
     3031
     3032                    putnext(pArpReadQueue, pMsg);
     3033                }
     3034                else
     3035                {
     3036                    LogFlow((DEVICE_NAME ":vboxNetFltPortOsXmit INTNETTRUNKDIR_HOST\n"));
     3037
     3038                    /*
     3039                     * Send messages up IP stream.
     3040                     */
     3041                    vboxnetflt_stream_t *pIpStream = ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.pvIpStream);
     3042                    queue_t *pIpReadQueue = pIpStream->pReadQueue;
     3043                    Assert(pIpReadQueue);
     3044
     3045                    putnext(pIpReadQueue, pMsg);
     3046                }
     3047            }
     3048            else
     3049            {
     3050                LogRel((DEVICE_NAME ":vboxNetFltSolarisRawToUnitData failed! rc=%d\n", rc));
     3051                freemsg(pMsg);
     3052                rc = VERR_NO_MEMORY;
     3053            }
    30333054        }
    30343055        else
    3035         {
    3036             LogFlow((DEVICE_NAME ":vboxNetFltPortOsXmit INTNETTRUNKDIR_HOST\n"));
    3037 
    3038             /*
    3039              * Send messages up IP stream.
    3040              */
    3041             vboxnetflt_stream_t *pIpStream = ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.pvIpStream);
    3042             queue_t *pIpReadQueue = pIpStream->pReadQueue;
    3043             Assert(pIpReadQueue);
    3044 
    3045             putnext(pIpReadQueue, pMsg);
    3046         }
    3047     }
    3048 
    3049     return VINF_SUCCESS;
    3050 }
    3051 
     3056            rc = VERR_NO_MEMORY;
     3057    }
     3058
     3059    return rc;
     3060}
     3061
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