VirtualBox

Changeset 12941 in vbox


Ignore:
Timestamp:
Oct 2, 2008 2:50:06 PM (17 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
37366
Message:

Solaris/vboxnetflt: Optimized loopback handling for getting acceptible performance in the worst case scenario of switching from no loopback to loopback.

File:
1 edited

Legend:

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

    r12921 r12941  
    21572157    size_t cbMsg = MBLKL(pMsg);
    21582158
    2159     AssertRelease(cbMsg > 0);   /** Yeah, die otherwise! */
    2160     pTag->pNext = NULL;
    21612159    pTag->cbPacket = cbMsg;
    21622160    pTag->Checksum = RTCrc32(pMsg->b_rptr, cbMsg);
     
    22012199
    22022200    PVBOXNETFLTPACKETID pCur = NULL;
    2203     if (pPromiscStream->cLoopback < VBOXNETFLT_LOOPBACK_SIZE)
     2201    if (pPromiscStream->cLoopback < VBOXNETFLT_LOOPBACK_SIZE
     2202        || (   pPromiscStream->pHead
     2203            && pPromiscStream->pHead->cbPacket == 0))
    22042204    {
    22052205        do
     
    22162216                vboxNetFltSolarisInitPacketId(pCur, pMsg);
    22172217
     2218                pCur->pNext = NULL;
    22182219                pPromiscStream->pHead = pCur;
    22192220                pPromiscStream->pTail = pCur;
     
    22242225                break;
    22252226            }
    2226             else if (   pPromiscStream->pTail
    2227                      && pPromiscStream->pTail->cbPacket == 0)
     2227            else if (   pPromiscStream->pHead
     2228                     && pPromiscStream->pHead->cbPacket == 0)
    22282229            {
    2229                 pCur = pPromiscStream->pTail;
     2230                pCur = pPromiscStream->pHead;
    22302231                vboxNetFltSolarisInitPacketId(pCur, pMsg);
    2231                 pPromiscStream->cLoopback++;
    2232 
    2233                 LogFlow((DEVICE_NAME ":vboxNetFltSolarisQueueLoopback re-used tail checksum=%u cLoopback=%d.\n",
     2232
     2233                LogFlow((DEVICE_NAME ":vboxNetFltSolarisQueueLoopback re-used head checksum=%u cLoopback=%d.\n",
    22342234                        pCur->Checksum, pPromiscStream->cLoopback));
    22352235                break;
    22362236            }
    2237             else if (pPromiscStream->pTail)
     2237            else
    22382238            {
    22392239                pCur = RTMemAlloc(sizeof(VBOXNETFLTPACKETID));
     
    22462246                vboxNetFltSolarisInitPacketId(pCur, pMsg);
    22472247
    2248                 pPromiscStream->pTail->pNext = pCur;
    2249                 pPromiscStream->pTail = pCur;
     2248                pCur->pNext = pPromiscStream->pHead;
     2249                pPromiscStream->pHead = pCur;
    22502250                pPromiscStream->cLoopback++;
    22512251
    2252                 LogFlow((DEVICE_NAME ":vboxNetFltSolarisQueueLoopback added tail checksum=%u cLoopback=%d.\n", pCur->Checksum,
     2252                LogFlow((DEVICE_NAME ":vboxNetFltSolarisQueueLoopback added head checksum=%u cLoopback=%d.\n", pCur->Checksum,
    22532253                        pPromiscStream->cLoopback));
    22542254                break;
     
    22592259    {
    22602260        /*
    2261          * Maximum loopback queue size reached. Re-use head as tail.
     2261         * Maximum loopback queue size reached. Re-use tail as head.
    22622262         */
    22632263        Assert(pPromiscStream->pHead);
    22642264        Assert(pPromiscStream->pTail);
    22652265
     2266        /*
     2267         * Find tail's previous item.
     2268         */
     2269        PVBOXNETFLTPACKETID pPrev = NULL;
    22662270        pCur = pPromiscStream->pHead;
    2267         pPromiscStream->pHead = pPromiscStream->pHead->pNext;
    2268         pPromiscStream->pTail->pNext = pCur;
    2269         pPromiscStream->pTail = pCur;
    2270         pCur->pNext = NULL;
    2271         pCur->cbPacket = 0;
    2272         pPromiscStream->cLoopback--;
     2271
     2272        /** @todo consider if this is worth switching to a double linked list... */
     2273        while (pCur != pPromiscStream->pTail)
     2274        {
     2275            pPrev = pCur;
     2276            pCur = pCur->pNext;
     2277        }
     2278
     2279        pPromiscStream->pTail = pPrev;
     2280        pPromiscStream->pTail->pNext = NULL;
     2281        pCur->pNext = pPromiscStream->pHead;
     2282        pPromiscStream->pHead = pCur;
    22732283
    22742284        vboxNetFltSolarisInitPacketId(pCur, pMsg);
    2275         LogFlow((DEVICE_NAME ":vboxNetFltSolarisQueueLoopback recycled head!! checksum=%u cLoopback=%d\n", pCur->Checksum,
     2285        LogFlow((DEVICE_NAME ":vboxNetFltSolarisQueueLoopback recycled tail!! checksum=%u cLoopback=%d\n", pCur->Checksum,
    22762286                pPromiscStream->cLoopback));
    22772287    }
     
    23482358        /*
    23492359         * Yes, it really is our own packet, mark it as handled
    2350          * and move it to the tail and return it's found.
     2360         * and move it as a "free slot" to the head and return success.
    23512361         */
    23522362        pCur->cbPacket = 0;
     
    23542364        {
    23552365            pPrev->pNext = pCur->pNext;
    2356             pPromiscStream->pTail->pNext = pCur;
    2357             pPromiscStream->pTail = pCur;
    2358             pCur->pNext = NULL;
    2359         }
    2360         pPromiscStream->cLoopback--;
     2366            pCur->pNext = pPromiscStream->pHead;
     2367            pPromiscStream->pHead = pCur;
     2368        }
    23612369        fIsOurPacket = true;
    23622370
    2363         LogFlow((DEVICE_NAME ":vboxNetFltSolarisIsOurMBlk found packet %p Checksum=%u cLoopbackQ=%d\n", pMsg, Checksum,
     2371        LogFlow((DEVICE_NAME ":vboxNetFltSolarisIsOurMBlk found packet %p Checksum=%u cLoopback=%d\n", pMsg, Checksum,
    23642372                    pPromiscStream->cLoopback));
    23652373        break;
     
    27072715        }
    27082716        else
    2709             LogRel((DEVICE_NAME ":vboxNetFltPortOsSetActive queue not found!\n"));           
     2717            LogRel((DEVICE_NAME ":vboxNetFltPortOsSetActive queue not found!\n"));
    27102718    }
    27112719    else
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