Statistics
| Branch: | Revision:

root / hw / virtio-scsi.c @ 06114d72

History | View | Annotate | Download (16.6 kB)

1
/*
2
 * Virtio SCSI HBA
3
 *
4
 * Copyright IBM, Corp. 2010
5
 * Copyright Red Hat, Inc. 2011
6
 *
7
 * Authors:
8
 *   Stefan Hajnoczi    <stefanha@linux.vnet.ibm.com>
9
 *   Paolo Bonzini      <pbonzini@redhat.com>
10
 *
11
 * This work is licensed under the terms of the GNU GPL, version 2 or later.
12
 * See the COPYING file in the top-level directory.
13
 *
14
 */
15

    
16
#include "virtio-scsi.h"
17
#include <hw/scsi.h>
18
#include <hw/scsi-defs.h>
19

    
20
#define VIRTIO_SCSI_VQ_SIZE     128
21
#define VIRTIO_SCSI_CDB_SIZE    32
22
#define VIRTIO_SCSI_SENSE_SIZE  96
23
#define VIRTIO_SCSI_MAX_CHANNEL 0
24
#define VIRTIO_SCSI_MAX_TARGET  255
25
#define VIRTIO_SCSI_MAX_LUN     16383
26

    
27
/* Response codes */
28
#define VIRTIO_SCSI_S_OK                       0
29
#define VIRTIO_SCSI_S_OVERRUN                  1
30
#define VIRTIO_SCSI_S_ABORTED                  2
31
#define VIRTIO_SCSI_S_BAD_TARGET               3
32
#define VIRTIO_SCSI_S_RESET                    4
33
#define VIRTIO_SCSI_S_BUSY                     5
34
#define VIRTIO_SCSI_S_TRANSPORT_FAILURE        6
35
#define VIRTIO_SCSI_S_TARGET_FAILURE           7
36
#define VIRTIO_SCSI_S_NEXUS_FAILURE            8
37
#define VIRTIO_SCSI_S_FAILURE                  9
38
#define VIRTIO_SCSI_S_FUNCTION_SUCCEEDED       10
39
#define VIRTIO_SCSI_S_FUNCTION_REJECTED        11
40
#define VIRTIO_SCSI_S_INCORRECT_LUN            12
41

    
42
/* Controlq type codes.  */
43
#define VIRTIO_SCSI_T_TMF                      0
44
#define VIRTIO_SCSI_T_AN_QUERY                 1
45
#define VIRTIO_SCSI_T_AN_SUBSCRIBE             2
46

    
47
/* Valid TMF subtypes.  */
48
#define VIRTIO_SCSI_T_TMF_ABORT_TASK           0
49
#define VIRTIO_SCSI_T_TMF_ABORT_TASK_SET       1
50
#define VIRTIO_SCSI_T_TMF_CLEAR_ACA            2
51
#define VIRTIO_SCSI_T_TMF_CLEAR_TASK_SET       3
52
#define VIRTIO_SCSI_T_TMF_I_T_NEXUS_RESET      4
53
#define VIRTIO_SCSI_T_TMF_LOGICAL_UNIT_RESET   5
54
#define VIRTIO_SCSI_T_TMF_QUERY_TASK           6
55
#define VIRTIO_SCSI_T_TMF_QUERY_TASK_SET       7
56

    
57
/* Events.  */
58
#define VIRTIO_SCSI_T_EVENTS_MISSED            0x80000000
59
#define VIRTIO_SCSI_T_NO_EVENT                 0
60
#define VIRTIO_SCSI_T_TRANSPORT_RESET          1
61
#define VIRTIO_SCSI_T_ASYNC_NOTIFY             2
62

    
63
/* SCSI command request, followed by data-out */
64
typedef struct {
65
    uint8_t lun[8];              /* Logical Unit Number */
66
    uint64_t tag;                /* Command identifier */
67
    uint8_t task_attr;           /* Task attribute */
68
    uint8_t prio;
69
    uint8_t crn;
70
    uint8_t cdb[];
71
} QEMU_PACKED VirtIOSCSICmdReq;
72

    
73
/* Response, followed by sense data and data-in */
74
typedef struct {
75
    uint32_t sense_len;          /* Sense data length */
76
    uint32_t resid;              /* Residual bytes in data buffer */
77
    uint16_t status_qualifier;   /* Status qualifier */
78
    uint8_t status;              /* Command completion status */
79
    uint8_t response;            /* Response values */
80
    uint8_t sense[];
81
} QEMU_PACKED VirtIOSCSICmdResp;
82

    
83
/* Task Management Request */
84
typedef struct {
85
    uint32_t type;
86
    uint32_t subtype;
87
    uint8_t lun[8];
88
    uint64_t tag;
89
} QEMU_PACKED VirtIOSCSICtrlTMFReq;
90

    
91
typedef struct {
92
    uint8_t response;
93
} QEMU_PACKED VirtIOSCSICtrlTMFResp;
94

    
95
/* Asynchronous notification query/subscription */
96
typedef struct {
97
    uint32_t type;
98
    uint8_t lun[8];
99
    uint32_t event_requested;
100
} QEMU_PACKED VirtIOSCSICtrlANReq;
101

    
102
typedef struct {
103
    uint32_t event_actual;
104
    uint8_t response;
105
} QEMU_PACKED VirtIOSCSICtrlANResp;
106

    
107
typedef struct {
108
    uint32_t event;
109
    uint8_t lun[8];
110
    uint32_t reason;
111
} QEMU_PACKED VirtIOSCSIEvent;
112

    
113
typedef struct {
114
    uint32_t num_queues;
115
    uint32_t seg_max;
116
    uint32_t max_sectors;
117
    uint32_t cmd_per_lun;
118
    uint32_t event_info_size;
119
    uint32_t sense_size;
120
    uint32_t cdb_size;
121
    uint16_t max_channel;
122
    uint16_t max_target;
123
    uint32_t max_lun;
124
} QEMU_PACKED VirtIOSCSIConfig;
125

    
126
typedef struct {
127
    VirtIODevice vdev;
128
    DeviceState *qdev;
129
    VirtIOSCSIConf *conf;
130

    
131
    SCSIBus bus;
132
    VirtQueue *ctrl_vq;
133
    VirtQueue *event_vq;
134
    VirtQueue *cmd_vq;
135
    uint32_t sense_size;
136
    uint32_t cdb_size;
137
    int resetting;
138
} VirtIOSCSI;
139

    
140
typedef struct VirtIOSCSIReq {
141
    VirtIOSCSI *dev;
142
    VirtQueue *vq;
143
    VirtQueueElement elem;
144
    QEMUSGList qsgl;
145
    SCSIRequest *sreq;
146
    union {
147
        char                  *buf;
148
        VirtIOSCSICmdReq      *cmd;
149
        VirtIOSCSICtrlTMFReq  *tmf;
150
        VirtIOSCSICtrlANReq   *an;
151
    } req;
152
    union {
153
        char                  *buf;
154
        VirtIOSCSICmdResp     *cmd;
155
        VirtIOSCSICtrlTMFResp *tmf;
156
        VirtIOSCSICtrlANResp  *an;
157
        VirtIOSCSIEvent       *event;
158
    } resp;
159
} VirtIOSCSIReq;
160

    
161
static inline int virtio_scsi_get_lun(uint8_t *lun)
162
{
163
    return ((lun[2] << 8) | lun[3]) & 0x3FFF;
164
}
165

    
166
static inline SCSIDevice *virtio_scsi_device_find(VirtIOSCSI *s, uint8_t *lun)
167
{
168
    if (lun[0] != 1) {
169
        return NULL;
170
    }
171
    if (lun[2] != 0 && !(lun[2] >= 0x40 && lun[2] < 0x80)) {
172
        return NULL;
173
    }
174
    return scsi_device_find(&s->bus, 0, lun[1], virtio_scsi_get_lun(lun));
175
}
176

    
177
static void virtio_scsi_complete_req(VirtIOSCSIReq *req)
178
{
179
    VirtIOSCSI *s = req->dev;
180
    VirtQueue *vq = req->vq;
181
    virtqueue_push(vq, &req->elem, req->qsgl.size + req->elem.in_sg[0].iov_len);
182
    qemu_sglist_destroy(&req->qsgl);
183
    if (req->sreq) {
184
        req->sreq->hba_private = NULL;
185
        scsi_req_unref(req->sreq);
186
    }
187
    g_free(req);
188
    virtio_notify(&s->vdev, vq);
189
}
190

    
191
static void virtio_scsi_bad_req(void)
192
{
193
    error_report("wrong size for virtio-scsi headers");
194
    exit(1);
195
}
196

    
197
static void qemu_sgl_init_external(QEMUSGList *qsgl, struct iovec *sg,
198
                                   target_phys_addr_t *addr, int num)
199
{
200
    memset(qsgl, 0, sizeof(*qsgl));
201
    while (num--) {
202
        qemu_sglist_add(qsgl, *(addr++), (sg++)->iov_len);
203
    }
204
}
205

    
206
static void virtio_scsi_parse_req(VirtIOSCSI *s, VirtQueue *vq,
207
                                  VirtIOSCSIReq *req)
208
{
209
    assert(req->elem.out_num && req->elem.in_num);
210
    req->vq = vq;
211
    req->dev = s;
212
    req->sreq = NULL;
213
    req->req.buf = req->elem.out_sg[0].iov_base;
214
    req->resp.buf = req->elem.in_sg[0].iov_base;
215

    
216
    if (req->elem.out_num > 1) {
217
        qemu_sgl_init_external(&req->qsgl, &req->elem.out_sg[1],
218
                               &req->elem.out_addr[1],
219
                               req->elem.out_num - 1);
220
    } else {
221
        qemu_sgl_init_external(&req->qsgl, &req->elem.in_sg[1],
222
                               &req->elem.in_addr[1],
223
                               req->elem.in_num - 1);
224
    }
225
}
226

    
227
static VirtIOSCSIReq *virtio_scsi_pop_req(VirtIOSCSI *s, VirtQueue *vq)
228
{
229
    VirtIOSCSIReq *req;
230
    req = g_malloc(sizeof(*req));
231
    if (!virtqueue_pop(vq, &req->elem)) {
232
        g_free(req);
233
        return NULL;
234
    }
235

    
236
    virtio_scsi_parse_req(s, vq, req);
237
    return req;
238
}
239

    
240
static void virtio_scsi_do_tmf(VirtIOSCSI *s, VirtIOSCSIReq *req)
241
{
242
    SCSIDevice *d = virtio_scsi_device_find(s, req->req.tmf->lun);
243
    SCSIRequest *r, *next;
244
    DeviceState *qdev;
245
    int target;
246

    
247
    /* Here VIRTIO_SCSI_S_OK means "FUNCTION COMPLETE".  */
248
    req->resp.tmf->response = VIRTIO_SCSI_S_OK;
249

    
250
    switch (req->req.tmf->subtype) {
251
    case VIRTIO_SCSI_T_TMF_ABORT_TASK:
252
    case VIRTIO_SCSI_T_TMF_QUERY_TASK:
253
        if (!d) {
254
            goto fail;
255
        }
256
        if (d->lun != virtio_scsi_get_lun(req->req.tmf->lun)) {
257
            goto incorrect_lun;
258
        }
259
        QTAILQ_FOREACH_SAFE(r, &d->requests, next, next) {
260
            if (r->tag == req->req.tmf->tag) {
261
                break;
262
            }
263
        }
264
        if (r && r->hba_private) {
265
            if (req->req.tmf->subtype == VIRTIO_SCSI_T_TMF_QUERY_TASK) {
266
                /* "If the specified command is present in the task set, then
267
                 * return a service response set to FUNCTION SUCCEEDED".
268
                 */
269
                req->resp.tmf->response = VIRTIO_SCSI_S_FUNCTION_SUCCEEDED;
270
            } else {
271
                scsi_req_cancel(r);
272
            }
273
        }
274
        break;
275

    
276
    case VIRTIO_SCSI_T_TMF_LOGICAL_UNIT_RESET:
277
        if (!d) {
278
            goto fail;
279
        }
280
        if (d->lun != virtio_scsi_get_lun(req->req.tmf->lun)) {
281
            goto incorrect_lun;
282
        }
283
        s->resetting++;
284
        qdev_reset_all(&d->qdev);
285
        s->resetting--;
286
        break;
287

    
288
    case VIRTIO_SCSI_T_TMF_ABORT_TASK_SET:
289
    case VIRTIO_SCSI_T_TMF_CLEAR_TASK_SET:
290
    case VIRTIO_SCSI_T_TMF_QUERY_TASK_SET:
291
        if (!d) {
292
            goto fail;
293
        }
294
        if (d->lun != virtio_scsi_get_lun(req->req.tmf->lun)) {
295
            goto incorrect_lun;
296
        }
297
        QTAILQ_FOREACH_SAFE(r, &d->requests, next, next) {
298
            if (r->hba_private) {
299
                if (req->req.tmf->subtype == VIRTIO_SCSI_T_TMF_QUERY_TASK_SET) {
300
                    /* "If there is any command present in the task set, then
301
                     * return a service response set to FUNCTION SUCCEEDED".
302
                     */
303
                    req->resp.tmf->response = VIRTIO_SCSI_S_FUNCTION_SUCCEEDED;
304
                    break;
305
                } else {
306
                    scsi_req_cancel(r);
307
                }
308
            }
309
        }
310
        break;
311

    
312
    case VIRTIO_SCSI_T_TMF_I_T_NEXUS_RESET:
313
        target = req->req.tmf->lun[1];
314
        s->resetting++;
315
        QTAILQ_FOREACH(qdev, &s->bus.qbus.children, sibling) {
316
             d = DO_UPCAST(SCSIDevice, qdev, qdev);
317
             if (d->channel == 0 && d->id == target) {
318
                qdev_reset_all(&d->qdev);
319
             }
320
        }
321
        s->resetting--;
322
        break;
323

    
324
    case VIRTIO_SCSI_T_TMF_CLEAR_ACA:
325
    default:
326
        req->resp.tmf->response = VIRTIO_SCSI_S_FUNCTION_REJECTED;
327
        break;
328
    }
329

    
330
    return;
331

    
332
incorrect_lun:
333
    req->resp.tmf->response = VIRTIO_SCSI_S_INCORRECT_LUN;
334
    return;
335

    
336
fail:
337
    req->resp.tmf->response = VIRTIO_SCSI_S_BAD_TARGET;
338
}
339

    
340
static void virtio_scsi_handle_ctrl(VirtIODevice *vdev, VirtQueue *vq)
341
{
342
    VirtIOSCSI *s = (VirtIOSCSI *)vdev;
343
    VirtIOSCSIReq *req;
344

    
345
    while ((req = virtio_scsi_pop_req(s, vq))) {
346
        int out_size, in_size;
347
        if (req->elem.out_num < 1 || req->elem.in_num < 1) {
348
            virtio_scsi_bad_req();
349
            continue;
350
        }
351

    
352
        out_size = req->elem.out_sg[0].iov_len;
353
        in_size = req->elem.in_sg[0].iov_len;
354
        if (req->req.tmf->type == VIRTIO_SCSI_T_TMF) {
355
            if (out_size < sizeof(VirtIOSCSICtrlTMFReq) ||
356
                in_size < sizeof(VirtIOSCSICtrlTMFResp)) {
357
                virtio_scsi_bad_req();
358
            }
359
            virtio_scsi_do_tmf(s, req);
360

    
361
        } else if (req->req.tmf->type == VIRTIO_SCSI_T_AN_QUERY ||
362
                   req->req.tmf->type == VIRTIO_SCSI_T_AN_SUBSCRIBE) {
363
            if (out_size < sizeof(VirtIOSCSICtrlANReq) ||
364
                in_size < sizeof(VirtIOSCSICtrlANResp)) {
365
                virtio_scsi_bad_req();
366
            }
367
            req->resp.an->event_actual = 0;
368
            req->resp.an->response = VIRTIO_SCSI_S_OK;
369
        }
370
        virtio_scsi_complete_req(req);
371
    }
372
}
373

    
374
static void virtio_scsi_command_complete(SCSIRequest *r, uint32_t status,
375
                                         size_t resid)
376
{
377
    VirtIOSCSIReq *req = r->hba_private;
378

    
379
    req->resp.cmd->response = VIRTIO_SCSI_S_OK;
380
    req->resp.cmd->status = status;
381
    if (req->resp.cmd->status == GOOD) {
382
        req->resp.cmd->resid = resid;
383
    } else {
384
        req->resp.cmd->resid = 0;
385
        req->resp.cmd->sense_len =
386
            scsi_req_get_sense(r, req->resp.cmd->sense, VIRTIO_SCSI_SENSE_SIZE);
387
    }
388
    virtio_scsi_complete_req(req);
389
}
390

    
391
static QEMUSGList *virtio_scsi_get_sg_list(SCSIRequest *r)
392
{
393
    VirtIOSCSIReq *req = r->hba_private;
394

    
395
    return &req->qsgl;
396
}
397

    
398
static void virtio_scsi_request_cancelled(SCSIRequest *r)
399
{
400
    VirtIOSCSIReq *req = r->hba_private;
401

    
402
    if (!req) {
403
        return;
404
    }
405
    if (req->dev->resetting) {
406
        req->resp.cmd->response = VIRTIO_SCSI_S_RESET;
407
    } else {
408
        req->resp.cmd->response = VIRTIO_SCSI_S_ABORTED;
409
    }
410
    virtio_scsi_complete_req(req);
411
}
412

    
413
static void virtio_scsi_fail_cmd_req(VirtIOSCSIReq *req)
414
{
415
    req->resp.cmd->response = VIRTIO_SCSI_S_FAILURE;
416
    virtio_scsi_complete_req(req);
417
}
418

    
419
static void virtio_scsi_handle_cmd(VirtIODevice *vdev, VirtQueue *vq)
420
{
421
    VirtIOSCSI *s = (VirtIOSCSI *)vdev;
422
    VirtIOSCSIReq *req;
423
    int n;
424

    
425
    while ((req = virtio_scsi_pop_req(s, vq))) {
426
        SCSIDevice *d;
427
        int out_size, in_size;
428
        if (req->elem.out_num < 1 || req->elem.in_num < 1) {
429
            virtio_scsi_bad_req();
430
        }
431

    
432
        out_size = req->elem.out_sg[0].iov_len;
433
        in_size = req->elem.in_sg[0].iov_len;
434
        if (out_size < sizeof(VirtIOSCSICmdReq) + s->cdb_size ||
435
            in_size < sizeof(VirtIOSCSICmdResp) + s->sense_size) {
436
            virtio_scsi_bad_req();
437
        }
438

    
439
        if (req->elem.out_num > 1 && req->elem.in_num > 1) {
440
            virtio_scsi_fail_cmd_req(req);
441
            continue;
442
        }
443

    
444
        d = virtio_scsi_device_find(s, req->req.cmd->lun);
445
        if (!d) {
446
            req->resp.cmd->response = VIRTIO_SCSI_S_BAD_TARGET;
447
            virtio_scsi_complete_req(req);
448
            continue;
449
        }
450
        req->sreq = scsi_req_new(d, req->req.cmd->tag,
451
                                 virtio_scsi_get_lun(req->req.cmd->lun),
452
                                 req->req.cmd->cdb, req);
453

    
454
        if (req->sreq->cmd.mode != SCSI_XFER_NONE) {
455
            int req_mode =
456
                (req->elem.in_num > 1 ? SCSI_XFER_FROM_DEV : SCSI_XFER_TO_DEV);
457

    
458
            if (req->sreq->cmd.mode != req_mode ||
459
                req->sreq->cmd.xfer > req->qsgl.size) {
460
                req->resp.cmd->response = VIRTIO_SCSI_S_OVERRUN;
461
                virtio_scsi_complete_req(req);
462
                continue;
463
            }
464
        }
465

    
466
        n = scsi_req_enqueue(req->sreq);
467
        if (n) {
468
            scsi_req_continue(req->sreq);
469
        }
470
    }
471
}
472

    
473
static void virtio_scsi_get_config(VirtIODevice *vdev,
474
                                   uint8_t *config)
475
{
476
    VirtIOSCSIConfig *scsiconf = (VirtIOSCSIConfig *)config;
477
    VirtIOSCSI *s = (VirtIOSCSI *)vdev;
478

    
479
    stl_raw(&scsiconf->num_queues, s->conf->num_queues);
480
    stl_raw(&scsiconf->seg_max, 128 - 2);
481
    stl_raw(&scsiconf->max_sectors, s->conf->max_sectors);
482
    stl_raw(&scsiconf->cmd_per_lun, s->conf->cmd_per_lun);
483
    stl_raw(&scsiconf->event_info_size, sizeof(VirtIOSCSIEvent));
484
    stl_raw(&scsiconf->sense_size, s->sense_size);
485
    stl_raw(&scsiconf->cdb_size, s->cdb_size);
486
    stl_raw(&scsiconf->max_channel, VIRTIO_SCSI_MAX_CHANNEL);
487
    stl_raw(&scsiconf->max_target, VIRTIO_SCSI_MAX_TARGET);
488
    stl_raw(&scsiconf->max_lun, VIRTIO_SCSI_MAX_LUN);
489
}
490

    
491
static void virtio_scsi_set_config(VirtIODevice *vdev,
492
                                   const uint8_t *config)
493
{
494
    VirtIOSCSIConfig *scsiconf = (VirtIOSCSIConfig *)config;
495
    VirtIOSCSI *s = (VirtIOSCSI *)vdev;
496

    
497
    if ((uint32_t) ldl_raw(&scsiconf->sense_size) >= 65536 ||
498
        (uint32_t) ldl_raw(&scsiconf->cdb_size) >= 256) {
499
        error_report("bad data written to virtio-scsi configuration space");
500
        exit(1);
501
    }
502

    
503
    s->sense_size = ldl_raw(&scsiconf->sense_size);
504
    s->cdb_size = ldl_raw(&scsiconf->cdb_size);
505
}
506

    
507
static uint32_t virtio_scsi_get_features(VirtIODevice *vdev,
508
                                         uint32_t requested_features)
509
{
510
    return requested_features;
511
}
512

    
513
static void virtio_scsi_reset(VirtIODevice *vdev)
514
{
515
    VirtIOSCSI *s = (VirtIOSCSI *)vdev;
516

    
517
    s->sense_size = VIRTIO_SCSI_SENSE_SIZE;
518
    s->cdb_size = VIRTIO_SCSI_CDB_SIZE;
519
}
520

    
521
static struct SCSIBusInfo virtio_scsi_scsi_info = {
522
    .tcq = true,
523
    .max_channel = VIRTIO_SCSI_MAX_CHANNEL,
524
    .max_target = VIRTIO_SCSI_MAX_TARGET,
525
    .max_lun = VIRTIO_SCSI_MAX_LUN,
526

    
527
    .complete = virtio_scsi_command_complete,
528
    .cancel = virtio_scsi_request_cancelled,
529
    .get_sg_list = virtio_scsi_get_sg_list,
530
};
531

    
532
VirtIODevice *virtio_scsi_init(DeviceState *dev, VirtIOSCSIConf *proxyconf)
533
{
534
    VirtIOSCSI *s;
535

    
536
    s = (VirtIOSCSI *)virtio_common_init("virtio-scsi", VIRTIO_ID_SCSI,
537
                                         sizeof(VirtIOSCSIConfig),
538
                                         sizeof(VirtIOSCSI));
539

    
540
    s->qdev = dev;
541
    s->conf = proxyconf;
542

    
543
    /* TODO set up vdev function pointers */
544
    s->vdev.get_config = virtio_scsi_get_config;
545
    s->vdev.set_config = virtio_scsi_set_config;
546
    s->vdev.get_features = virtio_scsi_get_features;
547
    s->vdev.reset = virtio_scsi_reset;
548

    
549
    s->ctrl_vq = virtio_add_queue(&s->vdev, VIRTIO_SCSI_VQ_SIZE,
550
                                   virtio_scsi_handle_ctrl);
551
    s->event_vq = virtio_add_queue(&s->vdev, VIRTIO_SCSI_VQ_SIZE,
552
                                   NULL);
553
    s->cmd_vq = virtio_add_queue(&s->vdev, VIRTIO_SCSI_VQ_SIZE,
554
                                   virtio_scsi_handle_cmd);
555

    
556
    scsi_bus_new(&s->bus, dev, &virtio_scsi_scsi_info);
557
    if (!dev->hotplugged) {
558
        scsi_bus_legacy_handle_cmdline(&s->bus);
559
    }
560

    
561
    /* TODO savevm */
562

    
563
    return &s->vdev;
564
}
565

    
566
void virtio_scsi_exit(VirtIODevice *vdev)
567
{
568
    virtio_cleanup(vdev);
569
}