qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Chrysostomos Nanakos <cnanakos@grnet.gr>
To: Paolo Bonzini <pbonzini@redhat.com>, qemu-devel@nongnu.org
Cc: kwolf@redhat.com, stefanha@redhat.com
Subject: Re: [Qemu-devel] [PATCH v1 2/2] block/archipelago: Use QEMU atomic builtins
Date: Mon, 01 Sep 2014 13:39:28 +0300	[thread overview]
Message-ID: <54044CE0.4070500@grnet.gr> (raw)
In-Reply-To: <54044B85.7040608@redhat.com>

On 09/01/2014 01:33 PM, Paolo Bonzini wrote:
> Il 01/09/2014 12:13, Chrysostomos Nanakos ha scritto:
>>>> -        if ((__sync_add_and_fetch(&segreq->ref, -segments_nr + i))
>>>> == 0) {
>>>> +        if ((atomic_add_fetch(&segreq->ref, -segments_nr + i)) == 0) {
>>
>> What about this one? It seems easier to me to read the above and
>> understand what is going on.
>>
>> By any means, it's up to you to accept patch 1 :)
> Yeah, you win on this one. :)  But this code could use some
> refactoring...
>
> Also, there is also a missing memory barrier before the
> first archipelago_submit_request call, and setting "failed" does
> not need an atomic operation.

Have to check the refactoring code thoroughly but at a first glance 
seems to be fine.

I'll come back with a new patch for block/archipelago.c then.

Thanks very much for your time and effort!

Regards,
Chrysostomos.

> Something like this (untested):
>
> diff --git a/block/archipelago.c b/block/archipelago.c
> index 34f72dc..c71898a 100644
> --- a/block/archipelago.c
> +++ b/block/archipelago.c
> @@ -824,76 +824,47 @@ static int archipelago_aio_segmented_rw(BDRVArchipelagoState *s,
>                                           ArchipelagoAIOCB *aio_cb,
>                                           int op)
>   {
> -    int i, ret, segments_nr, last_segment_size;
> +    int i, ret, segments_nr;
> +    size_t pos;
>       ArchipelagoSegmentedRequest *segreq;
>   
> -    segreq = g_new(ArchipelagoSegmentedRequest, 1);
> +    segreq = g_new0(ArchipelagoSegmentedRequest, 1);
>   
>       if (op == ARCHIP_OP_FLUSH) {
>           segments_nr = 1;
> -        segreq->ref = segments_nr;
> -        segreq->total = count;
> -        segreq->count = 0;
> -        segreq->failed = 0;
> -        ret = archipelago_submit_request(s, 0, count, offset, aio_cb,
> -                                           segreq, ARCHIP_OP_FLUSH);
> -        if (ret < 0) {
> -            goto err_exit;
> -        }
> -        return 0;
> +    } else {
> +        segments_nr = (int)(count / MAX_REQUEST_SIZE) + \
> +                      ((count % MAX_REQUEST_SIZE) ? 1 : 0);
>       }
>   
> -    segments_nr = (int)(count / MAX_REQUEST_SIZE) + \
> -                  ((count % MAX_REQUEST_SIZE) ? 1 : 0);
> -    last_segment_size = (int)(count % MAX_REQUEST_SIZE);
> -
> -    segreq->ref = segments_nr;
>       segreq->total = count;
> -    segreq->count = 0;
> -    segreq->failed = 0;
> -
> -    for (i = 0; i < segments_nr - 1; i++) {
> -        ret = archipelago_submit_request(s, i * MAX_REQUEST_SIZE,
> -                                           MAX_REQUEST_SIZE,
> -                                           offset + i * MAX_REQUEST_SIZE,
> -                                           aio_cb, segreq, op);
> -
> +    atomic_mb_set(&segreq->ref, segments_nr);
> +
> +    pos = 0;
> +    for (; segments_nr > 1; segments_nr--) {
> +        ret = archipelago_submit_request(s, pos,
> +                                         MAX_REQUEST_SIZE,
> +                                         offset + pos,
> +                                         aio_cb, segreq, op);
>           if (ret < 0) {
>               goto err_exit;
>           }
> +        count -= MAX_REQUEST_SIZE;
> +        pos += MAX_REQUEST_SIZE;
>       }
>   
> -    if ((segments_nr > 1) && last_segment_size) {
> -        ret = archipelago_submit_request(s, i * MAX_REQUEST_SIZE,
> -                                           last_segment_size,
> -                                           offset + i * MAX_REQUEST_SIZE,
> -                                           aio_cb, segreq, op);
> -    } else if ((segments_nr > 1) && !last_segment_size) {
> -        ret = archipelago_submit_request(s, i * MAX_REQUEST_SIZE,
> -                                           MAX_REQUEST_SIZE,
> -                                           offset + i * MAX_REQUEST_SIZE,
> -                                           aio_cb, segreq, op);
> -    } else if (segments_nr == 1) {
> -            ret = archipelago_submit_request(s, 0, count, offset, aio_cb,
> -                                               segreq, op);
> -    }
> -
> +    ret = archipelago_submit_request(s, pos, count,
> +                                     offset + pos,
> +                                     aio_cb, segreq, op);
>       if (ret < 0) {
>           goto err_exit;
>       }
> -
>       return 0;
>   
>   err_exit:
> -    __sync_add_and_fetch(&segreq->failed, 1);
> -    if (segments_nr == 1) {
> -        if (__sync_add_and_fetch(&segreq->ref, -1) == 0) {
> -            g_free(segreq);
> -        }
> -    } else {
> -        if ((__sync_add_and_fetch(&segreq->ref, -segments_nr + i)) == 0) {
> -            g_free(segreq);
> -        }
> +    segreq->failed = 1;
> +    if (atomic_fetch_sub(&segreq->ref, segments_nr) == segments_nr) {
> +        g_free(segreq);
>       }
>   
>       return ret;
>

      reply	other threads:[~2014-09-01 10:41 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-01  8:58 [Qemu-devel] [PATCH v1 1/2] Extend header file for atomic operations Chrysostomos Nanakos
2014-09-01  8:58 ` [Qemu-devel] [PATCH v1 2/2] block/archipelago: Use QEMU atomic builtins Chrysostomos Nanakos
2014-09-01  9:43   ` Paolo Bonzini
2014-09-01 10:13     ` Chrysostomos Nanakos
2014-09-01 10:33       ` Paolo Bonzini
2014-09-01 10:39         ` Chrysostomos Nanakos [this message]

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=54044CE0.4070500@grnet.gr \
    --to=cnanakos@grnet.gr \
    --cc=kwolf@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --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).