[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v3 06/15] scsi: add scatter/gather functionality
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PATCH v3 06/15] scsi: add scatter/gather functionality |
Date: |
Mon, 13 Feb 2012 18:10:13 +0100 |
Scatter/gather functionality uses the newly added DMA helpers. The
device can choose between doing DMA itself, or calling scsi_req_data
as usual, which will use the newly added DMA helpers to copy piecewise
to/from the destination area(s).
Signed-off-by: Paolo Bonzini <address@hidden>
---
hw/scsi-bus.c | 28 ++++++++++++++++++++++++++--
hw/scsi.h | 3 +++
2 files changed, 29 insertions(+), 2 deletions(-)
diff --git a/hw/scsi-bus.c b/hw/scsi-bus.c
index 6a069f4..69cb3fc 100644
--- a/hw/scsi-bus.c
+++ b/hw/scsi-bus.c
@@ -5,6 +5,7 @@
#include "qdev.h"
#include "blockdev.h"
#include "trace.h"
+#include "dma.h"
static char *scsibus_get_fw_dev_path(DeviceState *dev);
static int scsi_req_parse(SCSICommand *cmd, SCSIDevice *dev, uint8_t *buf);
@@ -651,6 +652,11 @@ int32_t scsi_req_enqueue(SCSIRequest *req)
assert(!req->enqueued);
scsi_req_ref(req);
+ if (req->bus->info->get_sg_list) {
+ req->sg = req->bus->info->get_sg_list(req);
+ } else {
+ req->sg = NULL;
+ }
req->enqueued = true;
QTAILQ_INSERT_TAIL(&req->dev->requests, req, next);
@@ -1275,14 +1281,32 @@ void scsi_req_continue(SCSIRequest *req)
Once it completes, calling scsi_req_continue will restart I/O. */
void scsi_req_data(SCSIRequest *req, int len)
{
+ uint8_t *buf;
if (req->io_canceled) {
trace_scsi_req_data_canceled(req->dev->id, req->lun, req->tag, len);
return;
}
trace_scsi_req_data(req->dev->id, req->lun, req->tag, len);
assert(req->cmd.mode != SCSI_XFER_NONE);
- req->resid -= len;
- req->bus->info->transfer_data(req, len);
+ if (!req->sg) {
+ req->resid -= len;
+ req->bus->info->transfer_data(req, len);
+ return;
+ }
+
+ /* If the device calls scsi_req_data and the HBA specified a
+ * scatter/gather list, the transfer has to happen in a single
+ * step. */
+ assert(!req->dma_started);
+ req->dma_started = true;
+
+ buf = scsi_req_get_buf(req);
+ if (req->cmd.mode == SCSI_XFER_FROM_DEV) {
+ req->resid = dma_buf_read(buf, len, req->sg);
+ } else {
+ req->resid = dma_buf_write(buf, len, req->sg);
+ }
+ scsi_req_continue(req);
}
void scsi_req_print(SCSIRequest *req)
diff --git a/hw/scsi.h b/hw/scsi.h
index e1c52d2..811f61c 100644
--- a/hw/scsi.h
+++ b/hw/scsi.h
@@ -49,6 +49,8 @@ struct SCSIRequest {
size_t resid;
SCSICommand cmd;
BlockDriverAIOCB *aiocb;
+ QEMUSGList *sg;
+ bool dma_started;
uint8_t sense[SCSI_SENSE_BUF_SIZE];
uint32_t sense_len;
bool enqueued;
@@ -115,6 +117,7 @@ struct SCSIBusInfo {
void (*transfer_data)(SCSIRequest *req, uint32_t arg);
void (*complete)(SCSIRequest *req, uint32_t arg, size_t resid);
void (*cancel)(SCSIRequest *req);
+ QEMUSGList *(*get_sg_list)(SCSIRequest *req);
};
struct SCSIBus {
--
1.7.7.6
- [Qemu-devel] [PATCH v3 00/15] SCSI s/g + SCSI migration + virtio-scsi, Paolo Bonzini, 2012/02/13
- [Qemu-devel] [PATCH v3 01/15] dma-helpers: make QEMUSGList target independent, Paolo Bonzini, 2012/02/13
- [Qemu-devel] [PATCH v3 02/15] dma-helpers: add dma_buf_read and dma_buf_write, Paolo Bonzini, 2012/02/13
- [Qemu-devel] [PATCH v3 03/15] dma-helpers: add accounting wrappers, Paolo Bonzini, 2012/02/13
- [Qemu-devel] [PATCH v3 04/15] ahci: use new DMA helpers, Paolo Bonzini, 2012/02/13
- [Qemu-devel] [PATCH v3 05/15] scsi: pass residual amount to command_complete, Paolo Bonzini, 2012/02/13
- [Qemu-devel] [PATCH v3 07/15] scsi-disk: enable scatter/gather functionality, Paolo Bonzini, 2012/02/13
- [Qemu-devel] [PATCH v3 06/15] scsi: add scatter/gather functionality,
Paolo Bonzini <=
- [Qemu-devel] [PATCH v3 08/15] scsi: add SCSIDevice vmstate definitions, Paolo Bonzini, 2012/02/13
- [Qemu-devel] [PATCH v3 09/15] scsi-generic: add migration support, Paolo Bonzini, 2012/02/13
- [Qemu-devel] [PATCH v3 15/15] virtio-scsi: add migration support, Paolo Bonzini, 2012/02/13
- [Qemu-devel] [PATCH v3 10/15] scsi-disk: add migration support, Paolo Bonzini, 2012/02/13
- [Qemu-devel] [PATCH v3 13/15] virtio-scsi: add basic SCSI bus operation, Paolo Bonzini, 2012/02/13
- [Qemu-devel] [PATCH v3 12/15] virtio-scsi: Add basic request processing infrastructure, Paolo Bonzini, 2012/02/13
- [Qemu-devel] [PATCH v3 14/15] virtio-scsi: process control queue requests, Paolo Bonzini, 2012/02/13
- [Qemu-devel] [PATCH v3 11/15] virtio-scsi: Add virtio-scsi stub device, Paolo Bonzini, 2012/02/13