VirtualBox

Changeset 83573 in vbox for trunk/src


Ignore:
Timestamp:
Apr 5, 2020 10:16:38 PM (5 years ago)
Author:
vboxsync
Message:

DevVirtioSCSI.cpp: Eliminated unnecessary memory allocations in virtioScsiR3SendEvent, fixing missing virtioCoreR3QueueGet status check. bugref:9440

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Storage/DevVirtioSCSI.cpp

    r83572 r83573  
    665665static int virtioScsiR3SendEvent(PPDMDEVINS pDevIns, PVIRTIOSCSI pThis, uint16_t uTarget, uint32_t uEventType, uint32_t uReason)
    666666{
    667     VIRTIOSCSI_EVENT_T event;
    668     event.uEvent = uEventType;
    669     event.uReason = uReason;
    670     event.abVirtioLun[0] = 1;
    671     event.abVirtioLun[1] = uTarget;
    672     event.abVirtioLun[2] = (LUN0 >> 8) & 0x40;
    673     event.abVirtioLun[3] = LUN0 & 0xff;
    674     event.abVirtioLun[4] = event.abVirtioLun[5] = event.abVirtioLun[6] = event.abVirtioLun[7] = 0;
    675 
    676667    switch (uEventType)
    677668    {
     
    714705    }
    715706
     707    /** @todo r=bird: virtioCoreQueueIsEmpty() only differs in one step from what
     708     *        virtioCoreR3QueueGet() also does, and that is checking
     709     *        VIRTIO_STATUS_DRIVER_OK.  So, why not combine the two and check the
     710     *        virtioCoreR3QueueGet status code?!  (Actually, I've added a status
     711     *        check there myself, as we'll dump core if it fails and we don't.) */
    716712    if (virtioCoreQueueIsEmpty(pDevIns, &pThis->Virtio, EVENTQ_IDX))
    717713    {
     
    722718
    723719    PVIRTIO_DESC_CHAIN_T pDescChain;
    724     virtioCoreR3QueueGet(pDevIns, &pThis->Virtio, EVENTQ_IDX, &pDescChain, true);
    725 
    726     PRTSGBUF pReqSegBuf = (PRTSGBUF)RTMemAllocZ(sizeof(RTSGBUF));
    727     AssertReturn(pReqSegBuf, VERR_NO_MEMORY);
    728 
    729     PRTSGSEG paReqSegs  = (PRTSGSEG)RTMemAllocZ(sizeof(RTSGSEG) * 2);
    730     AssertReturn(paReqSegs, VERR_NO_MEMORY);
    731 
    732     /* Copy segment data to malloc'd memory to avoid stack out-of-scope errors sanitizer doesn't detect */
    733     paReqSegs[0].pvSeg = RTMemAlloc(sizeof(event));
    734     AssertReturn(paReqSegs[0].pvSeg, VERR_NO_MEMORY);
    735     memcpy(paReqSegs[0].pvSeg, &event, sizeof(event));
    736 
    737     RTSgBufInit(pReqSegBuf, paReqSegs, 1);
    738 
    739     virtioCoreR3QueuePut(pDevIns, &pThis->Virtio, EVENTQ_IDX, pReqSegBuf, pDescChain, true /*fFence*/);
     720    int rc = virtioCoreR3QueueGet(pDevIns, &pThis->Virtio, EVENTQ_IDX, &pDescChain, true);
     721    AssertRCReturn(rc, rc);
     722
     723    VIRTIOSCSI_EVENT_T Event;
     724    Event.uEvent = uEventType;
     725    Event.uReason = uReason;
     726    Event.abVirtioLun[0] = 1;
     727    Event.abVirtioLun[1] = uTarget;
     728    Event.abVirtioLun[2] = (LUN0 >> 8) & 0x40;
     729    Event.abVirtioLun[3] = LUN0 & 0xff;
     730    Event.abVirtioLun[4] = 0;
     731    Event.abVirtioLun[5] = 0;
     732    Event.abVirtioLun[6] = 0;
     733    Event.abVirtioLun[7] = 0;
     734
     735    RTSGSEG aReqSegs[1];
     736    aReqSegs[0].pvSeg = &Event;
     737    aReqSegs[0].cbSeg = sizeof(Event);
     738
     739    RTSGBUF ReqSgBuf;
     740    RTSgBufInit(&ReqSgBuf, aReqSegs, RT_ELEMENTS(aReqSegs));
     741
     742    virtioCoreR3QueuePut(pDevIns, &pThis->Virtio, EVENTQ_IDX, &ReqSgBuf, pDescChain, true /*fFence*/);
    740743    virtioCoreQueueSync(pDevIns, &pThis->Virtio, EVENTQ_IDX);
    741 
    742     RTMemFree(paReqSegs[0].pvSeg);
    743     RTMemFree(paReqSegs);
    744     RTMemFree(pReqSegBuf);
    745744
    746745    return VINF_SUCCESS;
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette