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 15:23:06 +0200 [thread overview]
Message-ID: <51C453BA.3070800@kamp.de> (raw)
In-Reply-To: <20130621131415.GG2986@dhcp-200-207.str.redhat.com>
Am 21.06.2013 15:14, schrieb Kevin Wolf:
> Am 21.06.2013 um 13:42 hat Peter Lieven geschrieben:
>> 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.
> Hm, okay, that makes it a bit harder because AIO callbacks aren't called
> in coroutine context. So taking the lock would be easy, but releasing
> them could turn out somewhat tricky.
>
>> 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();
>> }
>> }
> You're always in a coroutine here.
>
> The problem is that if you yield, you need to reenter the coroutine at
> some point or the is_allocated request would never complete. That's
> basically what the coroutine locks do for you: They yield and only
> reenter when the lock can be taken.
would it ok for you to stay with qemu_aio_wait() and add a remark
that it blocks and its a TODO. i need the is_allocated support in
iscsi only to improve bdrv_has_zero_init().
Peter
next prev parent reply other threads:[~2013-06-21 13:23 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
2013-06-21 13:14 ` Kevin Wolf
2013-06-21 13:23 ` Peter Lieven [this message]
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=51C453BA.3070800@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.