Changeset 100371 in vbox for trunk/src/VBox/Devices
- Timestamp:
- Jul 5, 2023 7:47:33 AM (21 months ago)
- svn:sync-xref-src-repo-rev:
- 158108
- Location:
- trunk/src/VBox/Devices
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Network/DevVirtioNet.cpp
r99889 r100371 2007 2007 { 2008 2008 cbHdrEnqueued = cbPktHdr; 2009 #ifdef VIRTIO_VBUF_ON_STACK2010 2009 int rc = virtioCoreR3VirtqAvailBufGet(pDevIns, &pThis->Virtio, pRxVirtq->uIdx, pVirtqBuf, true); 2011 #else /* !VIRTIO_VBUF_ON_STACK */2012 virtioCoreR3VirtqBufRelease(&pThis->Virtio, pVirtqBuf);2013 int rc = virtioCoreR3VirtqAvailBufGet(pDevIns, &pThis->Virtio, pRxVirtq->uIdx, &pVirtqBuf, true);2014 #endif /* !VIRTIO_VBUF_ON_STACK */2015 2016 2010 AssertMsgReturn(rc == VINF_SUCCESS || rc == VERR_NOT_AVAILABLE, ("%Rrc\n", rc), rc); 2017 2018 #ifdef VIRTIO_VBUF_ON_STACK2019 2011 AssertMsgReturn(rc == VINF_SUCCESS && pVirtqBuf->cbPhysReturn, 2020 2012 ("Not enough Rx buffers in queue to accomodate ethernet packet\n"), 2021 2013 VERR_INTERNAL_ERROR); 2022 #else /* !VIRTIO_VBUF_ON_STACK */2023 AssertMsgReturnStmt(rc == VINF_SUCCESS && pVirtqBuf->cbPhysReturn,2024 ("Not enough Rx buffers in queue to accomodate ethernet packet\n"),2025 virtioCoreR3VirtqBufRelease(&pThis->Virtio, pVirtqBuf),2026 VERR_INTERNAL_ERROR);2027 #endif /* !VIRTIO_VBUF_ON_STACK */2028 2014 cbBufRemaining = pVirtqBuf->cbPhysReturn; 2029 2015 } … … 2034 2020 AssertMsgRCReturn(rc, ("Failure updating descriptor count in pkt hdr in guest physical memory\n"), rc); 2035 2021 2036 #ifndef VIRTIO_VBUF_ON_STACK2037 virtioCoreR3VirtqBufRelease(&pThis->Virtio, pVirtqBuf);2038 #endif /* !VIRTIO_VBUF_ON_STACK */2039 2022 virtioCoreVirtqUsedRingSync(pDevIns, &pThis->Virtio, pRxVirtq->uIdx); 2040 2023 Log7(("\n")); … … 2062 2045 { 2063 2046 RT_NOREF(pThisCC); 2064 #ifdef VIRTIO_VBUF_ON_STACK2065 2047 VIRTQBUF_T VirtqBuf; 2066 2048 … … 2070 2052 PVIRTQBUF pVirtqBuf = &VirtqBuf; 2071 2053 int rc = virtioCoreR3VirtqAvailBufGet(pDevIns, &pThis->Virtio, pRxVirtq->uIdx, pVirtqBuf, true); 2072 #else /* !VIRTIO_VBUF_ON_STACK */2073 PVIRTQBUF pVirtqBuf;2074 int rc = virtioCoreR3VirtqAvailBufGet(pDevIns, &pThis->Virtio, pRxVirtq->uIdx, &pVirtqBuf, true);2075 #endif /* !VIRTIO_VBUF_ON_STACK */2076 2077 2054 AssertMsgReturn(rc == VINF_SUCCESS || rc == VERR_NOT_AVAILABLE, ("%Rrc\n", rc), rc); 2078 2079 #ifdef VIRTIO_VBUF_ON_STACK2080 2055 AssertMsgReturn(rc == VINF_SUCCESS && pVirtqBuf->cbPhysReturn, 2081 2056 ("Not enough Rx buffers or capacity to accommodate ethernet packet\n"), 2082 2057 VERR_INTERNAL_ERROR); 2083 #else /* !VIRTIO_VBUF_ON_STACK */ 2084 AssertMsgReturnStmt(rc == VINF_SUCCESS && pVirtqBuf->cbPhysReturn, 2085 ("Not enough Rx buffers or capacity to accommodate ethernet packet\n"), 2086 virtioCoreR3VirtqBufRelease(&pThis->Virtio, pVirtqBuf), 2087 VERR_INTERNAL_ERROR); 2088 #endif /* !VIRTIO_VBUF_ON_STACK */ 2058 2089 2059 /* 2090 2060 * Try to do fast (e.g. single-buffer) copy to guest, even if MRG_RXBUF feature is enabled … … 2099 2069 if (rc == VINF_SUCCESS) 2100 2070 rc = virtioCoreR3VirtqUsedBufPut(pDevIns, &pThis->Virtio, pRxVirtq->uIdx, cb, pvBuf, pVirtqBuf, cbPktHdr + cb /* cbEnqueue */); 2101 #ifndef VIRTIO_VBUF_ON_STACK2102 virtioCoreR3VirtqBufRelease(&pThis->Virtio, pVirtqBuf);2103 #endif /* !VIRTIO_VBUF_ON_STACK */2104 2071 virtioCoreVirtqUsedRingSync(pDevIns, &pThis->Virtio, pRxVirtq->uIdx); 2105 2072 AssertMsgReturn(rc == VINF_SUCCESS, ("%Rrc\n", rc), rc); … … 2772 2739 2773 2740 int rc; 2774 #ifdef VIRTIO_VBUF_ON_STACK2775 2741 VIRTQBUF_T VirtqBuf; 2776 2742 … … 2780 2746 PVIRTQBUF pVirtqBuf = &VirtqBuf; 2781 2747 while ((rc = virtioCoreR3VirtqAvailBufPeek(pVirtio->pDevInsR3, pVirtio, pTxVirtq->uIdx, pVirtqBuf)) == VINF_SUCCESS) 2782 #else /* !VIRTIO_VBUF_ON_STACK */2783 PVIRTQBUF pVirtqBuf = NULL;2784 while ((rc = virtioCoreR3VirtqAvailBufPeek(pVirtio->pDevInsR3, pVirtio, pTxVirtq->uIdx, &pVirtqBuf)) == VINF_SUCCESS)2785 #endif /* !VIRTIO_VBUF_ON_STACK */2786 2748 { 2787 2749 Log10Func(("[%s] fetched descriptor chain from %s\n", pThis->szInst, pTxVirtq->szName)); … … 2796 2758 VERR_INTERNAL_ERROR); 2797 2759 2798 #ifdef VIRTIO_VBUF_ON_STACK2799 2760 VIRTIONETPKTHDR PktHdr; 2800 2761 PVIRTIONETPKTHDR pPktHdr = &PktHdr; 2801 #else /* !VIRTIO_VBUF_ON_STACK */2802 PVIRTIONETPKTHDR pPktHdr = (PVIRTIONETPKTHDR)RTMemAllocZ(pThis->cbPktHdr);2803 AssertMsgReturn(pPktHdr, ("Out of Memory\n"), VERR_NO_MEMORY);2804 #endif /* !VIRTIO_VBUF_ON_STACK */2805 2762 2806 2763 /* Compute total frame size from guest (including virtio-net pkt hdr) */ … … 2877 2834 Log4Func(("Failed to allocate S/G buffer: frame size=%u rc=%Rrc\n", uFrameSize, rc)); 2878 2835 /* Stop trying to fetch TX descriptors until we get more bandwidth. */ 2879 #ifndef VIRTIO_VBUF_ON_STACK2880 virtioCoreR3VirtqBufRelease(pVirtio, pVirtqBuf);2881 #endif /* !VIRTIO_VBUF_ON_STACK */2882 2836 break; 2883 2837 } … … 2890 2844 } 2891 2845 2892 #ifndef VIRTIO_VBUF_ON_STACK2893 virtioCoreR3VirtqBufRelease(pVirtio, pVirtqBuf);2894 pVirtqBuf = NULL;2895 #endif /* !VIRTIO_VBUF_ON_STACK */2896 2846 /* Before we break the loop we need to check if the queue is empty, 2897 2847 * re-enable notifications, and then re-check again to avoid missing … … 3182 3132 { 3183 3133 Log10Func(("[%s] %s worker woken. Fetching desc chain\n", pThis->szInst, pVirtq->szName)); 3184 #ifdef VIRTIO_VBUF_ON_STACK3185 3134 VIRTQBUF_T VirtqBuf; 3186 3135 PVIRTQBUF pVirtqBuf = &VirtqBuf; 3187 3136 int rc = virtioCoreR3VirtqAvailBufGet(pDevIns, &pThis->Virtio, pVirtq->uIdx, pVirtqBuf, true); 3188 #else /* !VIRTIO_VBUF_ON_STACK */3189 PVIRTQBUF pVirtqBuf = NULL;3190 int rc = virtioCoreR3VirtqAvailBufGet(pDevIns, &pThis->Virtio, pVirtq->uIdx, &pVirtqBuf, true);3191 #endif /* !VIRTIO_VBUF_ON_STACK */3192 3137 if (rc == VERR_NOT_AVAILABLE) 3193 3138 { … … 3196 3141 } 3197 3142 virtioNetR3Ctrl(pDevIns, pThis, pThisCC, pVirtqBuf); 3198 #ifndef VIRTIO_VBUF_ON_STACK3199 virtioCoreR3VirtqBufRelease(&pThis->Virtio, pVirtqBuf);3200 #endif /* !VIRTIO_VBUF_ON_STACK */3201 3143 } 3202 3144 else /* Must be Tx queue */ -
trunk/src/VBox/Devices/Storage/DevVirtioSCSI.cpp
r99739 r100371 1648 1648 for (int i = 0; i < pWorkerR3->cRedoDescs; i++) 1649 1649 { 1650 #ifdef VIRTIO_VBUF_ON_STACK1651 1650 PVIRTQBUF pVirtqBuf = virtioCoreR3VirtqBufAlloc(); 1652 1651 if (!pVirtqBuf) … … 1657 1656 int rc = virtioCoreR3VirtqAvailBufGet(pDevIns, &pThis->Virtio, uVirtqNbr, 1658 1657 pWorkerR3->auRedoDescs[i], pVirtqBuf); 1659 #else /* !VIRTIO_VBUF_ON_STACK */ 1660 PVIRTQBUF pVirtqBuf; 1661 int rc = virtioCoreR3VirtqAvailBufGet(pDevIns, &pThis->Virtio, uVirtqNbr, 1662 pWorkerR3->auRedoDescs[i], &pVirtqBuf); 1663 #endif /* !VIRTIO_VBUF_ON_STACK */ 1664 if (RT_FAILURE(rc)) 1665 LogRel(("Error fetching desc chain to redo, %Rrc", rc)); 1666 1667 rc = virtioScsiR3ReqSubmit(pDevIns, pThis, pThisCC, uVirtqNbr, pVirtqBuf); 1668 if (RT_FAILURE(rc)) 1669 LogRel(("Error submitting req packet, resetting %Rrc", rc)); 1658 if (RT_FAILURE(rc)) 1659 LogRel(("Error fetching desc chain to redo, %Rrc", rc)); 1660 1661 rc = virtioScsiR3ReqSubmit(pDevIns, pThis, pThisCC, uVirtqNbr, pVirtqBuf); 1662 if (RT_FAILURE(rc)) 1663 LogRel(("Error submitting req packet, resetting %Rrc", rc)); 1670 1664 1671 1665 virtioCoreR3VirtqBufRelease(&pThis->Virtio, pVirtqBuf); … … 1674 1668 1675 1669 Log6Func(("fetching next descriptor chain from %s\n", VIRTQNAME(uVirtqNbr))); 1676 #ifdef VIRTIO_VBUF_ON_STACK1677 1670 PVIRTQBUF pVirtqBuf = virtioCoreR3VirtqBufAlloc(); 1678 1671 if (!pVirtqBuf) … … 1680 1673 else 1681 1674 { 1682 int rc = virtioCoreR3VirtqAvailBufGet(pDevIns, &pThis->Virtio, uVirtqNbr, pVirtqBuf, true); 1683 #else /* !VIRTIO_VBUF_ON_STACK */ 1684 PVIRTQBUF pVirtqBuf = NULL; 1685 int rc = virtioCoreR3VirtqAvailBufGet(pDevIns, &pThis->Virtio, uVirtqNbr, &pVirtqBuf, true); 1686 #endif /* !VIRTIO_VBUF_ON_STACK */ 1687 if (rc == VERR_NOT_AVAILABLE) 1688 { 1689 Log6Func(("Nothing found in %s\n", VIRTQNAME(uVirtqNbr))); 1690 virtioCoreR3VirtqBufRelease(&pThis->Virtio, pVirtqBuf); 1691 continue; 1692 } 1693 1694 AssertRC(rc); 1695 if (uVirtqNbr == CONTROLQ_IDX) 1696 virtioScsiR3Ctrl(pDevIns, pThis, pThisCC, uVirtqNbr, pVirtqBuf); 1697 else /* request queue index */ 1698 { 1699 rc = virtioScsiR3ReqSubmit(pDevIns, pThis, pThisCC, uVirtqNbr, pVirtqBuf); 1700 if (RT_FAILURE(rc)) 1701 LogRel(("Error submitting req packet, resetting %Rrc", rc)); 1702 } 1703 1704 virtioCoreR3VirtqBufRelease(&pThis->Virtio, pVirtqBuf); 1705 #ifdef VIRTIO_VBUF_ON_STACK 1675 int rc = virtioCoreR3VirtqAvailBufGet(pDevIns, &pThis->Virtio, uVirtqNbr, pVirtqBuf, true); 1676 if (rc == VERR_NOT_AVAILABLE) 1677 { 1678 Log6Func(("Nothing found in %s\n", VIRTQNAME(uVirtqNbr))); 1679 virtioCoreR3VirtqBufRelease(&pThis->Virtio, pVirtqBuf); 1680 continue; 1681 } 1682 1683 AssertRC(rc); 1684 if (uVirtqNbr == CONTROLQ_IDX) 1685 virtioScsiR3Ctrl(pDevIns, pThis, pThisCC, uVirtqNbr, pVirtqBuf); 1686 else /* request queue index */ 1687 { 1688 rc = virtioScsiR3ReqSubmit(pDevIns, pThis, pThisCC, uVirtqNbr, pVirtqBuf); 1689 if (RT_FAILURE(rc)) 1690 LogRel(("Error submitting req packet, resetting %Rrc", rc)); 1691 } 1692 1693 virtioCoreR3VirtqBufRelease(&pThis->Virtio, pVirtqBuf); 1706 1694 } 1707 #endif /* VIRTIO_VBUF_ON_STACK */1708 1695 } 1709 1696 } -
trunk/src/VBox/Devices/VirtIO/VirtioCore.cpp
r99775 r100371 635 635 uint16_t uUsedIdxShadow = pVirtq->uUsedIdxShadow; 636 636 637 #ifdef VIRTIO_VBUF_ON_STACK638 637 VIRTQBUF_T VirtqBuf; 639 638 PVIRTQBUF pVirtqBuf = &VirtqBuf; 640 #else /* !VIRTIO_VBUF_ON_STACK */641 PVIRTQBUF pVirtqBuf = NULL;642 #endif /* !VIRTIO_VBUF_ON_STACK */643 644 639 bool fEmpty = IS_VIRTQ_EMPTY(pDevIns, pVirtio, pVirtq); 645 640 … … 649 644 if (!fEmpty) 650 645 { 651 #ifdef VIRTIO_VBUF_ON_STACK652 646 virtioCoreR3VirtqAvailBufPeek(pDevIns, pVirtio, uVirtq, pVirtqBuf); 653 #else /* !VIRTIO_VBUF_ON_STACK */654 virtioCoreR3VirtqAvailBufPeek(pDevIns, pVirtio, uVirtq, &pVirtqBuf);655 #endif /* !VIRTIO_VBUF_ON_STACK */656 647 cSendSegs = pVirtqBuf->pSgPhysSend ? pVirtqBuf->pSgPhysSend->cSegs : 0; 657 648 cReturnSegs = pVirtqBuf->pSgPhysReturn ? pVirtqBuf->pSgPhysReturn->cSegs : 0; … … 704 695 } 705 696 706 #ifdef VIRTIO_VBUF_ON_STACK 697 707 698 /** API Function: See header file */ 708 699 PVIRTQBUF virtioCoreR3VirtqBufAlloc(void) … … 714 705 return pVirtqBuf; 715 706 } 716 #endif /* VIRTIO_VBUF_ON_STACK */ 707 717 708 718 709 /** API Function: See header file */ … … 788 779 789 780 /** API function: See Header file */ 790 #ifdef VIRTIO_VBUF_ON_STACK791 781 int virtioCoreR3VirtqAvailBufPeek(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t uVirtq, PVIRTQBUF pVirtqBuf) 792 782 { 793 783 return virtioCoreR3VirtqAvailBufGet(pDevIns, pVirtio, uVirtq, pVirtqBuf, false); 794 784 } 795 #else /* !VIRTIO_VBUF_ON_STACK */ 796 int virtioCoreR3VirtqAvailBufPeek(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t uVirtq, 797 PPVIRTQBUF ppVirtqBuf) 798 { 799 return virtioCoreR3VirtqAvailBufGet(pDevIns, pVirtio, uVirtq, ppVirtqBuf, false); 800 } 801 #endif /* !VIRTIO_VBUF_ON_STACK */ 785 802 786 803 787 /** API function: See Header file */ … … 821 805 822 806 /** API Function: See header file */ 823 #ifdef VIRTIO_VBUF_ON_STACK824 807 int virtioCoreR3VirtqAvailBufGet(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t uVirtq, 825 808 uint16_t uHeadIdx, PVIRTQBUF pVirtqBuf) 826 #else /* !VIRTIO_VBUF_ON_STACK */ 827 int virtioCoreR3VirtqAvailBufGet(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t uVirtq, 828 uint16_t uHeadIdx, PPVIRTQBUF ppVirtqBuf) 829 #endif /* !VIRTIO_VBUF_ON_STACK */ 830 { 831 #ifndef VIRTIO_VBUF_ON_STACK 832 AssertReturn(ppVirtqBuf, VERR_INVALID_POINTER); 833 *ppVirtqBuf = NULL; 834 #endif /* !VIRTIO_VBUF_ON_STACK */ 835 809 { 836 810 AssertMsgReturn(uVirtq < RT_ELEMENTS(pVirtio->aVirtqueues), 837 811 ("uVirtq out of range"), VERR_INVALID_PARAMETER); … … 850 824 * Allocate and initialize the descriptor chain structure. 851 825 */ 852 #ifndef VIRTIO_VBUF_ON_STACK853 PVIRTQBUF pVirtqBuf = (PVIRTQBUF)RTMemAllocZ(sizeof(VIRTQBUF_T));854 AssertReturn(pVirtqBuf, VERR_NO_MEMORY);855 #endif /* !VIRTIO_VBUF_ON_STACK */856 826 pVirtqBuf->u32Magic = VIRTQBUF_MAGIC; 857 827 pVirtqBuf->cRefs = 1; 858 828 pVirtqBuf->uHeadIdx = uHeadIdx; 859 829 pVirtqBuf->uVirtq = uVirtq; 860 #ifndef VIRTIO_VBUF_ON_STACK861 *ppVirtqBuf = pVirtqBuf;862 #endif /* !VIRTIO_VBUF_ON_STACK */863 830 864 831 /* … … 958 925 959 926 /** API function: See Header file */ 960 #ifdef VIRTIO_VBUF_ON_STACK961 927 int virtioCoreR3VirtqAvailBufGet(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t uVirtq, 962 928 PVIRTQBUF pVirtqBuf, bool fRemove) 963 #else /* !VIRTIO_VBUF_ON_STACK */964 int virtioCoreR3VirtqAvailBufGet(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t uVirtq,965 PPVIRTQBUF ppVirtqBuf, bool fRemove)966 #endif /* !VIRTIO_VBUF_ON_STACK */967 929 { 968 930 Assert(uVirtq < RT_ELEMENTS(pVirtio->aVirtqueues)); … … 980 942 pVirtq->uAvailIdxShadow++; 981 943 982 #ifdef VIRTIO_VBUF_ON_STACK 983 int rc = virtioCoreR3VirtqAvailBufGet(pDevIns, pVirtio, uVirtq, uHeadIdx, pVirtqBuf); 984 #else /* !VIRTIO_VBUF_ON_STACK */ 985 int rc = virtioCoreR3VirtqAvailBufGet(pDevIns, pVirtio, uVirtq, uHeadIdx, ppVirtqBuf); 986 #endif /* !VIRTIO_VBUF_ON_STACK */ 987 return rc; 944 return virtioCoreR3VirtqAvailBufGet(pDevIns, pVirtio, uVirtq, uHeadIdx, pVirtqBuf); 988 945 } 989 946 -
trunk/src/VBox/Devices/VirtIO/VirtioCore.h
r99739 r100371 32 32 # pragma once 33 33 #endif 34 35 /* Do not allocate VIRTQBUF from the heap when possible */36 #define VIRTIO_VBUF_ON_STACK 137 34 38 35 #include <iprt/ctype.h> … … 698 695 uint16_t virtioCoreVirtqAvailBufCount(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t uVirtqNbr); 699 696 700 #ifdef VIRTIO_VBUF_ON_STACK701 697 /** 702 698 * This function is identical to virtioCoreR3VirtqAvailBufGet(), *except* it doesn't consume … … 767 763 int virtioCoreR3VirtqAvailBufGet(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t uVirtqNbr, 768 764 uint16_t uHeadIdx, PVIRTQBUF pVirtqBuf); 769 #else /* !VIRTIO_VBUF_ON_STACK */770 /**771 * This function is identical to virtioCoreR3VirtqAvailBufGet(), *except* it doesn't consume772 * peeked buffer from avail ring of the virtq. The function *becomes* identical to the773 * virtioCoreR3VirtqAvailBufGet() only if virtioCoreR3VirtqAvailRingNext() is invoked to774 * consume buf from the queue's avail ring, followed by invocation of virtioCoreR3VirtqUsedBufPut(),775 * to hand host-processed buffer back to guest, which completes guest-initiated virtq buffer circuit.776 *777 * @param pDevIns The device instance.778 * @param pVirtio Pointer to the shared virtio state.779 * @param uVirtqNbr Virtq number780 * @param ppVirtqBuf Address to store pointer to descriptor chain that contains the781 * pre-processed transaction information pulled from the virtq.782 *783 * @returns VBox status code:784 * @retval VINF_SUCCESS Success785 * @retval VERR_INVALID_STATE VirtIO not in ready state (asserted).786 * @retval VERR_NOT_AVAILABLE If the queue is empty.787 */788 int virtioCoreR3VirtqAvailBufPeek(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t uVirtqNbr,789 PPVIRTQBUF ppVirtqBuf);790 791 /**792 * This function fetches the next buffer (descriptor chain) from the VirtIO "avail" ring of793 * indicated queue, separating the buf's s/g vectors into OUT (e.g. guest-to-host)794 * components and and IN (host-to-guest) components.795 *796 * Caller is responsible for GCPhys to host virtual memory conversions. If the797 * virtq buffer being peeked at is "consumed", virtioCoreR3VirtqAvailRingNext() must798 * be called, and after that virtioCoreR3VirtqUsedBufPut() must be called to799 * complete the buffer transfer cycle with the guest.800 *801 * @param pDevIns The device instance.802 * @param pVirtio Pointer to the shared virtio state.803 * @param uVirtqNbr Virtq number804 * @param ppVirtqBuf Address to store pointer to descriptor chain that contains the805 * pre-processed transaction information pulled from the virtq.806 * Returned reference must be released by calling807 * virtioCoreR3VirtqBufRelease().808 * @param fRemove flags whether to remove desc chain from queue (false = peek)809 *810 * @returns VBox status code:811 * @retval VINF_SUCCESS Success812 * @retval VERR_INVALID_STATE VirtIO not in ready state (asserted).813 * @retval VERR_NOT_AVAILABLE If the queue is empty.814 */815 int virtioCoreR3VirtqAvailBufGet(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t uVirtqNbr,816 PPVIRTQBUF ppVirtqBuf, bool fRemove);817 818 /**819 * Fetches a specific descriptor chain using avail ring of indicated queue and converts the820 * descriptor chain into its OUT (to device) and IN (to guest) components.821 *822 * The caller is responsible for GCPhys to host virtual memory conversions and *must*823 * return the virtq buffer using virtioCoreR3VirtqUsedBufPut() to complete the roundtrip824 * virtq transaction.825 * *826 * @param pDevIns The device instance.827 * @param pVirtio Pointer to the shared virtio state.828 * @param uVirtqNbr Virtq number829 * @param ppVirtqBuf Address to store pointer to descriptor chain that contains the830 * pre-processed transaction information pulled from the virtq.831 * Returned reference must be released by calling832 * virtioCoreR3VirtqBufRelease().833 * @param fRemove flags whether to remove desc chain from queue (false = peek)834 *835 * @returns VBox status code:836 * @retval VINF_SUCCESS Success837 * @retval VERR_INVALID_STATE VirtIO not in ready state (asserted).838 * @retval VERR_NOT_AVAILABLE If the queue is empty.839 */840 int virtioCoreR3VirtqAvailBufGet(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t uVirtqNbr,841 uint16_t uHeadIdx, PPVIRTQBUF ppVirtqBuf);842 #endif /* !VIRTIO_VBUF_ON_STACK */843 765 844 766 /** … … 1185 1107 int virtioCoreVirtqUsedRingSync(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t uVirtqNbr); 1186 1108 1187 #ifdef VIRTIO_VBUF_ON_STACK1188 1109 /** 1189 1110 * Allocates a descriptor chain object with the reference count of one. Copying the reference … … 1200 1121 */ 1201 1122 PVIRTQBUF virtioCoreR3VirtqBufAlloc(void); 1202 #endif /* VIRTIO_VBUF_ON_STACK */1203 1123 1204 1124 /**
Note:
See TracChangeset
for help on using the changeset viewer.