VirtualBox

Changeset 50564 in vbox for trunk/src/VBox/Devices/Storage


Ignore:
Timestamp:
Feb 24, 2014 10:43:23 PM (11 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
92428
Message:

AHCI: Make sure the async notification handler is called from the async I/O worker thread too when a request completes, minor cleanup (ahciTransferComplete doesn't return a status code but a boolean)

File:
1 edited

Legend:

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

    r50294 r50564  
    60516051    }
    60526052
     6053    if (pAhciPort->cTasksActive == 0 && pAhciPort->pAhciR3->fSignalIdle)
     6054        PDMDevHlpAsyncNotificationCompleted(pAhciPort->pDevInsR3);
     6055
    60536056    return fCanceled;
    60546057}
     
    60706073             __FUNCTION__, pInterface, pvUser, pAhciReq->uTag));
    60716074
    6072     int rc = ahciTransferComplete(pAhciPort, pAhciReq, rcReq, true);
    6073 
    6074     if (pAhciPort->cTasksActive == 0 && pAhciPort->pAhciR3->fSignalIdle)
    6075         PDMDevHlpAsyncNotificationCompleted(pAhciPort->pDevInsR3);
    6076     return rc;
     6075    ahciTransferComplete(pAhciPort, pAhciReq, rcReq, true);
     6076
     6077    return VINF_SUCCESS;
    60776078}
    60786079
     
    65396540        while (idx)
    65406541        {
     6542            bool fReqCanceled = false;
    65416543            AHCITXDIR enmTxDir;
    65426544            PAHCIREQ pAhciReq;
     
    66756677                            }
    66766678                            if (rc == VINF_VD_ASYNC_IO_FINISHED)
    6677                                 rc = ahciTransferComplete(pAhciPort, pAhciReq, VINF_SUCCESS, true);
     6679                                fReqCanceled = ahciTransferComplete(pAhciPort, pAhciReq, VINF_SUCCESS, true);
    66786680                            else if (RT_FAILURE(rc) && rc != VERR_VD_ASYNC_IO_IN_PROGRESS)
    6679                                 rc = ahciTransferComplete(pAhciPort, pAhciReq, rc, true);
     6681                                fReqCanceled = ahciTransferComplete(pAhciPort, pAhciReq, rc, true);
    66806682                        }
    66816683                        else
     
    67106712                                pAhciPort->Led.Asserted.s.fWriting = pAhciPort->Led.Actual.s.fWriting = 0;
    67116713                            }
    6712                             rc = ahciTransferComplete(pAhciPort, pAhciReq, rc, true);
     6714                            fReqCanceled = ahciTransferComplete(pAhciPort, pAhciReq, rc, true);
    67136715                        }
    67146716                    }
    67156717                }
    67166718                else
    6717                     rc = ahciTransferComplete(pAhciPort, pAhciReq, VINF_SUCCESS, true);
     6719                    fReqCanceled = ahciTransferComplete(pAhciPort, pAhciReq, VINF_SUCCESS, true);
    67186720            } /* Command */
     6721
     6722            /*
     6723             * Don't process other requests if the last one was canceled,
     6724             * the others are not valid anymore.
     6725             */
     6726            if (fReqCanceled)
     6727                break;
    67196728
    67206729            u32Tasks &= ~RT_BIT_32(idx); /* Clear task bit. */
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