mirror of
https://github.com/qemu/qemu.git
synced 2024-11-26 12:23:36 +08:00
Merge remote-tracking branch 'bonzini/scsi-next' into staging
* bonzini/scsi-next: scsi-disk: add UNMAP limits to block limits VPD page block/iscsi: use a bh to schedule co reentrance Message-id: 1387720926-11421-1-git-send-email-pbonzini@redhat.com Signed-off-by: Anthony Liguori <aliguori@amazon.com>
This commit is contained in:
commit
eedc1a5db5
@ -68,6 +68,7 @@ typedef struct IscsiTask {
|
||||
int do_retry;
|
||||
struct scsi_task *task;
|
||||
Coroutine *co;
|
||||
QEMUBH *bh;
|
||||
} IscsiTask;
|
||||
|
||||
typedef struct IscsiAIOCB {
|
||||
@ -123,6 +124,13 @@ iscsi_schedule_bh(IscsiAIOCB *acb)
|
||||
qemu_bh_schedule(acb->bh);
|
||||
}
|
||||
|
||||
static void iscsi_co_generic_bh_cb(void *opaque)
|
||||
{
|
||||
struct IscsiTask *iTask = opaque;
|
||||
qemu_bh_delete(iTask->bh);
|
||||
qemu_coroutine_enter(iTask->co, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
iscsi_co_generic_cb(struct iscsi_context *iscsi, int status,
|
||||
void *command_data, void *opaque)
|
||||
@ -147,7 +155,8 @@ iscsi_co_generic_cb(struct iscsi_context *iscsi, int status,
|
||||
|
||||
out:
|
||||
if (iTask->co) {
|
||||
qemu_coroutine_enter(iTask->co, NULL);
|
||||
iTask->bh = qemu_bh_new(iscsi_co_generic_bh_cb, iTask);
|
||||
qemu_bh_schedule(iTask->bh);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -47,6 +47,7 @@ do { printf("scsi-disk: " fmt , ## __VA_ARGS__); } while (0)
|
||||
#define SCSI_MAX_MODE_LEN 256
|
||||
|
||||
#define DEFAULT_DISCARD_GRANULARITY 4096
|
||||
#define DEFAULT_MAX_UNMAP_SIZE (1 << 30) /* 1 GB */
|
||||
|
||||
typedef struct SCSIDiskState SCSIDiskState;
|
||||
|
||||
@ -74,6 +75,7 @@ struct SCSIDiskState
|
||||
bool media_event;
|
||||
bool eject_request;
|
||||
uint64_t wwn;
|
||||
uint64_t max_unmap_size;
|
||||
QEMUBH *bh;
|
||||
char *version;
|
||||
char *serial;
|
||||
@ -625,6 +627,8 @@ static int scsi_disk_emulate_inquiry(SCSIRequest *req, uint8_t *outbuf)
|
||||
s->qdev.conf.min_io_size / s->qdev.blocksize;
|
||||
unsigned int opt_io_size =
|
||||
s->qdev.conf.opt_io_size / s->qdev.blocksize;
|
||||
unsigned int max_unmap_sectors =
|
||||
s->max_unmap_size / s->qdev.blocksize;
|
||||
|
||||
if (s->qdev.type == TYPE_ROM) {
|
||||
DPRINTF("Inquiry (EVPD[%02X] not supported for CDROM\n",
|
||||
@ -647,6 +651,18 @@ static int scsi_disk_emulate_inquiry(SCSIRequest *req, uint8_t *outbuf)
|
||||
outbuf[14] = (opt_io_size >> 8) & 0xff;
|
||||
outbuf[15] = opt_io_size & 0xff;
|
||||
|
||||
/* max unmap LBA count, default is 1GB */
|
||||
outbuf[20] = (max_unmap_sectors >> 24) & 0xff;
|
||||
outbuf[21] = (max_unmap_sectors >> 16) & 0xff;
|
||||
outbuf[22] = (max_unmap_sectors >> 8) & 0xff;
|
||||
outbuf[23] = max_unmap_sectors & 0xff;
|
||||
|
||||
/* max unmap descriptors, 255 fit in 4 kb with an 8-byte header. */
|
||||
outbuf[24] = 0;
|
||||
outbuf[25] = 0;
|
||||
outbuf[26] = 0;
|
||||
outbuf[27] = 255;
|
||||
|
||||
/* optimal unmap granularity */
|
||||
outbuf[28] = (unmap_sectors >> 24) & 0xff;
|
||||
outbuf[29] = (unmap_sectors >> 16) & 0xff;
|
||||
@ -2519,6 +2535,8 @@ static Property scsi_hd_properties[] = {
|
||||
DEFINE_PROP_BIT("dpofua", SCSIDiskState, features,
|
||||
SCSI_DISK_F_DPOFUA, false),
|
||||
DEFINE_PROP_HEX64("wwn", SCSIDiskState, wwn, 0),
|
||||
DEFINE_PROP_UINT64("max_unmap_size", SCSIDiskState, max_unmap_size,
|
||||
DEFAULT_MAX_UNMAP_SIZE),
|
||||
DEFINE_BLOCK_CHS_PROPERTIES(SCSIDiskState, qdev.conf),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
};
|
||||
@ -2628,6 +2646,8 @@ static Property scsi_disk_properties[] = {
|
||||
DEFINE_PROP_BIT("dpofua", SCSIDiskState, features,
|
||||
SCSI_DISK_F_DPOFUA, false),
|
||||
DEFINE_PROP_HEX64("wwn", SCSIDiskState, wwn, 0),
|
||||
DEFINE_PROP_UINT64("max_unmap_size", SCSIDiskState, max_unmap_size,
|
||||
DEFAULT_MAX_UNMAP_SIZE),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user