Lines Matching refs:pTask
482 DECLINLINE(void) pdmacFileAioMgrEpAddTask(PPDMASYNCCOMPLETIONENDPOINTFILE pEndpoint, PPDMACTASKFILE pTask)
488 pEndpoint->AioMgr.pReqsPendingHead = pTask;
493 pEndpoint->AioMgr.pReqsPendingTail->pNext = pTask;
496 pEndpoint->AioMgr.pReqsPendingTail = pTask;
497 pTask->pNext = NULL;
569 PPDMACTASKFILE pTask = (PPDMACTASKFILE)RTFileAioReqGetUser(pahReqs[i]);
571 Assert(pTask->hReq == pahReqs[i]);
572 pdmacFileAioMgrEpAddTask(pEndpoint, pTask);
576 if (pTask->enmTransferType == PDMACTASKFILETRANSFER_FLUSH)
579 Assert(pEndpoint->pFlushReq == pTask);
640 PPDMACTASKFILE pTask, bool fAlignedReq)
642 AssertMsg( pTask->enmTransferType == PDMACTASKFILETRANSFER_WRITE
643 || pTask->enmTransferType == PDMACTASKFILETRANSFER_READ,
644 ("Invalid task type %d\n", pTask->enmTransferType));
671 pTask->pNext = NULL;
676 pRangeLock->pWaitingTasksHead = pTask;
677 pRangeLock->pWaitingTasksTail = pTask;
682 pRangeLock->pWaitingTasksTail->pNext = pTask;
683 pRangeLock->pWaitingTasksTail = pTask;
694 PPDMACTASKFILE pTask, bool fAlignedReq)
696 LogFlowFunc(("pAioMgr=%#p pEndpoint=%#p offStart=%RTfoff cbRange=%zu pTask=%#p\n",
697 pAioMgr, pEndpoint, offStart, cbRange, pTask));
699 AssertMsg(!pdmacFileAioMgrNormalIsRangeLocked(pEndpoint, offStart, cbRange, pTask, fAlignedReq),
709 pTask->pRangeLock = NULL;
721 pRangeLock->fReadLock = pTask->enmTransferType == PDMACTASKFILETRANSFER_READ;
729 pTask->pRangeLock = pRangeLock;
762 PPDMACTASKFILE pTask, PRTFILEAIOREQ phReq)
764 AssertMsg( pTask->enmTransferType == PDMACTASKFILETRANSFER_WRITE
765 || (uint64_t)(pTask->Off + pTask->DataSeg.cbSeg) <= pEndpoint->cbFile,
767 pTask->Off, pTask->DataSeg.cbSeg, pEndpoint->cbFile));
769 pTask->fPrefetch = false;
770 pTask->cbBounceBuffer = 0;
791 bool fLocked = pdmacFileAioMgrNormalIsRangeLocked(pEndpoint, pTask->Off, pTask->DataSeg.cbSeg, pTask,
799 if (pTask->enmTransferType == PDMACTASKFILETRANSFER_WRITE)
802 if (RT_UNLIKELY((uint64_t)(pTask->Off + pTask->DataSeg.cbSeg) > pEndpoint->cbFile))
804 ASMAtomicWriteU64(&pEndpoint->cbFile, pTask->Off + pTask->DataSeg.cbSeg);
805 RTFileSetSize(pEndpoint->hFile, pTask->Off + pTask->DataSeg.cbSeg);
809 pTask->Off, pTask->DataSeg.pvSeg,
810 pTask->DataSeg.cbSeg, pTask);
814 pTask->Off, pTask->DataSeg.pvSeg,
815 pTask->DataSeg.cbSeg, pTask);
818 rc = pdmacFileAioMgrNormalRangeLock(pAioMgr, pEndpoint, pTask->Off,
819 pTask->DataSeg.cbSeg,
820 pTask, true /* fAlignedReq */);
824 pTask->hReq = hReq;
829 LogFlow(("Task %#p was deferred because the access range is locked\n", pTask));
836 PPDMACTASKFILE pTask, PRTFILEAIOREQ phReq)
843 RTFOFF offStart = pTask->Off & ~(RTFOFF)(512-1);
844 size_t cbToTransfer = RT_ALIGN_Z(pTask->DataSeg.cbSeg + (pTask->Off - offStart), 512);
845 PDMACTASKFILETRANSFER enmTransferType = pTask->enmTransferType;
846 bool fAlignedReq = cbToTransfer == pTask->DataSeg.cbSeg
847 && offStart == pTask->Off;
849 AssertMsg( pTask->enmTransferType == PDMACTASKFILETRANSFER_WRITE
854 pTask->fPrefetch = false;
875 bool fLocked = pdmacFileAioMgrNormalIsRangeLocked(pEndpoint, offStart, cbToTransfer, pTask, fAlignedReq);
879 void *pvBuf = pTask->DataSeg.pvSeg;
889 pTask, cbToTransfer, pTask->DataSeg.cbSeg, offStart, pTask->Off));
892 pTask->cbBounceBuffer = cbToTransfer;
894 AssertMsg(pTask->Off >= offStart, ("Overflow in calculation Off=%llu offStart=%llu\n",
895 pTask->Off, offStart));
896 pTask->offBounceBuffer = pTask->Off - offStart;
903 pTask->pvBounceBuffer = RTMemPageAlloc(cbToTransfer);
904 if (RT_LIKELY(pTask->pvBounceBuffer))
906 pvBuf = pTask->pvBounceBuffer;
908 if (pTask->enmTransferType == PDMACTASKFILETRANSFER_WRITE)
910 if ( RT_UNLIKELY(cbToTransfer != pTask->DataSeg.cbSeg)
911 || RT_UNLIKELY(offStart != pTask->Off))
914 LogFlow(("Prefetching data for task %#p\n", pTask));
915 pTask->fPrefetch = true;
919 memcpy(pvBuf, pTask->DataSeg.pvSeg, pTask->DataSeg.cbSeg);
926 pTask->cbBounceBuffer = 0;
936 if (RT_UNLIKELY((uint64_t)(pTask->Off + pTask->DataSeg.cbSeg) > pEndpoint->cbFile))
938 ASMAtomicWriteU64(&pEndpoint->cbFile, pTask->Off + pTask->DataSeg.cbSeg);
939 RTFileSetSize(pEndpoint->hFile, pTask->Off + pTask->DataSeg.cbSeg);
943 offStart, pvBuf, cbToTransfer, pTask);
947 offStart, pvBuf, cbToTransfer, pTask);
950 rc = pdmacFileAioMgrNormalRangeLock(pAioMgr, pEndpoint, offStart, cbToTransfer, pTask, fAlignedReq);
953 pTask->hReq = hReq;
959 if (pTask->cbBounceBuffer)
960 RTMemPageFree(pTask->pvBounceBuffer, pTask->cbBounceBuffer);
965 LogFlow(("Task %#p was deferred because the access range is locked\n", pTask));
1345 PPDMACTASKFILE pTask = (PPDMACTASKFILE)RTFileAioReqGetUser(hReq);
1350 pEndpoint = pTask->pEndpoint;
1352 pTask->hReq = NIL_RTFILEAIOREQ;
1369 if (pTask->enmTransferType == PDMACTASKFILETRANSFER_FLUSH)
1373 AssertMsg(pEndpoint->pFlushReq == pTask, ("Failed flush request doesn't match active one\n"));
1378 LogFlow(("Flush task=%#p completed with %Rrc\n", pTask, VINF_SUCCESS));
1379 pTask->pfnCompleted(pTask, pTask->pvUser, VINF_SUCCESS);
1380 pdmacFileTaskFree(pEndpoint, pTask);
1385 pTasksWaiting = pdmacFileAioMgrNormalRangeLockFree(pAioMgr, pEndpoint, pTask->pRangeLock);
1389 if (pTask->cbBounceBuffer)
1390 RTMemPageFree(pTask->pvBounceBuffer, pTask->cbBounceBuffer);
1400 pTask->pNext = pEndpoint->AioMgr.pReqsPendingHead;
1401 pEndpoint->AioMgr.pReqsPendingHead = pTask;
1409 RTThreadGetName(pAioMgr->Thread), pTask, rcReq, pEndpoint->Core.pszUri));
1435 pTask->pfnCompleted(pTask, pTask->pvUser, rcReq);
1436 pdmacFileTaskFree(pEndpoint, pTask);
1442 if (pTask->enmTransferType == PDMACTASKFILETRANSFER_FLUSH)
1445 AssertMsg(pEndpoint->pFlushReq == pTask, ("Completed flush request doesn't match active one\n"));
1450 LogFlow(("Flush task=%#p completed with %Rrc\n", pTask, rcReq));
1451 pTask->pfnCompleted(pTask, pTask->pvUser, rcReq);
1452 pdmacFileTaskFree(pEndpoint, pTask);
1462 if (RT_UNLIKELY( cbTransfered < pTask->DataSeg.cbSeg
1463 || ( pTask->cbBounceBuffer
1464 && cbTransfered < pTask->cbBounceBuffer)))
1471 pTask, cbTransfered));
1474 if (pTask->cbBounceBuffer)
1476 AssertPtr(pTask->pvBounceBuffer);
1477 offStart = (pTask->Off & ~((RTFOFF)512-1)) + cbTransfered;
1478 cbToTransfer = pTask->cbBounceBuffer - cbTransfered;
1479 pbBuf = (uint8_t *)pTask->pvBounceBuffer + cbTransfered;
1483 Assert(!pTask->pvBounceBuffer);
1484 offStart = pTask->Off + cbTransfered;
1485 cbToTransfer = pTask->DataSeg.cbSeg - cbTransfered;
1486 pbBuf = (uint8_t *)pTask->DataSeg.pvSeg + cbTransfered;
1489 if (pTask->fPrefetch || pTask->enmTransferType == PDMACTASKFILETRANSFER_READ)
1492 pbBuf, cbToTransfer, pTask);
1496 AssertMsg(pTask->enmTransferType == PDMACTASKFILETRANSFER_WRITE,
1499 pbBuf, cbToTransfer, pTask);
1503 pTask->hReq = hReq;
1508 else if (pTask->fPrefetch)
1510 Assert(pTask->enmTransferType == PDMACTASKFILETRANSFER_WRITE);
1511 Assert(pTask->cbBounceBuffer);
1513 memcpy(((uint8_t *)pTask->pvBounceBuffer) + pTask->offBounceBuffer,
1514 pTask->DataSeg.pvSeg,
1515 pTask->DataSeg.cbSeg);
1518 pTask->fPrefetch = false;
1519 RTFOFF offStart = pTask->Off & ~(RTFOFF)(512-1);
1520 size_t cbToTransfer = RT_ALIGN_Z(pTask->DataSeg.cbSeg + (pTask->Off - offStart), 512);
1523 if (RT_UNLIKELY((uint64_t)(pTask->Off + pTask->DataSeg.cbSeg) > pEndpoint->cbFile))
1525 ASMAtomicWriteU64(&pEndpoint->cbFile, pTask->Off + pTask->DataSeg.cbSeg);
1526 RTFileSetSize(pEndpoint->hFile, pTask->Off + pTask->DataSeg.cbSeg);
1530 offStart, pTask->pvBounceBuffer, cbToTransfer, pTask);
1532 pTask->hReq = hReq;
1539 if (RT_SUCCESS(rc) && pTask->cbBounceBuffer)
1541 if (pTask->enmTransferType == PDMACTASKFILETRANSFER_READ)
1542 memcpy(pTask->DataSeg.pvSeg,
1543 ((uint8_t *)pTask->pvBounceBuffer) + pTask->offBounceBuffer,
1544 pTask->DataSeg.cbSeg);
1546 RTMemPageFree(pTask->pvBounceBuffer, pTask->cbBounceBuffer);
1552 pTasksWaiting = pdmacFileAioMgrNormalRangeLockFree(pAioMgr, pEndpoint, pTask->pRangeLock);
1560 LogFlow(("Task=%#p completed with %Rrc\n", pTask, rcReq));
1561 pTask->pfnCompleted(pTask, pTask->pvUser, rcReq);
1562 pdmacFileTaskFree(pEndpoint, pTask);
1572 pTask = pEndpoint->pFlushReq;
1575 AssertMsg(pTask->pEndpoint == pEndpoint, ("Endpoint of the flush request does not match assigned one\n"));
1577 pTask->pfnCompleted(pTask, pTask->pvUser, VINF_SUCCESS);
1578 pdmacFileTaskFree(pEndpoint, pTask);