Loading dma-helpers.c +7 −7 Original line number Diff line number Diff line Loading @@ -192,18 +192,18 @@ static const AIOCBInfo dma_aiocb_info = { }; BlockAIOCB *dma_blk_io( BlockBackend *blk, QEMUSGList *sg, uint64_t sector_num, BlockBackend *blk, QEMUSGList *sg, uint64_t offset, DMAIOFunc *io_func, BlockCompletionFunc *cb, void *opaque, DMADirection dir) { DMAAIOCB *dbs = blk_aio_get(&dma_aiocb_info, blk, cb, opaque); trace_dma_blk_io(dbs, blk, sector_num, (dir == DMA_DIRECTION_TO_DEVICE)); trace_dma_blk_io(dbs, blk, offset, (dir == DMA_DIRECTION_TO_DEVICE)); dbs->acb = NULL; dbs->blk = blk; dbs->sg = sg; dbs->offset = sector_num << BDRV_SECTOR_BITS; dbs->offset = offset; dbs->sg_cur_index = 0; dbs->sg_cur_byte = 0; dbs->dir = dir; Loading @@ -216,18 +216,18 @@ BlockAIOCB *dma_blk_io( BlockAIOCB *dma_blk_read(BlockBackend *blk, QEMUSGList *sg, uint64_t sector, QEMUSGList *sg, uint64_t offset, void (*cb)(void *opaque, int ret), void *opaque) { return dma_blk_io(blk, sg, sector, blk_aio_preadv, cb, opaque, return dma_blk_io(blk, sg, offset, blk_aio_preadv, cb, opaque, DMA_DIRECTION_FROM_DEVICE); } BlockAIOCB *dma_blk_write(BlockBackend *blk, QEMUSGList *sg, uint64_t sector, QEMUSGList *sg, uint64_t offset, void (*cb)(void *opaque, int ret), void *opaque) { return dma_blk_io(blk, sg, sector, blk_aio_pwritev, cb, opaque, return dma_blk_io(blk, sg, offset, blk_aio_pwritev, cb, opaque, DMA_DIRECTION_TO_DEVICE); } Loading hw/block/nvme.c +3 −3 Original line number Diff line number Diff line Loading @@ -239,7 +239,7 @@ static uint16_t nvme_rw(NvmeCtrl *n, NvmeNamespace *ns, NvmeCmd *cmd, uint8_t lba_index = NVME_ID_NS_FLBAS_INDEX(ns->id_ns.flbas); uint8_t data_shift = ns->id_ns.lbaf[lba_index].ds; uint64_t data_size = (uint64_t)nlb << data_shift; uint64_t aio_slba = slba << (data_shift - BDRV_SECTOR_BITS); uint64_t data_offset = slba << data_shift; int is_write = rw->opcode == NVME_CMD_WRITE ? 1 : 0; enum BlockAcctType acct = is_write ? BLOCK_ACCT_WRITE : BLOCK_ACCT_READ; Loading @@ -258,8 +258,8 @@ static uint16_t nvme_rw(NvmeCtrl *n, NvmeNamespace *ns, NvmeCmd *cmd, req->has_sg = true; dma_acct_start(n->conf.blk, &req->acct, &req->qsg, acct); req->aiocb = is_write ? dma_blk_write(n->conf.blk, &req->qsg, aio_slba, nvme_rw_cb, req) : dma_blk_read(n->conf.blk, &req->qsg, aio_slba, nvme_rw_cb, req); dma_blk_write(n->conf.blk, &req->qsg, data_offset, nvme_rw_cb, req) : dma_blk_read(n->conf.blk, &req->qsg, data_offset, nvme_rw_cb, req); return NVME_NO_COMPLETE; } Loading hw/ide/ahci.c +4 −2 Original line number Diff line number Diff line Loading @@ -1006,7 +1006,8 @@ static void execute_ncq_command(NCQTransferState *ncq_tfs) dma_acct_start(ide_state->blk, &ncq_tfs->acct, &ncq_tfs->sglist, BLOCK_ACCT_READ); ncq_tfs->aiocb = dma_blk_read(ide_state->blk, &ncq_tfs->sglist, ncq_tfs->lba, ncq_cb, ncq_tfs); ncq_tfs->lba << BDRV_SECTOR_BITS, ncq_cb, ncq_tfs); break; case WRITE_FPDMA_QUEUED: DPRINTF(port, "NCQ writing %d sectors to LBA %"PRId64", tag %d\n", Loading @@ -1018,7 +1019,8 @@ static void execute_ncq_command(NCQTransferState *ncq_tfs) dma_acct_start(ide_state->blk, &ncq_tfs->acct, &ncq_tfs->sglist, BLOCK_ACCT_WRITE); ncq_tfs->aiocb = dma_blk_write(ide_state->blk, &ncq_tfs->sglist, ncq_tfs->lba, ncq_cb, ncq_tfs); ncq_tfs->lba << BDRV_SECTOR_BITS, ncq_cb, ncq_tfs); break; default: DPRINTF(port, "error: unsupported NCQ command (0x%02x) received\n", Loading hw/ide/core.c +5 −3 Original line number Diff line number Diff line Loading @@ -799,6 +799,7 @@ static void ide_dma_cb(void *opaque, int ret) IDEState *s = opaque; int n; int64_t sector_num; uint64_t offset; bool stay_active = false; if (ret == -ECANCELED) { Loading Loading @@ -859,17 +860,18 @@ static void ide_dma_cb(void *opaque, int ret) return; } offset = sector_num << BDRV_SECTOR_BITS; switch (s->dma_cmd) { case IDE_DMA_READ: s->bus->dma->aiocb = dma_blk_read(s->blk, &s->sg, sector_num, s->bus->dma->aiocb = dma_blk_read(s->blk, &s->sg, offset, ide_dma_cb, s); break; case IDE_DMA_WRITE: s->bus->dma->aiocb = dma_blk_write(s->blk, &s->sg, sector_num, s->bus->dma->aiocb = dma_blk_write(s->blk, &s->sg, offset, ide_dma_cb, s); break; case IDE_DMA_TRIM: s->bus->dma->aiocb = dma_blk_io(s->blk, &s->sg, sector_num, s->bus->dma->aiocb = dma_blk_io(s->blk, &s->sg, offset, ide_issue_trim, ide_dma_cb, s, DMA_DIRECTION_TO_DEVICE); break; Loading hw/scsi/scsi-disk.c +4 −2 Original line number Diff line number Diff line Loading @@ -335,7 +335,8 @@ static void scsi_do_read(SCSIDiskReq *r, int ret) if (r->req.sg) { dma_acct_start(s->qdev.conf.blk, &r->acct, r->req.sg, BLOCK_ACCT_READ); r->req.resid -= r->req.sg->size; r->req.aiocb = dma_blk_read(s->qdev.conf.blk, r->req.sg, r->sector, r->req.aiocb = dma_blk_read(s->qdev.conf.blk, r->req.sg, r->sector << BDRV_SECTOR_BITS, scsi_dma_complete, r); } else { scsi_init_iovec(r, SCSI_DMA_BUF_SIZE); Loading Loading @@ -539,7 +540,8 @@ static void scsi_write_data(SCSIRequest *req) if (r->req.sg) { dma_acct_start(s->qdev.conf.blk, &r->acct, r->req.sg, BLOCK_ACCT_WRITE); r->req.resid -= r->req.sg->size; r->req.aiocb = dma_blk_write(s->qdev.conf.blk, r->req.sg, r->sector, r->req.aiocb = dma_blk_write(s->qdev.conf.blk, r->req.sg, r->sector << BDRV_SECTOR_BITS, scsi_dma_complete, r); } else { block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct, Loading Loading
dma-helpers.c +7 −7 Original line number Diff line number Diff line Loading @@ -192,18 +192,18 @@ static const AIOCBInfo dma_aiocb_info = { }; BlockAIOCB *dma_blk_io( BlockBackend *blk, QEMUSGList *sg, uint64_t sector_num, BlockBackend *blk, QEMUSGList *sg, uint64_t offset, DMAIOFunc *io_func, BlockCompletionFunc *cb, void *opaque, DMADirection dir) { DMAAIOCB *dbs = blk_aio_get(&dma_aiocb_info, blk, cb, opaque); trace_dma_blk_io(dbs, blk, sector_num, (dir == DMA_DIRECTION_TO_DEVICE)); trace_dma_blk_io(dbs, blk, offset, (dir == DMA_DIRECTION_TO_DEVICE)); dbs->acb = NULL; dbs->blk = blk; dbs->sg = sg; dbs->offset = sector_num << BDRV_SECTOR_BITS; dbs->offset = offset; dbs->sg_cur_index = 0; dbs->sg_cur_byte = 0; dbs->dir = dir; Loading @@ -216,18 +216,18 @@ BlockAIOCB *dma_blk_io( BlockAIOCB *dma_blk_read(BlockBackend *blk, QEMUSGList *sg, uint64_t sector, QEMUSGList *sg, uint64_t offset, void (*cb)(void *opaque, int ret), void *opaque) { return dma_blk_io(blk, sg, sector, blk_aio_preadv, cb, opaque, return dma_blk_io(blk, sg, offset, blk_aio_preadv, cb, opaque, DMA_DIRECTION_FROM_DEVICE); } BlockAIOCB *dma_blk_write(BlockBackend *blk, QEMUSGList *sg, uint64_t sector, QEMUSGList *sg, uint64_t offset, void (*cb)(void *opaque, int ret), void *opaque) { return dma_blk_io(blk, sg, sector, blk_aio_pwritev, cb, opaque, return dma_blk_io(blk, sg, offset, blk_aio_pwritev, cb, opaque, DMA_DIRECTION_TO_DEVICE); } Loading
hw/block/nvme.c +3 −3 Original line number Diff line number Diff line Loading @@ -239,7 +239,7 @@ static uint16_t nvme_rw(NvmeCtrl *n, NvmeNamespace *ns, NvmeCmd *cmd, uint8_t lba_index = NVME_ID_NS_FLBAS_INDEX(ns->id_ns.flbas); uint8_t data_shift = ns->id_ns.lbaf[lba_index].ds; uint64_t data_size = (uint64_t)nlb << data_shift; uint64_t aio_slba = slba << (data_shift - BDRV_SECTOR_BITS); uint64_t data_offset = slba << data_shift; int is_write = rw->opcode == NVME_CMD_WRITE ? 1 : 0; enum BlockAcctType acct = is_write ? BLOCK_ACCT_WRITE : BLOCK_ACCT_READ; Loading @@ -258,8 +258,8 @@ static uint16_t nvme_rw(NvmeCtrl *n, NvmeNamespace *ns, NvmeCmd *cmd, req->has_sg = true; dma_acct_start(n->conf.blk, &req->acct, &req->qsg, acct); req->aiocb = is_write ? dma_blk_write(n->conf.blk, &req->qsg, aio_slba, nvme_rw_cb, req) : dma_blk_read(n->conf.blk, &req->qsg, aio_slba, nvme_rw_cb, req); dma_blk_write(n->conf.blk, &req->qsg, data_offset, nvme_rw_cb, req) : dma_blk_read(n->conf.blk, &req->qsg, data_offset, nvme_rw_cb, req); return NVME_NO_COMPLETE; } Loading
hw/ide/ahci.c +4 −2 Original line number Diff line number Diff line Loading @@ -1006,7 +1006,8 @@ static void execute_ncq_command(NCQTransferState *ncq_tfs) dma_acct_start(ide_state->blk, &ncq_tfs->acct, &ncq_tfs->sglist, BLOCK_ACCT_READ); ncq_tfs->aiocb = dma_blk_read(ide_state->blk, &ncq_tfs->sglist, ncq_tfs->lba, ncq_cb, ncq_tfs); ncq_tfs->lba << BDRV_SECTOR_BITS, ncq_cb, ncq_tfs); break; case WRITE_FPDMA_QUEUED: DPRINTF(port, "NCQ writing %d sectors to LBA %"PRId64", tag %d\n", Loading @@ -1018,7 +1019,8 @@ static void execute_ncq_command(NCQTransferState *ncq_tfs) dma_acct_start(ide_state->blk, &ncq_tfs->acct, &ncq_tfs->sglist, BLOCK_ACCT_WRITE); ncq_tfs->aiocb = dma_blk_write(ide_state->blk, &ncq_tfs->sglist, ncq_tfs->lba, ncq_cb, ncq_tfs); ncq_tfs->lba << BDRV_SECTOR_BITS, ncq_cb, ncq_tfs); break; default: DPRINTF(port, "error: unsupported NCQ command (0x%02x) received\n", Loading
hw/ide/core.c +5 −3 Original line number Diff line number Diff line Loading @@ -799,6 +799,7 @@ static void ide_dma_cb(void *opaque, int ret) IDEState *s = opaque; int n; int64_t sector_num; uint64_t offset; bool stay_active = false; if (ret == -ECANCELED) { Loading Loading @@ -859,17 +860,18 @@ static void ide_dma_cb(void *opaque, int ret) return; } offset = sector_num << BDRV_SECTOR_BITS; switch (s->dma_cmd) { case IDE_DMA_READ: s->bus->dma->aiocb = dma_blk_read(s->blk, &s->sg, sector_num, s->bus->dma->aiocb = dma_blk_read(s->blk, &s->sg, offset, ide_dma_cb, s); break; case IDE_DMA_WRITE: s->bus->dma->aiocb = dma_blk_write(s->blk, &s->sg, sector_num, s->bus->dma->aiocb = dma_blk_write(s->blk, &s->sg, offset, ide_dma_cb, s); break; case IDE_DMA_TRIM: s->bus->dma->aiocb = dma_blk_io(s->blk, &s->sg, sector_num, s->bus->dma->aiocb = dma_blk_io(s->blk, &s->sg, offset, ide_issue_trim, ide_dma_cb, s, DMA_DIRECTION_TO_DEVICE); break; Loading
hw/scsi/scsi-disk.c +4 −2 Original line number Diff line number Diff line Loading @@ -335,7 +335,8 @@ static void scsi_do_read(SCSIDiskReq *r, int ret) if (r->req.sg) { dma_acct_start(s->qdev.conf.blk, &r->acct, r->req.sg, BLOCK_ACCT_READ); r->req.resid -= r->req.sg->size; r->req.aiocb = dma_blk_read(s->qdev.conf.blk, r->req.sg, r->sector, r->req.aiocb = dma_blk_read(s->qdev.conf.blk, r->req.sg, r->sector << BDRV_SECTOR_BITS, scsi_dma_complete, r); } else { scsi_init_iovec(r, SCSI_DMA_BUF_SIZE); Loading Loading @@ -539,7 +540,8 @@ static void scsi_write_data(SCSIRequest *req) if (r->req.sg) { dma_acct_start(s->qdev.conf.blk, &r->acct, r->req.sg, BLOCK_ACCT_WRITE); r->req.resid -= r->req.sg->size; r->req.aiocb = dma_blk_write(s->qdev.conf.blk, r->req.sg, r->sector, r->req.aiocb = dma_blk_write(s->qdev.conf.blk, r->req.sg, r->sector << BDRV_SECTOR_BITS, scsi_dma_complete, r); } else { block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct, Loading