Changeset 94969 in vbox for trunk/src/VBox/Devices
- Timestamp:
- May 9, 2022 5:06:17 PM (3 years ago)
- svn:sync-xref-src-repo-rev:
- 151379
- Location:
- trunk/src/VBox/Devices
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Network/DevVirtioNet_1_0.cpp
r93165 r94969 1900 1900 /* Cache address of uNumBuffers field of pkthdr to update ex post facto */ 1901 1901 RTGCPHYS GCPhysNumBuffers = pVirtqBuf->pSgPhysReturn->paSegs[0].GCPhys + RT_UOFFSETOF(VIRTIONETPKTHDR, uNumBuffers); 1902 uint16_t cVirtqBufsUsed = 1;1902 uint16_t cVirtqBufsUsed = 0; 1903 1903 cbBufRemaining -= cbPktHdr; 1904 1904 /* … … 1915 1915 ++cVirtqBufsUsed; 1916 1916 cbBufRemaining -= cbBounded; 1917 uPktOffset -= cbBounded;1917 uPktOffset += cbBounded; 1918 1918 if (uPktOffset < cb) 1919 1919 { 1920 1920 cbHdrEnqueued = cbPktHdr; 1921 #ifdef VIRTIO_VBUF_ON_STACK 1922 int rc = virtioCoreR3VirtqAvailBufGet(pDevIns, &pThis->Virtio, pRxVirtq->uIdx, pVirtqBuf, true); 1923 #else /* !VIRTIO_VBUF_ON_STACK */ 1924 virtioCoreR3VirtqBufRelease(&pThis->Virtio, pVirtqBuf); 1921 1925 int rc = virtioCoreR3VirtqAvailBufGet(pDevIns, &pThis->Virtio, pRxVirtq->uIdx, &pVirtqBuf, true); 1926 #endif /* !VIRTIO_VBUF_ON_STACK */ 1922 1927 1923 1928 AssertMsgReturn(rc == VINF_SUCCESS || rc == VERR_NOT_AVAILABLE, ("%Rrc\n", rc), rc); 1924 1929 1930 #ifdef VIRTIO_VBUF_ON_STACK 1931 AssertMsgReturn(rc == VINF_SUCCESS && pVirtqBuf->cbPhysReturn, 1932 ("Not enough Rx buffers in queue to accomodate ethernet packet\n"), 1933 VERR_INTERNAL_ERROR); 1934 #else /* !VIRTIO_VBUF_ON_STACK */ 1925 1935 AssertMsgReturnStmt(rc == VINF_SUCCESS && pVirtqBuf->cbPhysReturn, 1926 1936 ("Not enough Rx buffers in queue to accomodate ethernet packet\n"), 1927 1937 virtioCoreR3VirtqBufRelease(&pThis->Virtio, pVirtqBuf), 1928 1938 VERR_INTERNAL_ERROR); 1939 #endif /* !VIRTIO_VBUF_ON_STACK */ 1940 cbBufRemaining = pVirtqBuf->cbPhysReturn; 1929 1941 } 1930 1942 } … … 1934 1946 AssertMsgRCReturn(rc, ("Failure updating descriptor count in pkt hdr in guest physical memory\n"), rc); 1935 1947 1948 #ifndef VIRTIO_VBUF_ON_STACK 1936 1949 virtioCoreR3VirtqBufRelease(&pThis->Virtio, pVirtqBuf); 1950 #endif /* !VIRTIO_VBUF_ON_STACK */ 1937 1951 virtioCoreVirtqUsedRingSync(pDevIns, &pThis->Virtio, pRxVirtq->uIdx); 1938 1952 Log7(("\n")); … … 1960 1974 { 1961 1975 RT_NOREF(pThisCC); 1976 #ifdef VIRTIO_VBUF_ON_STACK 1977 VIRTQBUF_T VirtqBuf; 1978 PVIRTQBUF pVirtqBuf = &VirtqBuf; 1979 int rc = virtioCoreR3VirtqAvailBufGet(pDevIns, &pThis->Virtio, pRxVirtq->uIdx, pVirtqBuf, true); 1980 #else /* !VIRTIO_VBUF_ON_STACK */ 1962 1981 PVIRTQBUF pVirtqBuf; 1963 1982 int rc = virtioCoreR3VirtqAvailBufGet(pDevIns, &pThis->Virtio, pRxVirtq->uIdx, &pVirtqBuf, true); 1983 #endif /* !VIRTIO_VBUF_ON_STACK */ 1964 1984 1965 1985 AssertMsgReturn(rc == VINF_SUCCESS || rc == VERR_NOT_AVAILABLE, ("%Rrc\n", rc), rc); 1966 1986 1987 #ifdef VIRTIO_VBUF_ON_STACK 1988 AssertMsgReturn(rc == VINF_SUCCESS && pVirtqBuf->cbPhysReturn, 1989 ("Not enough Rx buffers or capacity to accommodate ethernet packet\n"), 1990 VERR_INTERNAL_ERROR); 1991 #else /* !VIRTIO_VBUF_ON_STACK */ 1967 1992 AssertMsgReturnStmt(rc == VINF_SUCCESS && pVirtqBuf->cbPhysReturn, 1968 1993 ("Not enough Rx buffers or capacity to accommodate ethernet packet\n"), 1969 1994 virtioCoreR3VirtqBufRelease(&pThis->Virtio, pVirtqBuf), 1970 1995 VERR_INTERNAL_ERROR); 1996 #endif /* !VIRTIO_VBUF_ON_STACK */ 1971 1997 /* 1972 1998 * Try to do fast (e.g. single-buffer) copy to guest, even if MRG_RXBUF feature is enabled … … 1981 2007 if (rc == VINF_SUCCESS) 1982 2008 rc = virtioCoreR3VirtqUsedBufPut(pDevIns, &pThis->Virtio, pRxVirtq->uIdx, cb, pvBuf, pVirtqBuf, cbPktHdr + cb /* cbEnqueue */); 2009 #ifndef VIRTIO_VBUF_ON_STACK 1983 2010 virtioCoreR3VirtqBufRelease(&pThis->Virtio, pVirtqBuf); 2011 #endif /* !VIRTIO_VBUF_ON_STACK */ 1984 2012 virtioCoreVirtqUsedRingSync(pDevIns, &pThis->Virtio, pRxVirtq->uIdx); 1985 2013 AssertMsgReturn(rc == VINF_SUCCESS, ("%Rrc\n", rc), rc); … … 2674 2702 virtioNetR3SetWriteLed(pThisCC, true); 2675 2703 2704 /* Disable notifications until all available descriptors have been processed */ 2705 if (!(pVirtio->uDriverFeatures & VIRTIO_F_EVENT_IDX)) 2706 virtioCoreVirtqEnableNotify(&pThis->Virtio, pTxVirtq->uIdx, false /* fEnable */); 2707 2676 2708 int rc; 2709 #ifdef VIRTIO_VBUF_ON_STACK 2710 VIRTQBUF_T VirtqBuf; 2711 PVIRTQBUF pVirtqBuf = &VirtqBuf; 2712 while ((rc = virtioCoreR3VirtqAvailBufPeek(pVirtio->pDevInsR3, pVirtio, pTxVirtq->uIdx, pVirtqBuf)) == VINF_SUCCESS) 2713 #else /* !VIRTIO_VBUF_ON_STACK */ 2677 2714 PVIRTQBUF pVirtqBuf = NULL; 2678 2715 while ((rc = virtioCoreR3VirtqAvailBufPeek(pVirtio->pDevInsR3, pVirtio, pTxVirtq->uIdx, &pVirtqBuf)) == VINF_SUCCESS) 2716 #endif /* !VIRTIO_VBUF_ON_STACK */ 2679 2717 { 2680 2718 Log10Func(("[%s] fetched descriptor chain from %s\n", pThis->szInst, pTxVirtq->szName)); … … 2689 2727 VERR_INTERNAL_ERROR); 2690 2728 2729 #ifdef VIRTIO_VBUF_ON_STACK 2730 VIRTIONETPKTHDR PktHdr; 2731 PVIRTIONETPKTHDR pPktHdr = &PktHdr; 2732 #else /* !VIRTIO_VBUF_ON_STACK */ 2691 2733 PVIRTIONETPKTHDR pPktHdr = (PVIRTIONETPKTHDR)RTMemAllocZ(pThis->cbPktHdr); 2692 2734 AssertMsgReturn(pPktHdr, ("Out of Memory\n"), VERR_NO_MEMORY); 2735 #endif /* !VIRTIO_VBUF_ON_STACK */ 2693 2736 2694 2737 /* Compute total frame size from guest (including virtio-net pkt hdr) */ … … 2765 2808 Log4Func(("Failed to allocate S/G buffer: frame size=%u rc=%Rrc\n", uFrameSize, rc)); 2766 2809 /* Stop trying to fetch TX descriptors until we get more bandwidth. */ 2810 #ifndef VIRTIO_VBUF_ON_STACK 2767 2811 virtioCoreR3VirtqBufRelease(pVirtio, pVirtqBuf); 2812 #endif /* !VIRTIO_VBUF_ON_STACK */ 2768 2813 break; 2769 2814 } … … 2776 2821 } 2777 2822 2823 #ifndef VIRTIO_VBUF_ON_STACK 2778 2824 virtioCoreR3VirtqBufRelease(pVirtio, pVirtqBuf); 2779 2825 pVirtqBuf = NULL; 2826 #endif /* !VIRTIO_VBUF_ON_STACK */ 2827 /* Before we break the loop we need to check if the queue is empty, 2828 * re-enable notifications, and then re-check again to avoid missing 2829 * a notification for the descriptor that is added to the queue 2830 * after we have checked it on being empty, but before we re-enabled 2831 * notifications. 2832 */ 2833 if (!(pVirtio->uDriverFeatures & VIRTIO_F_EVENT_IDX) 2834 && IS_VIRTQ_EMPTY(pDevIns, &pThis->Virtio, pTxVirtq->uIdx)) 2835 virtioCoreVirtqEnableNotify(&pThis->Virtio, pTxVirtq->uIdx, true /* fEnable */); 2780 2836 } 2781 2837 virtioNetR3SetWriteLed(pThisCC, false); … … 3108 3164 { 3109 3165 Log10Func(("[%s] %s worker woken. Fetching desc chain\n", pThis->szInst, pVirtq->szName)); 3166 #ifdef VIRTIO_VBUF_ON_STACK 3167 VIRTQBUF_T VirtqBuf; 3168 PVIRTQBUF pVirtqBuf = &VirtqBuf; 3169 int rc = virtioCoreR3VirtqAvailBufGet(pDevIns, &pThis->Virtio, pVirtq->uIdx, pVirtqBuf, true); 3170 #else /* !VIRTIO_VBUF_ON_STACK */ 3110 3171 PVIRTQBUF pVirtqBuf = NULL; 3111 3172 int rc = virtioCoreR3VirtqAvailBufGet(pDevIns, &pThis->Virtio, pVirtq->uIdx, &pVirtqBuf, true); 3173 #endif /* !VIRTIO_VBUF_ON_STACK */ 3112 3174 if (rc == VERR_NOT_AVAILABLE) 3113 3175 { … … 3116 3178 } 3117 3179 virtioNetR3Ctrl(pDevIns, pThis, pThisCC, pVirtqBuf); 3180 #ifndef VIRTIO_VBUF_ON_STACK 3118 3181 virtioCoreR3VirtqBufRelease(&pThis->Virtio, pVirtqBuf); 3182 #endif /* !VIRTIO_VBUF_ON_STACK */ 3119 3183 } 3120 3184 else /* Must be Tx queue */ -
trunk/src/VBox/Devices/Storage/DevVirtioSCSI.cpp
r93614 r94969 1602 1602 for (int i = 0; i < pWorkerR3->cRedoDescs; i++) 1603 1603 { 1604 #ifdef VIRTIO_VBUF_ON_STACK 1605 PVIRTQBUF pVirtqBuf = virtioCoreR3VirtqBufAlloc(); 1606 if (!pVirtqBuf) 1607 { 1608 LogRel(("Failed to allocate memory for VIRTQBUF\n")); 1609 break; /* No point in trying to allocate memory for other descriptor chains */ 1610 } 1611 int rc = virtioCoreR3VirtqAvailBufGet(pDevIns, &pThis->Virtio, uVirtqNbr, 1612 pWorkerR3->auRedoDescs[i], pVirtqBuf); 1613 #else /* !VIRTIO_VBUF_ON_STACK */ 1604 1614 PVIRTQBUF pVirtqBuf; 1605 1615 int rc = virtioCoreR3VirtqAvailBufGet(pDevIns, &pThis->Virtio, uVirtqNbr, 1606 1616 pWorkerR3->auRedoDescs[i], &pVirtqBuf); 1617 #endif /* !VIRTIO_VBUF_ON_STACK */ 1607 1618 if (RT_FAILURE(rc)) 1608 1619 LogRel(("Error fetching desc chain to redo, %Rrc", rc)); … … 1617 1628 1618 1629 Log6Func(("fetching next descriptor chain from %s\n", VIRTQNAME(uVirtqNbr))); 1630 #ifdef VIRTIO_VBUF_ON_STACK 1631 PVIRTQBUF pVirtqBuf = virtioCoreR3VirtqBufAlloc(); 1632 if (!pVirtqBuf) 1633 LogRel(("Failed to allocate memory for VIRTQBUF\n")); 1634 else 1635 { 1636 int rc = virtioCoreR3VirtqAvailBufGet(pDevIns, &pThis->Virtio, uVirtqNbr, pVirtqBuf, true); 1637 #else /* !VIRTIO_VBUF_ON_STACK */ 1619 1638 PVIRTQBUF pVirtqBuf = NULL; 1620 1639 int rc = virtioCoreR3VirtqAvailBufGet(pDevIns, &pThis->Virtio, uVirtqNbr, &pVirtqBuf, true); 1640 #endif /* !VIRTIO_VBUF_ON_STACK */ 1621 1641 if (rc == VERR_NOT_AVAILABLE) 1622 1642 { … … 1636 1656 1637 1657 virtioCoreR3VirtqBufRelease(&pThis->Virtio, pVirtqBuf); 1658 #ifdef VIRTIO_VBUF_ON_STACK 1659 } 1660 #endif /* VIRTIO_VBUF_ON_STACK */ 1638 1661 } 1639 1662 } -
trunk/src/VBox/Devices/VirtIO/VirtioCore.cpp
r94287 r94969 620 620 uint16_t uUsedIdxShadow = pVirtq->uUsedIdxShadow; 621 621 622 #ifdef VIRTIO_VBUF_ON_STACK 623 VIRTQBUF_T VirtqBuf; 624 PVIRTQBUF pVirtqBuf = &VirtqBuf; 625 #else /* !VIRTIO_VBUF_ON_STACK */ 622 626 PVIRTQBUF pVirtqBuf = NULL; 627 #endif /* !VIRTIO_VBUF_ON_STACK */ 623 628 624 629 bool fEmpty = IS_VIRTQ_EMPTY(pDevIns, pVirtio, pVirtq); … … 629 634 if (!fEmpty) 630 635 { 636 #ifdef VIRTIO_VBUF_ON_STACK 637 virtioCoreR3VirtqAvailBufPeek(pDevIns, pVirtio, uVirtq, pVirtqBuf); 638 #else /* !VIRTIO_VBUF_ON_STACK */ 631 639 virtioCoreR3VirtqAvailBufPeek(pDevIns, pVirtio, uVirtq, &pVirtqBuf); 640 #endif /* !VIRTIO_VBUF_ON_STACK */ 632 641 cSendSegs = pVirtqBuf->pSgPhysSend ? pVirtqBuf->pSgPhysSend->cSegs : 0; 633 642 cReturnSegs = pVirtqBuf->pSgPhysReturn ? pVirtqBuf->pSgPhysReturn->cSegs : 0; … … 680 689 } 681 690 691 #ifdef VIRTIO_VBUF_ON_STACK 692 /** API Function: See header file */ 693 PVIRTQBUF virtioCoreR3VirtqBufAlloc(void) 694 { 695 PVIRTQBUF pVirtqBuf = (PVIRTQBUF)RTMemAllocZ(sizeof(VIRTQBUF_T)); 696 AssertReturn(pVirtqBuf, NULL); 697 pVirtqBuf->u32Magic = VIRTQBUF_MAGIC; 698 pVirtqBuf->cRefs = 1; 699 return pVirtqBuf; 700 } 701 #endif /* VIRTIO_VBUF_ON_STACK */ 702 682 703 /** API Function: See header file */ 683 704 uint32_t virtioCoreR3VirtqBufRetain(PVIRTQBUF pVirtqBuf) … … 752 773 753 774 /** API function: See Header file */ 775 #ifdef VIRTIO_VBUF_ON_STACK 776 int virtioCoreR3VirtqAvailBufPeek(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t uVirtq, PVIRTQBUF pVirtqBuf) 777 { 778 return virtioCoreR3VirtqAvailBufGet(pDevIns, pVirtio, uVirtq, pVirtqBuf, false); 779 } 780 #else /* !VIRTIO_VBUF_ON_STACK */ 754 781 int virtioCoreR3VirtqAvailBufPeek(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t uVirtq, 755 782 PPVIRTQBUF ppVirtqBuf) … … 757 784 return virtioCoreR3VirtqAvailBufGet(pDevIns, pVirtio, uVirtq, ppVirtqBuf, false); 758 785 } 786 #endif /* !VIRTIO_VBUF_ON_STACK */ 759 787 760 788 /** API function: See Header file */ … … 778 806 779 807 /** API Function: See header file */ 808 #ifdef VIRTIO_VBUF_ON_STACK 809 int virtioCoreR3VirtqAvailBufGet(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t uVirtq, 810 uint16_t uHeadIdx, PVIRTQBUF pVirtqBuf) 811 #else /* !VIRTIO_VBUF_ON_STACK */ 780 812 int virtioCoreR3VirtqAvailBufGet(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t uVirtq, 781 813 uint16_t uHeadIdx, PPVIRTQBUF ppVirtqBuf) 782 { 814 #endif /* !VIRTIO_VBUF_ON_STACK */ 815 { 816 #ifndef VIRTIO_VBUF_ON_STACK 783 817 AssertReturn(ppVirtqBuf, VERR_INVALID_POINTER); 784 818 *ppVirtqBuf = NULL; 819 #endif /* !VIRTIO_VBUF_ON_STACK */ 785 820 786 821 AssertMsgReturn(uVirtq < RT_ELEMENTS(pVirtio->aVirtqueues), … … 800 835 * Allocate and initialize the descriptor chain structure. 801 836 */ 837 #ifndef VIRTIO_VBUF_ON_STACK 802 838 PVIRTQBUF pVirtqBuf = (PVIRTQBUF)RTMemAllocZ(sizeof(VIRTQBUF_T)); 803 839 AssertReturn(pVirtqBuf, VERR_NO_MEMORY); 804 840 pVirtqBuf->u32Magic = VIRTQBUF_MAGIC; 805 841 pVirtqBuf->cRefs = 1; 842 #endif /* !VIRTIO_VBUF_ON_STACK */ 806 843 pVirtqBuf->uHeadIdx = uHeadIdx; 807 844 pVirtqBuf->uVirtq = uVirtq; 845 #ifndef VIRTIO_VBUF_ON_STACK 808 846 *ppVirtqBuf = pVirtqBuf; 847 #endif /* !VIRTIO_VBUF_ON_STACK */ 809 848 810 849 /* … … 904 943 905 944 /** API function: See Header file */ 945 #ifdef VIRTIO_VBUF_ON_STACK 946 int virtioCoreR3VirtqAvailBufGet(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t uVirtq, 947 PVIRTQBUF pVirtqBuf, bool fRemove) 948 #else /* !VIRTIO_VBUF_ON_STACK */ 906 949 int virtioCoreR3VirtqAvailBufGet(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t uVirtq, 907 950 PPVIRTQBUF ppVirtqBuf, bool fRemove) 951 #endif /* !VIRTIO_VBUF_ON_STACK */ 908 952 { 909 953 Assert(uVirtq < RT_ELEMENTS(pVirtio->aVirtqueues)); … … 921 965 pVirtq->uAvailIdxShadow++; 922 966 967 #ifdef VIRTIO_VBUF_ON_STACK 968 int rc = virtioCoreR3VirtqAvailBufGet(pDevIns, pVirtio, uVirtq, uHeadIdx, pVirtqBuf); 969 #else /* !VIRTIO_VBUF_ON_STACK */ 923 970 int rc = virtioCoreR3VirtqAvailBufGet(pDevIns, pVirtio, uVirtq, uHeadIdx, ppVirtqBuf); 971 #endif /* !VIRTIO_VBUF_ON_STACK */ 924 972 return rc; 925 973 } -
trunk/src/VBox/Devices/VirtIO/VirtioCore.h
r94275 r94969 22 22 # pragma once 23 23 #endif 24 25 /* Do not allocate VIRTQBUF from the heap when possible */ 26 #define VIRTIO_VBUF_ON_STACK 1 24 27 25 28 #include <iprt/ctype.h> … … 676 679 uint16_t virtioCoreVirtqAvailBufCount(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t uVirtqNbr); 677 680 681 #ifdef VIRTIO_VBUF_ON_STACK 682 /** 683 * This function is identical to virtioCoreR3VirtqAvailBufGet(), *except* it doesn't consume 684 * peeked buffer from avail ring of the virtq. The function *becomes* identical to the 685 * virtioCoreR3VirtqAvailBufGet() only if virtioCoreR3VirtqAvailRingNext() is invoked to 686 * consume buf from the queue's avail ring, followed by invocation of virtioCoreR3VirtqUsedBufPut(), 687 * to hand host-processed buffer back to guest, which completes guest-initiated virtq buffer circuit. 688 * 689 * @param pDevIns The device instance. 690 * @param pVirtio Pointer to the shared virtio state. 691 * @param uVirtqNbr Virtq number 692 * @param pVirtqBuf Pointer to descriptor chain that contains the 693 * pre-processed transaction information pulled from the virtq. 694 * 695 * @returns VBox status code: 696 * @retval VINF_SUCCESS Success 697 * @retval VERR_INVALID_STATE VirtIO not in ready state (asserted). 698 * @retval VERR_NOT_AVAILABLE If the queue is empty. 699 */ 700 int virtioCoreR3VirtqAvailBufPeek(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t uVirtqNbr, 701 PVIRTQBUF pVirtqBuf); 702 703 /** 704 * This function fetches the next buffer (descriptor chain) from the VirtIO "avail" ring of 705 * indicated queue, separating the buf's s/g vectors into OUT (e.g. guest-to-host) 706 * components and and IN (host-to-guest) components. 707 * 708 * Caller is responsible for GCPhys to host virtual memory conversions. If the 709 * virtq buffer being peeked at is "consumed", virtioCoreR3VirtqAvailRingNext() must 710 * be called, and after that virtioCoreR3VirtqUsedBufPut() must be called to 711 * complete the buffer transfer cycle with the guest. 712 * 713 * @param pDevIns The device instance. 714 * @param pVirtio Pointer to the shared virtio state. 715 * @param uVirtqNbr Virtq number 716 * @param pVirtqBuf Pointer to descriptor chain that contains the 717 * pre-processed transaction information pulled from the virtq. 718 * @param fRemove flags whether to remove desc chain from queue (false = peek) 719 * 720 * @returns VBox status code: 721 * @retval VINF_SUCCESS Success 722 * @retval VERR_INVALID_STATE VirtIO not in ready state (asserted). 723 * @retval VERR_NOT_AVAILABLE If the queue is empty. 724 */ 725 int virtioCoreR3VirtqAvailBufGet(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t uVirtqNbr, 726 PVIRTQBUF pVirtqBuf, bool fRemove); 727 728 /** 729 * Fetches a specific descriptor chain using avail ring of indicated queue and converts the 730 * descriptor chain into its OUT (to device) and IN (to guest) components. 731 * 732 * The caller is responsible for GCPhys to host virtual memory conversions and *must* 733 * return the virtq buffer using virtioCoreR3VirtqUsedBufPut() to complete the roundtrip 734 * virtq transaction. 735 * * 736 * @param pDevIns The device instance. 737 * @param pVirtio Pointer to the shared virtio state. 738 * @param uVirtqNbr Virtq number 739 * @param pVirtqBuf Pointer to descriptor chain that contains the 740 * pre-processed transaction information pulled from the virtq. 741 * @param fRemove flags whether to remove desc chain from queue (false = peek) 742 * 743 * @returns VBox status code: 744 * @retval VINF_SUCCESS Success 745 * @retval VERR_INVALID_STATE VirtIO not in ready state (asserted). 746 * @retval VERR_NOT_AVAILABLE If the queue is empty. 747 */ 748 int virtioCoreR3VirtqAvailBufGet(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t uVirtqNbr, 749 uint16_t uHeadIdx, PVIRTQBUF pVirtqBuf); 750 #else /* !VIRTIO_VBUF_ON_STACK */ 678 751 /** 679 752 * This function is identical to virtioCoreR3VirtqAvailBufGet(), *except* it doesn't consume … … 748 821 int virtioCoreR3VirtqAvailBufGet(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t uVirtqNbr, 749 822 uint16_t uHeadIdx, PPVIRTQBUF ppVirtqBuf); 823 #endif /* !VIRTIO_VBUF_ON_STACK */ 750 824 751 825 /** … … 1092 1166 int virtioCoreVirtqUsedRingSync(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t uVirtqNbr); 1093 1167 1168 #ifdef VIRTIO_VBUF_ON_STACK 1169 /** 1170 * Allocates a descriptor chain object with the reference count of one. Copying the reference 1171 * to this object requires a call to virtioCoreR3VirtqBufRetain. All references must be later 1172 * released with virtioCoreR3VirtqBufRelease. Just to be clear, one alloc plus one retain will 1173 * require two releases. 1174 * 1175 * @returns A descriptor chain object. 1176 * 1177 * @retval NULL if out of memory. 1178 * 1179 * NOTE: VIRTQBUF_T objects allocated on the stack will have garbage in the u32Magic field, 1180 * triggering an assertion if virtioCoreR3VirtqBufRelease is called on them. 1181 */ 1182 PVIRTQBUF virtioCoreR3VirtqBufAlloc(void); 1183 #endif /* VIRTIO_VBUF_ON_STACK */ 1184 1094 1185 /** 1095 1186 * Retains a reference to the given descriptor chain.
Note:
See TracChangeset
for help on using the changeset viewer.