[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v4 06/18] scsi: add scatter/gather functionality
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PATCH v4 06/18] scsi: add scatter/gather functionality |
Date: |
Wed, 22 Feb 2012 15:33:44 +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 eb97c87..0c471e0 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 8722ef9..34cdba8 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] [PULL v4 00/18] virtio-scsi driver, Paolo Bonzini, 2012/02/22
- [Qemu-devel] [PATCH v4 02/18] dma-helpers: add dma_buf_read and dma_buf_write, Paolo Bonzini, 2012/02/22
- [Qemu-devel] [PATCH v4 03/18] dma-helpers: add accounting wrappers, Paolo Bonzini, 2012/02/22
- [Qemu-devel] [PATCH v4 04/18] ahci: use new DMA helpers, Paolo Bonzini, 2012/02/22
- [Qemu-devel] [PATCH v4 01/18] dma-helpers: make QEMUSGList target independent, Paolo Bonzini, 2012/02/22
- [Qemu-devel] [PATCH v4 05/18] scsi: pass residual amount to command_complete, Paolo Bonzini, 2012/02/22
- [Qemu-devel] [PATCH v4 07/18] scsi-disk: enable scatter/gather functionality, Paolo Bonzini, 2012/02/22
- [Qemu-devel] [PATCH v4 06/18] scsi: add scatter/gather functionality,
Paolo Bonzini <=
- [Qemu-devel] [PATCH v4 08/18] scsi: add SCSIDevice vmstate definitions, Paolo Bonzini, 2012/02/22
- [Qemu-devel] [PATCH v4 09/18] scsi-generic: add migration support, Paolo Bonzini, 2012/02/22
- [Qemu-devel] [PATCH v4 12/18] virtio-scsi: Add basic request processing infrastructure, Paolo Bonzini, 2012/02/22
- [Qemu-devel] [PATCH v4 10/18] scsi-disk: add migration support, Paolo Bonzini, 2012/02/22
- [Qemu-devel] [PATCH v4 11/18] virtio-scsi: Add virtio-scsi stub device, Paolo Bonzini, 2012/02/22
- [Qemu-devel] [PATCH v4 14/18] virtio-scsi: process control queue requests, Paolo Bonzini, 2012/02/22
- [Qemu-devel] [PATCH v4 15/18] virtio-scsi: add migration support, Paolo Bonzini, 2012/02/22