mirror of https://github.com/xemu-project/xemu.git
virtio-scsi: add multiqueue capability
Adding multiqueue is as simple as creating more than one virtqueues, and saving the queue number for each request. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
c80decdbd9
commit
d2ad7dd46e
|
@ -129,12 +129,12 @@ typedef struct {
|
|||
VirtIOSCSIConf *conf;
|
||||
|
||||
SCSIBus bus;
|
||||
VirtQueue *ctrl_vq;
|
||||
VirtQueue *event_vq;
|
||||
VirtQueue *cmd_vq;
|
||||
uint32_t sense_size;
|
||||
uint32_t cdb_size;
|
||||
int resetting;
|
||||
VirtQueue *ctrl_vq;
|
||||
VirtQueue *event_vq;
|
||||
VirtQueue *cmd_vqs[0];
|
||||
} VirtIOSCSI;
|
||||
|
||||
typedef struct VirtIOSCSIReq {
|
||||
|
@ -240,8 +240,9 @@ static VirtIOSCSIReq *virtio_scsi_pop_req(VirtIOSCSI *s, VirtQueue *vq)
|
|||
static void virtio_scsi_save_request(QEMUFile *f, SCSIRequest *sreq)
|
||||
{
|
||||
VirtIOSCSIReq *req = sreq->hba_private;
|
||||
uint32_t n = 0;
|
||||
uint32_t n = virtio_queue_get_id(req->vq) - 2;
|
||||
|
||||
assert(n < req->dev->conf->num_queues);
|
||||
qemu_put_be32s(f, &n);
|
||||
qemu_put_buffer(f, (unsigned char *)&req->elem, sizeof(req->elem));
|
||||
}
|
||||
|
@ -255,9 +256,9 @@ static void *virtio_scsi_load_request(QEMUFile *f, SCSIRequest *sreq)
|
|||
|
||||
req = g_malloc(sizeof(*req));
|
||||
qemu_get_be32s(f, &n);
|
||||
assert(n == 0);
|
||||
assert(n < s->conf->num_queues);
|
||||
qemu_get_buffer(f, (unsigned char *)&req->elem, sizeof(req->elem));
|
||||
virtio_scsi_parse_req(s, s->cmd_vq, req);
|
||||
virtio_scsi_parse_req(s, s->cmd_vqs[n], req);
|
||||
|
||||
scsi_req_ref(sreq);
|
||||
req->sreq = sreq;
|
||||
|
@ -584,10 +585,12 @@ VirtIODevice *virtio_scsi_init(DeviceState *dev, VirtIOSCSIConf *proxyconf)
|
|||
{
|
||||
VirtIOSCSI *s;
|
||||
static int virtio_scsi_id;
|
||||
size_t sz;
|
||||
int i;
|
||||
|
||||
sz = sizeof(VirtIOSCSI) + proxyconf->num_queues * sizeof(VirtQueue *);
|
||||
s = (VirtIOSCSI *)virtio_common_init("virtio-scsi", VIRTIO_ID_SCSI,
|
||||
sizeof(VirtIOSCSIConfig),
|
||||
sizeof(VirtIOSCSI));
|
||||
sizeof(VirtIOSCSIConfig), sz);
|
||||
|
||||
s->qdev = dev;
|
||||
s->conf = proxyconf;
|
||||
|
@ -602,8 +605,10 @@ VirtIODevice *virtio_scsi_init(DeviceState *dev, VirtIOSCSIConf *proxyconf)
|
|||
virtio_scsi_handle_ctrl);
|
||||
s->event_vq = virtio_add_queue(&s->vdev, VIRTIO_SCSI_VQ_SIZE,
|
||||
NULL);
|
||||
s->cmd_vq = virtio_add_queue(&s->vdev, VIRTIO_SCSI_VQ_SIZE,
|
||||
virtio_scsi_handle_cmd);
|
||||
for (i = 0; i < s->conf->num_queues; i++) {
|
||||
s->cmd_vqs[i] = virtio_add_queue(&s->vdev, VIRTIO_SCSI_VQ_SIZE,
|
||||
virtio_scsi_handle_cmd);
|
||||
}
|
||||
|
||||
scsi_bus_new(&s->bus, dev, &virtio_scsi_scsi_info);
|
||||
if (!dev->hotplugged) {
|
||||
|
|
Loading…
Reference in New Issue