qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] block/iscsi: Adding iser support in Libiscsi-QE


From: ronnie sahlberg
Subject: Re: [Qemu-devel] [PATCH] block/iscsi: Adding iser support in Libiscsi-QEMU
Date: Mon, 22 Aug 2016 13:35:03 -0700

It is never too late.

I can start working on a patch to add "iser://" URL support to
libiscsi right now. It should be a trivial change.
I think I would prefer iser:// instead of iscsi+iser:// but it is not
religiusly. Let me know if you rather want iscsi+iser.


But you would still need some changes to Roy's patch to QEMU, right?
I.e. I think you would need an additional, new block driver :

static BlockDriver bdrv_iser = {
     .format_name     = "iser",
    .protocol_name   = "iser",
...

No ?



On Mon, Aug 1, 2016 at 6:50 AM, Paolo Bonzini <address@hidden> wrote:
>
>
> On 27/07/2016 12:02, Roy Shterman wrote:
>> iSER is a new transport layer supported in Libiscsi,
>> iSER provides a zero-copy RDMA capable interface that can
>> improve performance.
>>
>> New API is introduced in abstracion of the Libiscsi transport layer.
>> In order to use the new iSER transport, one need to add the ?iser option
>> at the end of Libiscsi URI.
>
> Hi, is it too late to use the URI scheme instead---for example
> iscsi+iser://.../... ?  In any case this should not affect the QEMU bits.
>
> Paolo
>
>> For now iSER memory buffers are pre-allocated and pre-registered,
>> hence in order to work with iSER from QEMU, one need to enable MEMLOCK
>> attribute in the VM to be large enough for all iSER buffers and RDMA
>> resources.
>>
>> A new functionallity is also introduced in this commit, a new API
>> to deploy zero-copy command submission. iSER is differing from TCP in
>> data-path, hence IO vectors must be transferred already when queueing
>> the PDU.
>>
>> Signed-off-by: Roy Shterman <address@hidden>
>> ---
>>  block/iscsi.c |   45 +++++++++++++++++++++++++++++++++++++++++----
>>  1 files changed, 41 insertions(+), 4 deletions(-)
>>
>> diff --git a/block/iscsi.c b/block/iscsi.c
>> index 7e78ade..6b95636 100644
>> --- a/block/iscsi.c
>> +++ b/block/iscsi.c
>> @@ -41,6 +41,7 @@
>>  #include "qapi/qmp/qstring.h"
>>  #include "crypto/secret.h"
>>
>> +#include "qemu/uri.h"
>>  #include <iscsi/iscsi.h>
>>  #include <iscsi/scsi-lowlevel.h>
>>
>> @@ -484,6 +485,18 @@ iscsi_co_writev_flags(BlockDriverState *bs, int64_t 
>> sector_num, int nb_sectors,
>>      iscsi_co_init_iscsitask(iscsilun, &iTask);
>>  retry:
>>      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,
>>                                          NULL, num_sectors * 
>> iscsilun->block_size,
>>                                          iscsilun->block_size, 0, 0, fua, 0, 
>> 0,
>> @@ -494,11 +507,14 @@ retry:
>>                                          iscsilun->block_size, 0, 0, fua, 0, 
>> 0,
>>                                          iscsi_co_generic_cb, &iTask);
>>      }
>> +#endif
>>      if (iTask.task == NULL) {
>>          return -ENOMEM;
>>      }
>> +#if LIBISCSI_API_VERSION < (20160603)
>>      scsi_task_set_iov_out(iTask.task, (struct scsi_iovec *) iov->iov,
>>                            iov->niov);
>> +#endif
>>      while (!iTask.complete) {
>>          iscsi_set_events(iscsilun);
>>          qemu_coroutine_yield();
>> @@ -677,6 +693,19 @@ static int coroutine_fn iscsi_co_readv(BlockDriverState 
>> *bs,
>>      iscsi_co_init_iscsitask(iscsilun, &iTask);
>>  retry:
>>      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,
>>                                         num_sectors * iscsilun->block_size,
>>                                         iscsilun->block_size, 0, 0, 0, 0, 0,
>> @@ -688,11 +717,13 @@ retry:
>>                                         0, 0, 0, 0, 0,
>>                                         iscsi_co_generic_cb, &iTask);
>>      }
>> +#endif
>>      if (iTask.task == NULL) {
>>          return -ENOMEM;
>>      }
>> +#if LIBISCSI_API_VERSION < (20160603)
>>      scsi_task_set_iov_in(iTask.task, (struct scsi_iovec *) iov->iov, 
>> iov->niov);
>> -
>> +#endif
>>      while (!iTask.complete) {
>>          iscsi_set_events(iscsilun);
>>          qemu_coroutine_yield();
>> @@ -1477,9 +1508,9 @@ static int iscsi_open(BlockDriverState *bs, QDict 
>> *options, int flags,
>>
>>      filename = qemu_opt_get(opts, "filename");
>>
>> -    iscsi_url = iscsi_parse_full_url(iscsi, filename);
>> +    iscsi_url = iscsi_parse_full_url(iscsi, uri_string_unescape(filename, 
>> -1, NULL));
>>      if (iscsi_url == NULL) {
>> -        error_setg(errp, "Failed to parse URL : %s", filename);
>> +        error_setg(errp, "Failed to parse URL : %s", 
>> uri_string_unescape(filename, -1, NULL));
>>          ret = -EINVAL;
>>          goto out;
>>      }
>> @@ -1494,7 +1525,13 @@ static int iscsi_open(BlockDriverState *bs, QDict 
>> *options, int flags,
>>          ret = -ENOMEM;
>>          goto out;
>>      }
>> -
>> +#if LIBISCSI_API_VERSION >= (20160603)
>> +    if (iscsi_init_transport(iscsi, iscsi_url->transport)) {
>> +        error_setg(errp, ("Error initializing transport."));
>> +        ret = -EINVAL;
>> +        goto out;
>> +    }
>> +#endif
>>      if (iscsi_set_targetname(iscsi, iscsi_url->target)) {
>>          error_setg(errp, "iSCSI: Failed to set target name.");
>>          ret = -EINVAL;
>>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]