VirtualBox

Changeset 84803 in vbox for trunk/src/VBox/Devices/Network


Ignore:
Timestamp:
Jun 12, 2020 6:17:35 AM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
138609
Message:

Network/DevVirtioNet_1_0.cpp: Rename API functions to refer to Virtq instead of Queue to be more Virtio like and disambiguate from other queue types. Temporarily enable build in Config.kmk to let the build machines catch errors

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Network/DevVirtioNet_1_0.cpp

    r84775 r84803  
    6161#define VIRTIONET_SAVED_STATE_VERSION          UINT32_C(1)
    6262#define VIRTIONET_MAX_QPAIRS                   1
    63 #define VIRTIONET_MAX_QUEUES                   (VIRTIONET_MAX_QPAIRS * 2 + 1)
     63#define VIRTIONET_MAX_VIRTQS                   (VIRTIONET_MAX_QPAIRS * 2 + 1)
    6464#define VIRTIONET_MAX_FRAME_SIZE               65535 + 18     /**< Max IP pkt size + Ethernet header with VLAN tag  */
    6565#define VIRTIONET_MAC_FILTER_LEN               32
     
    6767#define VIRTIONET_PREALLOCATE_RX_SEG_COUNT     32
    6868
    69 #define VIRTQNAME(idxQueue)       (pThis->aQueues[idxQueue]->szName)
    70 #define CBVIRTQNAME(idxQueue)     RTStrNLen(VIRTQNAME(idxQueue), sizeof(VIRTQNAME(idxQueue)))
     69#define VIRTQNAME(idxVirtq)       (pThis->aVirtqs[idxVirtq]->szName)
     70#define CBVIRTQNAME(idxVirtq)     RTStrNLen(VIRTQNAME(idxVirtq), sizeof(VIRTQNAME(idxVirtq)))
    7171#define FEATURE_ENABLED(feature)  RT_BOOL(pThis->fNegotiatedFeatures & VIRTIONET_F_##feature)
    7272#define FEATURE_DISABLED(feature) (!FEATURE_ENABLED(feature))
    7373#define FEATURE_OFFERED(feature)  VIRTIONET_HOST_FEATURES_OFFERED & VIRTIONET_F_##feature
    7474
    75 #define IS_VIRTQ_EMPTY(pDevIns, pVirtio, idxQueue) \
    76             (virtioCoreQueueAvailCount(pDevIns, pVirtio, idxQueue) == 0)
     75#define IS_VIRTQ_EMPTY(pDevIns, pVirtio, idxVirtq) \
     76            (virtioCoreVirtqAvailCount(pDevIns, pVirtio, idxVirtq) == 0)
    7777
    7878#define SET_LINK_UP(pState) \
     
    9090
    9191/* Macros to calculate queue specific index number VirtIO 1.0, 5.1.2 */
    92 #define IS_TX_QUEUE(n)    ((n) != CTRLQIDX && ((n) & 1))
    93 #define IS_RX_QUEUE(n)    ((n) != CTRLQIDX && !IS_TX_QUEUE(n))
    94 #define IS_CTRL_QUEUE(n)  ((n) == CTRLQIDX)
     92#define IS_TX_VIRTQ(n)    ((n) != CTRLQIDX && ((n) & 1))
     93#define IS_RX_VIRTQ(n)    ((n) != CTRLQIDX && !IS_TX_VIRTQ(n))
     94#define IS_CTRL_VIRTQ(n)  ((n) == CTRLQIDX)
    9595#define RXQIDX(qPairIdx)  (qPairIdx * 2)
    9696#define TXQIDX(qPairIdx)  (qPairIdx * 2 + 1)
     
    306306struct VIRTIONETWORKERR3;
    307307
    308 typedef struct VIRTIONETQUEUE
     308typedef struct VIRTIONETVIRTQ
    309309{
    310310    struct VIRTIONETWORKER         *pWorker;                    /**< Pointer to R0 worker struct                      */
     
    312312    uint16_t                       idx;                         /**< Index of this queue                              */
    313313    uint16_t                       align;
    314     char                           szName[VIRTIO_MAX_QUEUE_NAME_SIZE]; /**< Queue name                                */
    315     bool                           fCtlQueue;                   /**< If set this queue is the control queue           */
     314    char                           szName[VIRTIO_MAX_VIRTQ_NAME_SIZE]; /**< Virtq name                                */
     315    bool                           fCtlVirtq;                   /**< If set this queue is the control queue           */
    316316    bool                           fHasWorker;                  /**< If set this queue has an associated worker       */
    317317    bool                           fAttachedToVirtioCore;       /**< Set if queue attached to virtio core             */
    318318    uint8_t                        pad;
    319 } VIRTIONETQUEUE, *PVIRTIONETQUEUE;
     319} VIRTIONETVIRTQ, *PVIRTIONETVIRTQ;
    320320
    321321/**
     
    325325{
    326326    SUPSEMEVENT                     hEvtProcess;                /**< handle of associated sleep/wake-up semaphore      */
    327     PVIRTIONETQUEUE                 pQueue;                     /**< pointer to queue                                  */
     327    PVIRTIONETVIRTQ                 pVirtq;                     /**< pointer to queue                                  */
    328328    uint16_t                        idx;                        /**< Index of this worker                              */
    329329    bool volatile                   fSleeping;                  /**< Flags whether worker thread is sleeping or not    */
     
    341341{
    342342    R3PTRTYPE(PPDMTHREAD)           pThread;                    /**< pointer to worker thread's handle                 */
    343     PVIRTIONETQUEUE                 pQueue;                     /**< pointer to queue                                  */
     343    PVIRTIONETVIRTQ                 pVirtq;                     /**< pointer to queue                                  */
    344344    uint16_t                        idx;                        /**< Index of this worker                              */
    345345    uint16_t                        pad;
     
    362362
    363363    /** Per device-bound virtq worker-thread contexts (eventq slot unused) */
    364     VIRTIONETWORKER         aWorkers[VIRTIONET_MAX_QUEUES];
     364    VIRTIONETWORKER         aWorkers[VIRTIONET_MAX_VIRTQS];
    365365
    366366    /** Track which VirtIO queues we've attached to */
    367     VIRTIONETQUEUE          aQueues[VIRTIONET_MAX_QUEUES];
     367    VIRTIONETVIRTQ          aVirtqs[VIRTIONET_MAX_VIRTQS];
    368368
    369369    /** PDM device Instance name */
     
    377377
    378378    /** Number of virtqueues total (which includes each queue of each pair plus one control queue */
    379     uint16_t                cVirtQueues;
     379    uint16_t                cVirtVirtqs;
    380380
    381381    /** Number of worker threads (one for the control queue and one for each Tx queue) */
     
    485485
    486486    /** Per device-bound virtq worker-thread contexts (eventq slot unused) */
    487     VIRTIONETWORKERR3               aWorkers[VIRTIONET_MAX_QUEUES];
     487    VIRTIONETWORKERR3               aWorkers[VIRTIONET_MAX_VIRTQS];
    488488
    489489    /** The device instance.
     
    613613
    614614/**
    615  * @callback_method_impl{VIRTIOCORER0,pfnQueueNotified}
    616  */
    617 static DECLCALLBACK(void) virtioNetQueueNotified(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxQueue)
     615 * @callback_method_impl{VIRTIOCORER0,pfnVirtqNotified}
     616 */
     617static DECLCALLBACK(void) virtioNetVirtqNotified(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxVirtq)
    618618{
    619619    RT_NOREF(pVirtio);
    620620    PVIRTIONET pThis = PDMDEVINS_2_DATA(pDevIns, PVIRTIONET);
    621621
    622     PVIRTIONETQUEUE  pQueue = &pThis->aQueues[idxQueue];
    623     PVIRTIONETWORKER pWorker = pQueue->pWorker;
     622    PVIRTIONETVIRTQ  pVirtq = &pThis->aVirtqs[idxVirtq];
     623    PVIRTIONETWORKER pWorker = pVirtq->pWorker;
    624624
    625625#if defined (IN_RING3) && defined (LOG_ENABLED)
     
    627627#endif
    628628
    629     if (IS_RX_QUEUE(idxQueue))
    630     {
    631         uint16_t cBufsAvailable = virtioCoreQueueAvailCount(pDevIns, pVirtio, idxQueue);
     629    if (IS_RX_VIRTQ(idxVirtq))
     630    {
     631        uint16_t cBufsAvailable = virtioCoreVirtqAvailCount(pDevIns, pVirtio, idxVirtq);
    632632
    633633        if (cBufsAvailable)
    634634        {
    635635            Log10Func(("%s %u empty bufs added to %s by guest (notifying leaf device)\n",
    636                         pThis->szInst, cBufsAvailable, pQueue->szName));
     636                        pThis->szInst, cBufsAvailable, pVirtq->szName));
    637637            virtioNetWakeupRxBufWaiter(pDevIns);
    638638        }
    639639        else
    640640            LogRel(("%s \n\n***WARNING: %s notified but no empty bufs added by guest! (skip notifying of leaf device)\n\n",
    641                     pThis->szInst, pQueue->szName));
    642     }
    643     else if (IS_TX_QUEUE(idxQueue) || IS_CTRL_QUEUE(idxQueue))
     641                    pThis->szInst, pVirtq->szName));
     642    }
     643    else if (IS_TX_VIRTQ(idxVirtq) || IS_CTRL_VIRTQ(idxVirtq))
    644644    {
    645645        /* Wake queue's worker thread up if sleeping (e.g. a Tx queue, or the control queue */
     
    648648            if (ASMAtomicReadBool(&pWorker->fSleeping))
    649649            {
    650                 Log10Func(("%s %s has available buffers - waking worker.\n", pThis->szInst, pQueue->szName));
     650                Log10Func(("%s %s has available buffers - waking worker.\n", pThis->szInst, pVirtq->szName));
    651651                int rc = PDMDevHlpSUPSemEventSignal(pDevIns, pWorker->hEvtProcess);
    652652                AssertRC(rc);
     
    654654            else
    655655            {
    656                 Log10Func(("%s %s has available buffers - worker already awake\n", pThis->szInst, pQueue->szName));
     656                Log10Func(("%s %s has available buffers - worker already awake\n", pThis->szInst, pVirtq->szName));
    657657            }
    658658        }
    659659        else
    660660        {
    661             Log10Func(("%s %s has available buffers - waking worker.\n", pThis->szInst, pQueue->szName));
     661            Log10Func(("%s %s has available buffers - waking worker.\n", pThis->szInst, pVirtq->szName));
    662662        }
    663663    }
    664664    else
    665         LogRelFunc(("%s unrecognized queue %s (idx=%d) notified\n", pQueue->szName, idxQueue));
     665        LogRelFunc(("%s unrecognized queue %s (idx=%d) notified\n", pVirtq->szName, idxVirtq));
    666666}
    667667
     
    677677
    678678    Log10Func(("%s\n", pThis->szInst));
     679    RT_NOREF(pThis);
    679680
    680681    return PDMDevHlpSUPSemEventSignal(pDevIns, pWorker->hEvtProcess);
     
    684685DECLINLINE(void) virtioNetR3SetVirtqNames(PVIRTIONET pThis)
    685686{
    686     RTStrCopy(pThis->aQueues[CTRLQIDX].szName, VIRTIO_MAX_QUEUE_NAME_SIZE, "controlq");
     687    RTStrCopy(pThis->aVirtqs[CTRLQIDX].szName, VIRTIO_MAX_VIRTQ_NAME_SIZE, "controlq");
    687688    for (uint16_t qPairIdx = 0; qPairIdx < pThis->cVirtqPairs; qPairIdx++)
    688689    {
    689         RTStrPrintf(pThis->aQueues[RXQIDX(qPairIdx)].szName, VIRTIO_MAX_QUEUE_NAME_SIZE, "receiveq<%d>",  qPairIdx);
    690         RTStrPrintf(pThis->aQueues[TXQIDX(qPairIdx)].szName, VIRTIO_MAX_QUEUE_NAME_SIZE, "transmitq<%d>", qPairIdx);
     690        RTStrPrintf(pThis->aVirtqs[RXQIDX(qPairIdx)].szName, VIRTIO_MAX_VIRTQ_NAME_SIZE, "receiveq<%d>",  qPairIdx);
     691        RTStrPrintf(pThis->aVirtqs[TXQIDX(qPairIdx)].szName, VIRTIO_MAX_VIRTQ_NAME_SIZE, "transmitq<%d>", qPairIdx);
    691692    }
    692693}
     
    813814    bool fState    = pszArgs && (*pszArgs == 's' || *pszArgs == 'S'); /* "state"    */
    814815    bool fPointers = pszArgs && (*pszArgs == 'p' || *pszArgs == 'P'); /* "pointers" */
    815     bool fQueues   = pszArgs && (*pszArgs == 'q' || *pszArgs == 'Q'); /* "queues    */
     816    bool fVirtqs   = pszArgs && (*pszArgs == 'q' || *pszArgs == 'Q'); /* "queues    */
    816817
    817818    /* Show basic information. */
     
    836837
    837838    /* Show queues (and associate worker info if applicable) */
    838     if (fAll || fQueues)
    839     {
    840         pHlp->pfnPrintf(pHlp, "Queue information:\n\n");
    841 
    842         for (int idxQueue = 0; idxQueue < pThis->cVirtQueues; idxQueue++)
     839    if (fAll || fVirtqs)
     840    {
     841        pHlp->pfnPrintf(pHlp, "Virtq information:\n\n");
     842
     843        for (int idxVirtq = 0; idxVirtq < pThis->cVirtVirtqs; idxVirtq++)
    843844        {
    844             PVIRTIONETQUEUE pQueue = &pThis->aQueues[idxQueue];
    845 
    846             if (pQueue->fHasWorker)
     845            PVIRTIONETVIRTQ pVirtq = &pThis->aVirtqs[idxVirtq];
     846
     847            if (pVirtq->fHasWorker)
    847848            {
    848                 PVIRTIONETWORKER pWorker = pQueue->pWorker;
    849                 PVIRTIONETWORKERR3 pWorkerR3 = pQueue->pWorkerR3;
     849                PVIRTIONETWORKER pWorker = pVirtq->pWorker;
     850                PVIRTIONETWORKERR3 pWorkerR3 = pVirtq->pWorkerR3;
    850851
    851852                if (pWorker->fAssigned)
    852853                {
    853854                    pHlp->pfnPrintf(pHlp, "    %-15s (pThread: %p %s) ",
    854                         pQueue->szName,
     855                        pVirtq->szName,
    855856                        pWorkerR3->pThread,
    856857                        virtioNetThreadStateName(pWorkerR3->pThread));
    857                     if (pQueue->fAttachedToVirtioCore)
     858                    if (pVirtq->fAttachedToVirtioCore)
    858859                    {
    859860                        pHlp->pfnPrintf(pHlp, "worker: ");
     
    868869            else
    869870            {
    870                 pHlp->pfnPrintf(pHlp, "    %-15s (INetworkDown's thread) %s", pQueue->szName,
    871                     pQueue->fAttachedToVirtioCore  ? "" : "not attached to virtio core");
     871                pHlp->pfnPrintf(pHlp, "    %-15s (INetworkDown's thread) %s", pVirtq->szName,
     872                    pVirtq->fAttachedToVirtioCore  ? "" : "not attached to virtio core");
    872873            }
    873874            pHlp->pfnPrintf(pHlp, "\n");
    874             virtioCoreR3QueueInfo(pDevIns, pHlp, pszArgs, idxQueue);
     875            virtioCoreR3VirtqInfo(pDevIns, pHlp, pszArgs, idxVirtq);
    875876            pHlp->pfnPrintf(pHlp, "    ---------------------------------------------------------------------\n");
    876877            pHlp->pfnPrintf(pHlp, "\n");
     
    900901        pHlp->pfnPrintf(pHlp, "    uDeviceStatus ............. 0x%x\n", pThis->Virtio.uDeviceStatus);
    901902        pHlp->pfnPrintf(pHlp, "    cVirtqPairs .,............. %d\n",  pThis->cVirtqPairs);
    902         pHlp->pfnPrintf(pHlp, "    cVirtQueues .,............. %d\n",  pThis->cVirtQueues);
     903        pHlp->pfnPrintf(pHlp, "    cVirtVirtqs .,............. %d\n",  pThis->cVirtVirtqs);
    903904        pHlp->pfnPrintf(pHlp, "    cWorkers .................. %d\n",  pThis->cWorkers);
    904905        pHlp->pfnPrintf(pHlp, "    MMIO mapping name ......... %d\n",  pThisCC->Virtio.pcszMmioName);
     
    11351136    pHlp->pfnSSMGetU64(     pSSM, &pThis->fNegotiatedFeatures);
    11361137
    1137     pHlp->pfnSSMGetU16(     pSSM, &pThis->cVirtQueues);
     1138    pHlp->pfnSSMGetU16(     pSSM, &pThis->cVirtVirtqs);
    11381139    pHlp->pfnSSMGetU16(     pSSM, &pThis->cWorkers);
    11391140
    1140     for (int idxQueue = 0; idxQueue < pThis->cVirtQueues; idxQueue++)
    1141         pHlp->pfnSSMGetBool(pSSM, &pThis->aQueues[idxQueue].fAttachedToVirtioCore);
     1141    for (int idxVirtq = 0; idxVirtq < pThis->cVirtVirtqs; idxVirtq++)
     1142        pHlp->pfnSSMGetBool(pSSM, &pThis->aVirtqs[idxVirtq].fAttachedToVirtioCore);
    11421143
    11431144    int rc;
     
    11991200    {
    12001201        PVIRTIONETWORKER pWorker = &pThis->aWorkers[idxWorker];
    1201         PVIRTIONETQUEUE  pQueue  = pWorker->pQueue;
    1202         if (pQueue->fAttachedToVirtioCore)
     1202        PVIRTIONETVIRTQ  pVirtq  = pWorker->pVirtq;
     1203        if (pVirtq->fAttachedToVirtioCore)
    12031204        {
    1204             Log7Func(("%s Waking %s worker.\n", pThis->szInst, pQueue->szName));
     1205            Log7Func(("%s Waking %s worker.\n", pThis->szInst, pVirtq->szName));
    12051206            rc = PDMDevHlpSUPSemEventSignal(pDevIns, pWorker->hEvtProcess);
    12061207            AssertRCReturn(rc, rc);
     
    12241225    pHlp->pfnSSMPutU64(     pSSM, pThis->fNegotiatedFeatures);
    12251226
    1226     pHlp->pfnSSMPutU16(     pSSM, pThis->cVirtQueues);
     1227    pHlp->pfnSSMPutU16(     pSSM, pThis->cVirtVirtqs);
    12271228    pHlp->pfnSSMPutU16(     pSSM, pThis->cWorkers);
    12281229
    1229     for (int idxQueue = 0; idxQueue < pThis->cVirtQueues; idxQueue++)
    1230         pHlp->pfnSSMPutBool(pSSM, pThis->aQueues[idxQueue].fAttachedToVirtioCore);
     1230    for (int idxVirtq = 0; idxVirtq < pThis->cVirtVirtqs; idxVirtq++)
     1231        pHlp->pfnSSMPutBool(pSSM, pThis->aVirtqs[idxVirtq].fAttachedToVirtioCore);
    12311232
    12321233    /* Save config area */
     
    14701471 * @thread  RX
    14711472 */
    1472 static int virtioNetR3CheckRxBufsAvail(PPDMDEVINS pDevIns, PVIRTIONET pThis, PVIRTIONETQUEUE pRxQueue)
     1473static int virtioNetR3CheckRxBufsAvail(PPDMDEVINS pDevIns, PVIRTIONET pThis, PVIRTIONETVIRTQ pRxVirtq)
    14731474{
    14741475    int rc = VERR_INVALID_STATE;
     
    14771478        Log8Func(("%s No Rx bufs available. (VirtIO core not ready)\n", pThis->szInst));
    14781479
    1479     else if (!virtioCoreIsQueueEnabled(&pThis->Virtio, pRxQueue->idx))
    1480         Log8Func(("%s No Rx bufs available. (%s not enabled)\n",  pThis->szInst, pRxQueue->szName));
    1481 
    1482     else if (IS_VIRTQ_EMPTY(pDevIns, &pThis->Virtio, pRxQueue->idx))
    1483         Log8Func(("%s No Rx bufs available. (%s empty)\n",  pThis->szInst, pRxQueue->szName));
     1480    else if (!virtioCoreIsVirtqEnabled(&pThis->Virtio, pRxVirtq->idx))
     1481        Log8Func(("%s No Rx bufs available. (%s not enabled)\n",  pThis->szInst, pRxVirtq->szName));
     1482
     1483    else if (IS_VIRTQ_EMPTY(pDevIns, &pThis->Virtio, pRxVirtq->idx))
     1484        Log8Func(("%s No Rx bufs available. (%s empty)\n",  pThis->szInst, pRxVirtq->szName));
    14841485
    14851486    else
    14861487    {
    1487         Log8Func(("%s Empty guest buffers available in %s\n",  pThis->szInst,pRxQueue->szName));
     1488        Log8Func(("%s Empty guest buffers available in %s\n",  pThis->szInst,pRxVirtq->szName));
    14881489        rc = VINF_SUCCESS;
    14891490    }
    1490     virtioCoreQueueNotifyEnable(&pThis->Virtio, pRxQueue->idx, rc == VERR_INVALID_STATE /* fEnable */);
     1491    virtioCoreVirtqNotifyEnable(&pThis->Virtio, pRxVirtq->idx, rc == VERR_INVALID_STATE /* fEnable */);
    14911492    return rc;
    14921493}
    14931494
    1494 static bool virtioNetR3RxBufsAvail(PPDMDEVINS pDevIns, PVIRTIONET pThis, PVIRTIONETQUEUE *pRxQueue)
    1495 {
    1496     for (int idxQueuePair = 0; idxQueuePair < pThis->cVirtqPairs; idxQueuePair++)
    1497     {
    1498         PVIRTIONETQUEUE pThisRxQueue = &pThis->aQueues[RXQIDX(idxQueuePair)];
    1499         if (RT_SUCCESS(virtioNetR3CheckRxBufsAvail(pDevIns, pThis, pThisRxQueue)))
     1495static bool virtioNetR3RxBufsAvail(PPDMDEVINS pDevIns, PVIRTIONET pThis, PVIRTIONETVIRTQ *pRxVirtq)
     1496{
     1497    for (int idxVirtqPair = 0; idxVirtqPair < pThis->cVirtqPairs; idxVirtqPair++)
     1498    {
     1499        PVIRTIONETVIRTQ pThisRxVirtq = &pThis->aVirtqs[RXQIDX(idxVirtqPair)];
     1500        if (RT_SUCCESS(virtioNetR3CheckRxBufsAvail(pDevIns, pThis, pThisRxVirtq)))
    15001501        {
    1501             if (pRxQueue)
    1502                 *pRxQueue = pThisRxQueue;
     1502            if (pRxVirtq)
     1503                *pRxVirtq = pThisRxVirtq;
    15031504            return true;
    15041505        }
     
    15161517    PVIRTIONET   pThis   = PDMDEVINS_2_DATA(pDevIns, PVIRTIONET);
    15171518
    1518     if (virtioNetR3RxBufsAvail(pDevIns, pThis, NULL /* pRxQueue */))
     1519    if (virtioNetR3RxBufsAvail(pDevIns, pThis, NULL /* pRxVirtq */))
    15191520    {
    15201521        Log10Func(("%s Rx bufs now available, releasing waiter...\n", pThis->szInst));
     
    15301531
    15311532    do {
    1532         if (virtioNetR3RxBufsAvail(pDevIns, pThis, NULL /* pRxQueue */))
     1533        if (virtioNetR3RxBufsAvail(pDevIns, pThis, NULL /* pRxVirtq */))
    15331534        {
    15341535            Log10Func(("%s Rx bufs now available, releasing waiter...\n", pThis->szInst));
     
    17301731                                       VIRTIONET_PKT_HDR_T *rxPktHdr, uint16_t cSegsAllocated,
    17311732                                       PRTSGBUF pVirtSegBufToGuest, PRTSGSEG paVirtSegsToGuest,
    1732                                        PVIRTIONETQUEUE pRxQueue)
     1733                                       PVIRTIONETVIRTQ pRxVirtq)
    17331734{
    17341735    uint8_t fAddPktHdr = true;
     
    17401741        PVIRTIO_DESC_CHAIN_T pDescChain = NULL;
    17411742
    1742         int rc = virtioCoreR3QueueGet(pDevIns, &pThis->Virtio, pRxQueue->idx, &pDescChain, true);
     1743        int rc = virtioCoreR3VirtqGet(pDevIns, &pThis->Virtio, pRxVirtq->idx, &pDescChain, true);
    17431744        AssertMsgReturn(rc == VINF_SUCCESS || rc == VERR_NOT_AVAILABLE, ("%Rrc\n", rc), rc);
    17441745
     
    18011802            Log7Func(("Send Rx pkt to guest...\n"));
    18021803            STAM_PROFILE_START(&pThis->StatReceiveStore, a);
    1803             virtioCoreR3QueuePut(pDevIns, &pThis->Virtio, pRxQueue->idx,
     1804            virtioCoreR3VirtqPut(pDevIns, &pThis->Virtio, pRxVirtq->idx,
    18041805                                 pVirtSegBufToGuest, pDescChain, true /* fFence */);
    18051806            STAM_PROFILE_STOP(&pThis->StatReceiveStore, a);
     
    18251826                  rc);
    18261827
    1827     virtioCoreQueueSync(pDevIns, &pThis->Virtio, pRxQueue->idx);
     1828    virtioCoreVirtqSync(pDevIns, &pThis->Virtio, pRxVirtq->idx);
    18281829
    18291830    return VINF_SUCCESS;
     
    18431844 * @param   cb              Number of bytes available in the buffer.
    18441845 * @param   pGso            Pointer to Global Segmentation Offload structure
    1845  * @param   idxRxQueue      Rx queue to work with
     1846 * @param   idxRxVirtq      Rx queue to work with
    18461847 * @thread  RX
    18471848 */
    18481849static int virtioNetR3HandleRxPacket(PPDMDEVINS pDevIns, PVIRTIONET pThis, PVIRTIONETCC pThisCC,
    1849                                 const void *pvBuf, size_t cb, PCPDMNETWORKGSO pGso, PVIRTIONETQUEUE pRxQueue)
     1850                                const void *pvBuf, size_t cb, PCPDMNETWORKGSO pGso, PVIRTIONETVIRTQ pRxVirtq)
    18501851{
    18511852    RT_NOREF(pThisCC);
     
    18981899
    18991900    int rc = virtioNetR3CopyRxPktToGuest(pDevIns, pThis, pvBuf, cb, &rxPktHdr, cSegsAllocated,
    1900                                         pVirtSegBufToGuest, paVirtSegsToGuest, pRxQueue);
     1901                                        pVirtSegBufToGuest, paVirtSegsToGuest, pRxVirtq);
    19011902
    19021903    RTMemFree(paVirtSegsToGuest);
     
    19601961              selection algorithm feasible or even necessary to prevent starvation? */
    19611962
    1962     for (int idxQueuePair = 0; idxQueuePair < pThis->cVirtqPairs; idxQueuePair++)
    1963     {
    1964 
    1965         PVIRTIONETQUEUE pRxQueue = &pThis->aQueues[RXQIDX(idxQueuePair)];
    1966         if (RT_SUCCESS(!virtioNetR3CheckRxBufsAvail(pDevIns, pThis, pRxQueue)))
     1963    for (int idxVirtqPair = 0; idxVirtqPair < pThis->cVirtqPairs; idxVirtqPair++)
     1964    {
     1965
     1966        PVIRTIONETVIRTQ pRxVirtq = &pThis->aVirtqs[RXQIDX(idxVirtqPair)];
     1967        if (RT_SUCCESS(!virtioNetR3CheckRxBufsAvail(pDevIns, pThis, pRxVirtq)))
    19671968        {
    19681969            /* Drop packets if VM is not running or cable is disconnected. */
     
    19761977            if (virtioNetR3AddressFilter(pThis, pvBuf, cb))
    19771978            {
    1978                 rc = virtioNetR3HandleRxPacket(pDevIns, pThis, pThisCC, pvBuf, cb, pGso, pRxQueue);
     1979                rc = virtioNetR3HandleRxPacket(pDevIns, pThis, pThisCC, pvBuf, cb, pGso, pRxVirtq);
    19791980                STAM_REL_COUNTER_ADD(&pThis->StatReceiveBytes, cb);
    19801981            }
     
    22822283    RTSgBufInit(pReturnSegBuf, paReturnSegs, cSegs);
    22832284
    2284     virtioCoreR3QueuePut(pDevIns, &pThis->Virtio, CTRLQIDX, pReturnSegBuf, pDescChain, true /* fFence */);
    2285     virtioCoreQueueSync(pDevIns, &pThis->Virtio, CTRLQIDX);
     2285    virtioCoreR3VirtqPut(pDevIns, &pThis->Virtio, CTRLQIDX, pReturnSegBuf, pDescChain, true /* fFence */);
     2286    virtioCoreVirtqSync(pDevIns, &pThis->Virtio, CTRLQIDX);
    22862287
    22872288    for (int i = 0; i < cSegs; i++)
     
    23942395
    23952396static void virtioNetR3TransmitPendingPackets(PPDMDEVINS pDevIns, PVIRTIONET pThis, PVIRTIONETCC pThisCC,
    2396                                          PVIRTIONETQUEUE pTxQueue, bool fOnWorkerThread)
     2397                                         PVIRTIONETVIRTQ pTxVirtq, bool fOnWorkerThread)
    23972398{
    23982399
     
    24322433    }
    24332434
    2434     int cPkts = virtioCoreQueueAvailCount(pVirtio->pDevInsR3, pVirtio, pTxQueue->idx);
     2435    int cPkts = virtioCoreVirtqAvailCount(pVirtio->pDevInsR3, pVirtio, pTxVirtq->idx);
    24352436    if (!cPkts)
    24362437    {
    2437         LogFunc(("%s No packets to send found on %s\n", pThis->szInst, pTxQueue->szName));
     2438        LogFunc(("%s No packets to send found on %s\n", pThis->szInst, pTxVirtq->szName));
    24382439
    24392440        if (pDrv)
     
    24492450    int rc;
    24502451    PVIRTIO_DESC_CHAIN_T pDescChain = NULL;
    2451     while ((rc = virtioCoreR3QueuePeek(pVirtio->pDevInsR3, pVirtio, pTxQueue->idx, &pDescChain)) == VINF_SUCCESS)
    2452     {
    2453         Log10Func(("%s fetched descriptor chain from %s\n", pThis->szInst, pTxQueue->szName));
     2452    while ((rc = virtioCoreR3VirtqPeek(pVirtio->pDevInsR3, pVirtio, pTxVirtq->idx, &pDescChain)) == VINF_SUCCESS)
     2453    {
     2454        Log10Func(("%s fetched descriptor chain from %s\n", pThis->szInst, pTxVirtq->szName));
    24542455
    24552456        PVIRTIOSGBUF pSgPhysSend = pDescChain->pSgPhysSend;
     
    25352536
    25362537            /* Remove this descriptor chain from the available ring */
    2537             virtioCoreR3QueueSkip(pVirtio, pTxQueue->idx);
     2538            virtioCoreR3VirtqSkip(pVirtio, pTxVirtq->idx);
    25382539
    25392540            /* No data to return to guest, but call is needed put elem (e.g. desc chain) on used ring */
    2540             virtioCoreR3QueuePut(pVirtio->pDevInsR3, pVirtio, pTxQueue->idx, NULL, pDescChain, true /* fFence */);
     2541            virtioCoreR3VirtqPut(pVirtio->pDevInsR3, pVirtio, pTxVirtq->idx, NULL, pDescChain, true /* fFence */);
    25412542
    25422543            /* Update used ring idx and notify guest that we've transmitted the data it sent */
    2543             virtioCoreQueueSync(pVirtio->pDevInsR3, pVirtio, pTxQueue->idx);
     2544            virtioCoreVirtqSync(pVirtio->pDevInsR3, pVirtio, pTxVirtq->idx);
    25442545        }
    25452546
     
    25642565    PPDMDEVINS      pDevIns = pThisCC->pDevIns;
    25652566    PVIRTIONET      pThis   = PDMDEVINS_2_DATA(pThisCC->pDevIns, PVIRTIONET);
    2566     PVIRTIONETQUEUE pTxQueue  = &pThis->aQueues[TXQIDX(0)];
     2567    PVIRTIONETVIRTQ pTxVirtq  = &pThis->aVirtqs[TXQIDX(0)];
    25672568    STAM_COUNTER_INC(&pThis->StatTransmitByNetwork);
    25682569
    25692570    /** @todo If we ever start using more than one Rx/Tx queue pair, is a random queue
    25702571          selection algorithm feasible or even necessary */
    2571     virtioNetR3TransmitPendingPackets(pDevIns, pThis, pThisCC, pTxQueue, true /*fOnWorkerThread*/);
     2572    virtioNetR3TransmitPendingPackets(pDevIns, pThis, pThisCC, pTxVirtq, true /*fOnWorkerThread*/);
    25722573}
    25732574
     
    27452746static int virtioNetR3CreateOneWorkerThread(PPDMDEVINS pDevIns, PVIRTIONET pThis, uint16_t idxWorker,
    27462747                                            PVIRTIONETWORKER pWorker, PVIRTIONETWORKERR3 pWorkerR3,
    2747                                             PVIRTIONETQUEUE pQueue)
     2748                                            PVIRTIONETVIRTQ pVirtq)
    27482749{
    27492750    Log10Func(("%s\n", pThis->szInst));
     2751    RT_NOREF(pThis);
    27502752
    27512753    int rc = PDMDevHlpSUPSemEventCreate(pDevIns, &pWorker->hEvtProcess);
     
    27552757                                   N_("DevVirtioNET: Failed to create SUP event semaphore"));
    27562758
    2757     LogFunc(("creating thread for queue %s\n", pQueue->szName));
     2759    LogFunc(("creating thread for queue %s\n", pVirtq->szName));
    27582760
    27592761    rc = PDMDevHlpThreadCreate(pDevIns, &pWorkerR3->pThread,
    27602762                               (void *)pWorker, virtioNetR3WorkerThread,
    2761                                virtioNetR3WakeupWorker, 0, RTTHREADTYPE_IO, pQueue->szName);
     2763                               virtioNetR3WakeupWorker, 0, RTTHREADTYPE_IO, pVirtq->szName);
    27622764    if (RT_FAILURE(rc))
    27632765        return PDMDevHlpVMSetError(pDevIns, rc, RT_SRC_POS,
    2764                                    N_("Error creating thread for Virtual Queue %s\n"), pQueue->idx);
    2765 
    2766     pWorker->pQueue    = pWorkerR3->pQueue = pQueue;
    2767     pWorker->idx       = pWorkerR3->idx    = idxWorker;
    2768     pQueue->pWorker    = pWorker;
    2769     pQueue->pWorkerR3  = pWorkerR3;
     2766                                   N_("Error creating thread for Virtual Virtq %s\n"), pVirtq->idx);
     2767
     2768    pWorker->pVirtq    = pWorkerR3->pVirtq   = pVirtq;
     2769    pWorker->idx       = pWorkerR3->idx      = idxWorker;
     2770    pVirtq->pWorker    = pWorker;
     2771    pVirtq->pWorkerR3  = pWorkerR3;
    27702772    pWorker->fAssigned = true;
    27712773
    2772     LogFunc(("%s pThread: %p\n", pQueue->szName, pWorkerR3->pThread));
     2774    LogFunc(("%s pThread: %p\n", pVirtq->szName, pWorkerR3->pThread));
    27732775
    27742776    return rc;
     
    27822784    Log10Func(("%s\n", pThis->szInst));
    27832785
    2784     PVIRTIONETQUEUE pCtlQueue = &pThis->aQueues[CTRLQIDX];
     2786    PVIRTIONETVIRTQ pCtlVirtq = &pThis->aVirtqs[CTRLQIDX];
    27852787    int rc = virtioNetR3CreateOneWorkerThread(pDevIns, pThis, CTRLQIDX /* idxWorker */,
    2786                                               &pThis->aWorkers[CTRLWIDX], &pThisCC->aWorkers[CTRLWIDX], pCtlQueue);
     2788                                              &pThis->aWorkers[CTRLWIDX], &pThisCC->aWorkers[CTRLWIDX], pCtlVirtq);
    27872789    AssertRCReturn(rc, rc);
    27882790
    2789     pCtlQueue->fHasWorker = true;
     2791    pCtlVirtq->fHasWorker = true;
    27902792
    27912793    uint16_t idxWorker = CTRLWIDX + 1;
    2792     for (uint16_t idxQueuePair = 0; idxQueuePair < pThis->cVirtqPairs; idxQueuePair++, idxWorker++)
    2793     {
    2794         PVIRTIONETQUEUE pTxQueue = &pThis->aQueues[TXQIDX(idxQueuePair)];
    2795         PVIRTIONETQUEUE pRxQueue = &pThis->aQueues[RXQIDX(idxQueuePair)];
     2794    for (uint16_t idxVirtqPair = 0; idxVirtqPair < pThis->cVirtqPairs; idxVirtqPair++, idxWorker++)
     2795    {
     2796        PVIRTIONETVIRTQ pTxVirtq = &pThis->aVirtqs[TXQIDX(idxVirtqPair)];
     2797        PVIRTIONETVIRTQ pRxVirtq = &pThis->aVirtqs[RXQIDX(idxVirtqPair)];
    27962798
    27972799        rc = virtioNetR3CreateOneWorkerThread(pDevIns, pThis, idxWorker, &pThis->aWorkers[idxWorker],
    2798                                               &pThisCC->aWorkers[idxWorker], pTxQueue);
     2800                                              &pThisCC->aWorkers[idxWorker], pTxVirtq);
    27992801        AssertRCReturn(rc, rc);
    28002802
    2801         pTxQueue->fHasWorker = true;
    2802         pRxQueue->fHasWorker = false;
    2803     }
    2804     pThis->cWorkers = pThis->cVirtqPairs + 1;
     2803        pTxVirtq->fHasWorker = true;
     2804        pRxVirtq->fHasWorker = false;
     2805    }
     2806    pThis->cWorkers = pThis->cVirtqPairs + 1 /* Control virtq */;
    28052807    return rc;
    28062808}
     
    28142816    PVIRTIONETCC       pThisCC   = PDMDEVINS_2_DATA_CC(pDevIns, PVIRTIONETCC);
    28152817    PVIRTIONETWORKER   pWorker   = (PVIRTIONETWORKER)pThread->pvUser;
    2816     PVIRTIONETQUEUE    pQueue    = pWorker->pQueue;
     2818    PVIRTIONETVIRTQ    pVirtq    = pWorker->pVirtq;
    28172819
    28182820    if (pThread->enmState == PDMTHREADSTATE_INITIALIZING)
    28192821        return VINF_SUCCESS;
    28202822
    2821     LogFunc(("%s worker thread started for %s\n", pThis->szInst, pQueue->szName));
    2822 
    2823  /** @todo Race w/guest enabling/disabling guest notifications cyclically.
    2824            See BugRef #8651, Comment #82 */
    2825 
    2826     virtioCoreQueueNotifyEnable(&pThis->Virtio, pQueue->idx, true /* fEnable */);
     2823    LogFunc(("%s worker thread started for %s\n", pThis->szInst, pVirtq->szName));
     2824
     2825    /** @todo Race w/guest enabling/disabling guest notifications cyclically.
     2826              See BugRef #8651, Comment #82 */
     2827    virtioCoreVirtqNotifyEnable(&pThis->Virtio, pVirtq->idx, true /* fEnable */);
    28272828
    28282829    while (pThread->enmState == PDMTHREADSTATE_RUNNING)
    28292830    {
    2830         if (IS_VIRTQ_EMPTY(pDevIns, &pThis->Virtio, pQueue->idx))
     2831        if (IS_VIRTQ_EMPTY(pDevIns, &pThis->Virtio, pVirtq->idx))
    28312832        {
    28322833            /* Atomic interlocks avoid missing alarm while going to sleep & notifier waking the awoken */
     
    28352836            if (!fNotificationSent)
    28362837            {
    2837                 Log10Func(("%s %s worker sleeping...\n\n", pThis->szInst, pQueue->szName));
     2838                Log10Func(("%s %s worker sleeping...\n\n", pThis->szInst, pVirtq->szName));
    28382839                Assert(ASMAtomicReadBool(&pWorker->fSleeping));
    28392840                int rc = PDMDevHlpSUPSemEventWaitNoResume(pDevIns, pWorker->hEvtProcess, RT_INDEFINITE_WAIT);
     
    28532854        if (!pThisCC->fQuiescing)
    28542855        {
    2855              if (pQueue->fCtlQueue)
     2856             if (pVirtq->fCtlVirtq)
    28562857             {
    2857                  Log10Func(("%s %s worker woken. Fetching desc chain\n", pThis->szInst, pQueue->szName));
     2858                 Log10Func(("%s %s worker woken. Fetching desc chain\n", pThis->szInst, pVirtq->szName));
    28582859                 PVIRTIO_DESC_CHAIN_T pDescChain = NULL;
    2859                  int rc = virtioCoreR3QueueGet(pDevIns, &pThis->Virtio, pQueue->idx, &pDescChain, true);
     2860                 int rc = virtioCoreR3VirtqGet(pDevIns, &pThis->Virtio, pVirtq->idx, &pDescChain, true);
    28602861                 if (rc == VERR_NOT_AVAILABLE)
    28612862                 {
    2862                     Log10Func(("%s %s worker woken. Nothing found in queue/n", pThis->szInst, pQueue->szName));
     2863                    Log10Func(("%s %s worker woken. Nothing found in queue/n", pThis->szInst, pVirtq->szName));
    28632864                    continue;
    28642865                 }
     
    28682869             else /* Must be Tx queue */
    28692870             {
    2870                  Log10Func(("%s %s worker woken. Queue has data to transmit\n",  pThis->szInst, pQueue->szName));
    2871                  virtioNetR3TransmitPendingPackets(pDevIns, pThis, pThisCC, pQueue, false /* fOnWorkerThread */);
     2871                 Log10Func(("%s %s worker woken. Virtq has data to transmit\n",  pThis->szInst, pVirtq->szName));
     2872                 virtioNetR3TransmitPendingPackets(pDevIns, pThis, pThisCC, pVirtq, false /* fOnWorkerThread */);
    28722873             }
    28732874
    28742875             /* Rx queues aren't handled by our worker threads. Instead, the PDM network
    28752876              * leaf driver invokes PDMINETWORKDOWN.pfnWaitReceiveAvail() callback,
    2876               * which waits until notified directly by virtioNetQueueNotified()
     2877              * which waits until notified directly by virtioNetVirtqNotified()
    28772878              * that guest IN buffers have been added to receive virt queue.
    28782879              */
    28792880        }
    28802881    }
    2881     Log10(("%s %s worker thread exiting\n", pThis->szInst, pQueue->szName));
     2882    Log10(("%s %s worker thread exiting\n", pThis->szInst, pVirtq->szName));
    28822883    return VINF_SUCCESS;
    28832884}
     
    28982899                 pThis->szInst));
    28992900
    2900         pThis->fNegotiatedFeatures = virtioCoreGetAcceptedFeatures(pVirtio);
     2901        pThis->fNegotiatedFeatures = virtioCoreGetNegotiatedFeatures(pVirtio);
    29012902
    29022903#ifdef LOG_ENABLED
     
    29102911        pThisCC->fQuiescing = false;
    29112912
    2912         for (unsigned idxQueue = 0; idxQueue < pThis->cVirtQueues; idxQueue++)
     2913        for (unsigned idxVirtq = 0; idxVirtq < pThis->cVirtVirtqs; idxVirtq++)
    29132914        {
    2914             PVIRTIONETQUEUE pQueue = &pThis->aQueues[idxQueue];
    2915             pQueue->idx = idxQueue;
    2916             (void) virtioCoreR3QueueAttach(&pThis->Virtio, pQueue->idx, pQueue->szName);
    2917             pQueue->fAttachedToVirtioCore = true;
    2918             if (IS_VIRTQ_EMPTY(pThisCC->pDevIns, &pThis->Virtio, pQueue->idx))
    2919                 virtioCoreQueueNotifyEnable(&pThis->Virtio, pQueue->idx, true /* fEnable */);
     2915            PVIRTIONETVIRTQ pVirtq = &pThis->aVirtqs[idxVirtq];
     2916            pVirtq->idx = idxVirtq;
     2917            (void) virtioCoreR3VirtqAttach(&pThis->Virtio, pVirtq->idx, pVirtq->szName);
     2918            pVirtq->fAttachedToVirtioCore = true;
     2919            if (IS_VIRTQ_EMPTY(pThisCC->pDevIns, &pThis->Virtio, pVirtq->idx))
     2920                virtioCoreVirtqNotifyEnable(&pThis->Virtio, pVirtq->idx, true /* fEnable */);
    29202921        }
    29212922    }
     
    29432944        pThisCC->pDrv->pfnSetPromiscuousMode(pThisCC->pDrv, true);
    29442945
    2945         for (uint16_t idxQueue = 0; idxQueue < pThis->cVirtQueues; idxQueue++)
    2946             pThis->aQueues[idxQueue].fAttachedToVirtioCore = false;
     2946        for (uint16_t idxVirtq = 0; idxVirtq < pThis->cVirtVirtqs; idxVirtq++)
     2947            pThis->aVirtqs[idxVirtq].fAttachedToVirtioCore = false;
    29472948    }
    29482949}
     
    31533154
    31543155    /* Initialize the generic Virtio core: */
    3155     pThisCC->Virtio.pfnQueueNotified        = virtioNetQueueNotified;
     3156    pThisCC->Virtio.pfnVirtqNotified        = virtioNetVirtqNotified;
    31563157    pThisCC->Virtio.pfnStatusChanged        = virtioNetR3StatusChanged;
    31573158    pThisCC->Virtio.pfnDevCapRead           = virtioNetR3DevCapRead;
     
    31923193                         ? pThis->virtioNetConfig.uMaxVirtqPairs  :  1;
    31933194
    3194     pThis->cVirtQueues += pThis->cVirtqPairs * 2 + 1;
     3195    pThis->cVirtVirtqs += pThis->cVirtqPairs * 2 + 1;
    31953196
    31963197    /* Create Link Up Timer */
     
    32023203     */
    32033204    virtioNetR3SetVirtqNames(pThis);
    3204     pThis->aQueues[CTRLQIDX].fCtlQueue = true;
     3205    pThis->aVirtqs[CTRLQIDX].fCtlVirtq = true;
    32053206
    32063207    /*
     
    32903291    PVIRTIONET   pThis   = PDMDEVINS_2_DATA(pDevIns, PVIRTIONET);
    32913292    PVIRTIONETCC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PVIRTIONETCC);
    3292     pThisCC->Virtio.pfnQueueNotified = virtioNetQueueNotified;
     3293    pThisCC->Virtio.pfnVirtqNotified = virtioNetVirtqNotified;
    32933294    return virtioCoreRZInit(pDevIns, &pThis->Virtio);
    32943295}
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