mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 08:13:54 -06:00
block/iscsi: Introducing new zero-copy API
A new API to deploy zero-copy command submission. The new API takes I/O vectors list and number of I/O vectors to submit as input parameters when initiating the command. New API must be used if working with iSER transport option. Signed-off-by: Roy Shterman <roysh@mellanox.com> Message-Id: <1476000896-18632-2-git-send-email-roysh@mellanox.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
e948f663e9
commit
583ec22e23
1 changed files with 40 additions and 2 deletions
|
@ -202,6 +202,10 @@ static inline unsigned exp_random(double mean)
|
||||||
#define SCSI_SENSE_ASCQ_PARAMETER_LIST_LENGTH_ERROR 0x1a00
|
#define SCSI_SENSE_ASCQ_PARAMETER_LIST_LENGTH_ERROR 0x1a00
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef LIBISCSI_API_VERSION
|
||||||
|
#define LIBISCSI_API_VERSION 20130701
|
||||||
|
#endif
|
||||||
|
|
||||||
static int iscsi_translate_sense(struct scsi_sense *sense)
|
static int iscsi_translate_sense(struct scsi_sense *sense)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -592,6 +596,20 @@ iscsi_co_writev_flags(BlockDriverState *bs, int64_t sector_num, int nb_sectors,
|
||||||
iscsi_co_init_iscsitask(iscsilun, &iTask);
|
iscsi_co_init_iscsitask(iscsilun, &iTask);
|
||||||
retry:
|
retry:
|
||||||
if (iscsilun->use_16_for_rw) {
|
if (iscsilun->use_16_for_rw) {
|
||||||
|
#if LIBISCSI_API_VERSION >= (20160603)
|
||||||
|
iTask.task = iscsi_write16_iov_task(iscsilun->iscsi, iscsilun->lun, lba,
|
||||||
|
NULL, num_sectors * iscsilun->block_size,
|
||||||
|
iscsilun->block_size, 0, 0, fua, 0, 0,
|
||||||
|
iscsi_co_generic_cb, &iTask,
|
||||||
|
(struct scsi_iovec *)iov->iov, iov->niov);
|
||||||
|
} else {
|
||||||
|
iTask.task = iscsi_write10_iov_task(iscsilun->iscsi, iscsilun->lun, lba,
|
||||||
|
NULL, num_sectors * iscsilun->block_size,
|
||||||
|
iscsilun->block_size, 0, 0, fua, 0, 0,
|
||||||
|
iscsi_co_generic_cb, &iTask,
|
||||||
|
(struct scsi_iovec *)iov->iov, iov->niov);
|
||||||
|
}
|
||||||
|
#else
|
||||||
iTask.task = iscsi_write16_task(iscsilun->iscsi, iscsilun->lun, lba,
|
iTask.task = iscsi_write16_task(iscsilun->iscsi, iscsilun->lun, lba,
|
||||||
NULL, num_sectors * iscsilun->block_size,
|
NULL, num_sectors * iscsilun->block_size,
|
||||||
iscsilun->block_size, 0, 0, fua, 0, 0,
|
iscsilun->block_size, 0, 0, fua, 0, 0,
|
||||||
|
@ -602,11 +620,14 @@ retry:
|
||||||
iscsilun->block_size, 0, 0, fua, 0, 0,
|
iscsilun->block_size, 0, 0, fua, 0, 0,
|
||||||
iscsi_co_generic_cb, &iTask);
|
iscsi_co_generic_cb, &iTask);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
if (iTask.task == NULL) {
|
if (iTask.task == NULL) {
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
#if LIBISCSI_API_VERSION < (20160603)
|
||||||
scsi_task_set_iov_out(iTask.task, (struct scsi_iovec *) iov->iov,
|
scsi_task_set_iov_out(iTask.task, (struct scsi_iovec *) iov->iov,
|
||||||
iov->niov);
|
iov->niov);
|
||||||
|
#endif
|
||||||
while (!iTask.complete) {
|
while (!iTask.complete) {
|
||||||
iscsi_set_events(iscsilun);
|
iscsi_set_events(iscsilun);
|
||||||
qemu_coroutine_yield();
|
qemu_coroutine_yield();
|
||||||
|
@ -789,6 +810,21 @@ static int coroutine_fn iscsi_co_readv(BlockDriverState *bs,
|
||||||
iscsi_co_init_iscsitask(iscsilun, &iTask);
|
iscsi_co_init_iscsitask(iscsilun, &iTask);
|
||||||
retry:
|
retry:
|
||||||
if (iscsilun->use_16_for_rw) {
|
if (iscsilun->use_16_for_rw) {
|
||||||
|
#if LIBISCSI_API_VERSION >= (20160603)
|
||||||
|
iTask.task = iscsi_read16_iov_task(iscsilun->iscsi, iscsilun->lun, lba,
|
||||||
|
num_sectors * iscsilun->block_size,
|
||||||
|
iscsilun->block_size, 0, 0, 0, 0, 0,
|
||||||
|
iscsi_co_generic_cb, &iTask,
|
||||||
|
(struct scsi_iovec *)iov->iov, iov->niov);
|
||||||
|
} else {
|
||||||
|
iTask.task = iscsi_read10_iov_task(iscsilun->iscsi, iscsilun->lun, lba,
|
||||||
|
num_sectors * iscsilun->block_size,
|
||||||
|
iscsilun->block_size,
|
||||||
|
0, 0, 0, 0, 0,
|
||||||
|
iscsi_co_generic_cb, &iTask,
|
||||||
|
(struct scsi_iovec *)iov->iov, iov->niov);
|
||||||
|
}
|
||||||
|
#else
|
||||||
iTask.task = iscsi_read16_task(iscsilun->iscsi, iscsilun->lun, lba,
|
iTask.task = iscsi_read16_task(iscsilun->iscsi, iscsilun->lun, lba,
|
||||||
num_sectors * iscsilun->block_size,
|
num_sectors * iscsilun->block_size,
|
||||||
iscsilun->block_size, 0, 0, 0, 0, 0,
|
iscsilun->block_size, 0, 0, 0, 0, 0,
|
||||||
|
@ -800,11 +836,13 @@ retry:
|
||||||
0, 0, 0, 0, 0,
|
0, 0, 0, 0, 0,
|
||||||
iscsi_co_generic_cb, &iTask);
|
iscsi_co_generic_cb, &iTask);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
if (iTask.task == NULL) {
|
if (iTask.task == NULL) {
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
#if LIBISCSI_API_VERSION < (20160603)
|
||||||
scsi_task_set_iov_in(iTask.task, (struct scsi_iovec *) iov->iov, iov->niov);
|
scsi_task_set_iov_in(iTask.task, (struct scsi_iovec *) iov->iov, iov->niov);
|
||||||
|
#endif
|
||||||
while (!iTask.complete) {
|
while (!iTask.complete) {
|
||||||
iscsi_set_events(iscsilun);
|
iscsi_set_events(iscsilun);
|
||||||
qemu_coroutine_yield();
|
qemu_coroutine_yield();
|
||||||
|
@ -1649,7 +1687,7 @@ static int iscsi_open(BlockDriverState *bs, QDict *options, int flags,
|
||||||
|
|
||||||
/* timeout handling is broken in libiscsi before 1.15.0 */
|
/* timeout handling is broken in libiscsi before 1.15.0 */
|
||||||
timeout = parse_timeout(iscsi_url->target);
|
timeout = parse_timeout(iscsi_url->target);
|
||||||
#if defined(LIBISCSI_API_VERSION) && LIBISCSI_API_VERSION >= 20150621
|
#if LIBISCSI_API_VERSION >= 20150621
|
||||||
iscsi_set_timeout(iscsi, timeout);
|
iscsi_set_timeout(iscsi, timeout);
|
||||||
#else
|
#else
|
||||||
if (timeout) {
|
if (timeout) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue