qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Peter Lieven <pl@kamp.de>
To: Kevin Wolf <kwolf@redhat.com>
Cc: pbonzini@redhat.com, ronniesahlberg@gmail.com,
	qemu-devel@nongnu.org, Stefan Hajnoczi <stefanha@redhat.com>
Subject: Re: [Qemu-devel] [PATCH 1/2] iscsi: add support for bdrv_co_is_allocated()
Date: Fri, 21 Jun 2013 13:42:15 +0200	[thread overview]
Message-ID: <51C43C17.3040103@kamp.de> (raw)
In-Reply-To: <20130621110707.GF2986@dhcp-200-207.str.redhat.com>

Am 21.06.2013 13:07, schrieb Kevin Wolf:
> Am 21.06.2013 um 11:45 hat Peter Lieven geschrieben:
>> Am 21.06.2013 11:18, schrieb Kevin Wolf:
>>> Am 20.06.2013 um 20:20 hat Peter Lieven geschrieben:
>>>> Signed-off-by: Peter Lieven <pl@kamp.de>
>>>> ---
>>>>  block/iscsi.c |   57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>>>  1 file changed, 57 insertions(+)
>>>>
>>>> diff --git a/block/iscsi.c b/block/iscsi.c
>>>> index 0bbf0b1..e6b966d 100644
>>>> --- a/block/iscsi.c
>>>> +++ b/block/iscsi.c
>>>> @@ -49,6 +49,7 @@ typedef struct IscsiLun {
>>>>      uint64_t num_blocks;
>>>>      int events;
>>>>      QEMUTimer *nop_timer;
>>>> +    uint8_t lbpme;
>>>>  } IscsiLun;
>>>>  
>>>>  typedef struct IscsiAIOCB {
>>>> @@ -800,6 +801,60 @@ iscsi_getlength(BlockDriverState *bs)
>>>>      return len;
>>>>  }
>>>>  
>>>> +static int coroutine_fn iscsi_co_is_allocated(BlockDriverState *bs,
>>>> +                                              int64_t sector_num,
>>>> +                                              int nb_sectors, int *pnum)
>>>> +{
>>>> +    IscsiLun *iscsilun = bs->opaque;
>>>> +    struct scsi_task *task = NULL;
>>>> +    struct scsi_get_lba_status *lbas = NULL;
>>>> +    struct scsi_lba_status_descriptor *lbasd = NULL;
>>>> +    int ret;
>>>> +
>>>> +    *pnum = nb_sectors;
>>>> +
>>>> +    if (iscsilun->lbpme == 0) {
>>>> +        return 1;
>>>> +    }
>>>> +
>>>> +    /* in-flight requests could invalidate the lba status result */
>>>> +    while (iscsi_process_flush(iscsilun)) {
>>>> +        qemu_aio_wait();
>>>> +    }
>>> Note that you're blocking here. The preferred way would be something
>>> involving a yield from the coroutine and a reenter as soon as all
>>> requests are done. Maybe a CoRwLock does what you need?
>> Is there a document how to use it? Or can you help here?
> The idea would be to take a read lock while any request is in flight
> (i.e. qemu_co_rwlock_rdlock() before it's started and
> qemu_co_rwlock_unlock() when it completes), and to take a write lock
> (qemu_co_rwlock_wrlock) for the part of iscsi_co_is_allocated() that
> requires that no other request runs in parallel.
Wouldn't this require that all the other operations in iscsi.c would
also take these lock? Currently there are only aio requests
implemented as it seems.

Would it help here to add sth like this?

while (iscsi_process_flush(iscsilun)) {
    if (qemu_in_coroutine()) {
        qemu_coroutine_yield();
    } else {
        qemu_aio_wait();
    }       
}
>>>> +    if (task == NULL || task->status != SCSI_STATUS_GOOD) {
>>>> +        scsi_free_scsi_task(task);
>>>> +        return 1;
>>> Error cases should set *pnum = 0 and return 0.
>> In this special case, the target might not implement get_lba_status
>> or it might return SCSI_STATUS_BUSY. We shouldn't generate an
>> error or should we?
> If you have reasons to not return an error, do so. Maybe adding a
> comment wouldn't hurt.
Will do ;-)
>
> I just saw more than one of these return 1; lines which looked like
> error handling to me. If you don't want any of them to result in an
> error, that's okay with me, I just wanted to mention how you would
> correctly signal an error.
Ah okay. Thank you.

Peter
>
> Kevin

  reply	other threads:[~2013-06-21 11:42 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-06-20 18:20 [Qemu-devel] [PATCH 0/2] iscsi: support for is_allocated and inproved has_zero_init Peter Lieven
2013-06-20 18:20 ` [Qemu-devel] [PATCH 1/2] iscsi: add support for bdrv_co_is_allocated() Peter Lieven
2013-06-21  9:18   ` Kevin Wolf
2013-06-21  9:45     ` Peter Lieven
2013-06-21 11:07       ` Kevin Wolf
2013-06-21 11:42         ` Peter Lieven [this message]
2013-06-21 13:14           ` Kevin Wolf
2013-06-21 13:23             ` Peter Lieven
2013-06-21 16:31         ` Paolo Bonzini
2013-06-21 17:06           ` Peter Lieven
2013-06-21 17:13             ` ronnie sahlberg
2013-06-21 17:18               ` Peter Lieven
2013-06-21 16:06     ` ronnie sahlberg
2013-06-21 20:01       ` Paolo Bonzini
2013-06-24  8:13     ` Stefan Hajnoczi
2013-06-24 13:49       ` Paolo Bonzini
2013-06-24 16:11         ` Peter Lieven
2013-06-20 18:20 ` [Qemu-devel] [PATCH 2/2] iscsi: add intelligent has_zero_init check Peter Lieven
2013-06-21 20:00   ` Paolo Bonzini
2013-06-21 20:25     ` Peter Lieven
  -- strict thread matches above, loose matches on Subject: below --
2013-06-20 18:08 [Qemu-devel] [PATCH 0/2] iscsi: support for is_allocated and inproved has_zero_init Peter Lieven
2013-06-20 18:08 ` [Qemu-devel] [PATCH 1/2] iscsi: add support for bdrv_co_is_allocated() Peter Lieven

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=51C43C17.3040103@kamp.de \
    --to=pl@kamp.de \
    --cc=kwolf@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=ronniesahlberg@gmail.com \
    --cc=stefanha@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).