qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Stefan Hajnoczi <stefanha@redhat.com>
To: qemu-devel@nongnu.org
Cc: Chrysostomos Nanakos <cnanakos@grnet.gr>,
	Peter Maydell <peter.maydell@linaro.org>,
	Stefan Hajnoczi <stefanha@redhat.com>
Subject: [Qemu-devel] [PULL 13/24] block/archipelago: Use QEMU atomic builtins
Date: Mon,  8 Sep 2014 11:51:38 +0100	[thread overview]
Message-ID: <1410173509-26667-14-git-send-email-stefanha@redhat.com> (raw)
In-Reply-To: <1410173509-26667-1-git-send-email-stefanha@redhat.com>

From: Chrysostomos Nanakos <cnanakos@grnet.gr>

Replace __sync builtins with ones provided by QEMU
for atomic operations.

Special thanks goes to Paolo Bonzini for his refactoring
suggestion in order to use the already existing atomic builtins
interface.

Signed-off-by: Chrysostomos Nanakos <cnanakos@grnet.gr>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 block/archipelago.c | 76 ++++++++++++++++-------------------------------------
 1 file changed, 23 insertions(+), 53 deletions(-)

diff --git a/block/archipelago.c b/block/archipelago.c
index 34f72dc..22a7daa 100644
--- a/block/archipelago.c
+++ b/block/archipelago.c
@@ -57,6 +57,7 @@
 #include "qapi/qmp/qint.h"
 #include "qapi/qmp/qstring.h"
 #include "qapi/qmp/qjson.h"
+#include "qemu/atomic.h"
 
 #include <inttypes.h>
 #include <xseg/xseg.h>
@@ -214,7 +215,7 @@ static void xseg_request_handler(void *state)
 
                 xseg_put_request(s->xseg, req, s->srcport);
 
-                if ((__sync_add_and_fetch(&segreq->ref, -1)) == 0) {
+                if (atomic_fetch_dec(&segreq->ref) == 1) {
                     if (!segreq->failed) {
                         reqdata->aio_cb->ret = segreq->count;
                         archipelago_finish_aiocb(reqdata);
@@ -233,7 +234,7 @@ static void xseg_request_handler(void *state)
                 segreq->count += req->serviced;
                 xseg_put_request(s->xseg, req, s->srcport);
 
-                if ((__sync_add_and_fetch(&segreq->ref, -1)) == 0) {
+                if (atomic_fetch_dec(&segreq->ref) == 1) {
                     if (!segreq->failed) {
                         reqdata->aio_cb->ret = segreq->count;
                         archipelago_finish_aiocb(reqdata);
@@ -824,78 +825,47 @@ static int archipelago_aio_segmented_rw(BDRVArchipelagoState *s,
                                         ArchipelagoAIOCB *aio_cb,
                                         int op)
 {
-    int i, ret, segments_nr, last_segment_size;
+    int ret, segments_nr;
+    size_t pos = 0;
     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;
+    atomic_mb_set(&segreq->ref, segments_nr);
 
-    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);
+    while (segments_nr > 1) {
+        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;
+        segments_nr--;
     }
-
-    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;
 }
 
-- 
1.9.3

  parent reply	other threads:[~2014-09-08 10:52 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-08 10:51 [Qemu-devel] [PULL v2 00/24] Block patches Stefan Hajnoczi
2014-09-08 10:51 ` [Qemu-devel] [PULL 01/24] block: kill tail whitespace in block.c Stefan Hajnoczi
2014-09-08 10:51 ` [Qemu-devel] [PULL 02/24] pflash_cfi01: fixup stale DPRINTF() calls Stefan Hajnoczi
2014-09-08 10:51 ` [Qemu-devel] [PULL 03/24] pflash_cfi01: write flash contents to bdrv on incoming migration Stefan Hajnoczi
2014-09-08 10:51 ` [Qemu-devel] [PULL 04/24] tests: Functions bus_foreach and device_find from libqos virtio API Stefan Hajnoczi
2014-09-08 10:51 ` [Qemu-devel] [PULL 05/24] tests: Add virtio device initialization Stefan Hajnoczi
2014-09-08 10:51 ` [Qemu-devel] [PULL 06/24] libqos: Added basic virtqueue support to virtio implementation Stefan Hajnoczi
2014-09-08 10:51 ` [Qemu-devel] [PULL 07/24] libqos: Added indirect descriptor " Stefan Hajnoczi
2014-09-08 10:51 ` [Qemu-devel] [PULL 08/24] libqos: Added test case for configuration changes in virtio-blk test Stefan Hajnoczi
2014-09-08 10:51 ` [Qemu-devel] [PULL 09/24] libqos: Added MSI-X support Stefan Hajnoczi
2014-09-08 10:51 ` [Qemu-devel] [PULL 10/24] libqos: Added EVENT_IDX support Stefan Hajnoczi
2014-09-08 10:51 ` [Qemu-devel] [PULL 11/24] qemu-img: clarify src_cache option documentation Stefan Hajnoczi
2014-09-08 10:51 ` [Qemu-devel] [PULL 12/24] qemu-img: fix rebase " Stefan Hajnoczi
2014-09-08 10:51 ` Stefan Hajnoczi [this message]
2014-09-08 10:51 ` [Qemu-devel] [PULL 14/24] rename parse_enum_option to qapi_enum_parse and make it public Stefan Hajnoczi
2014-09-08 10:51 ` [Qemu-devel] [PULL 15/24] qemu-nbd: add option to set detect-zeroes mode Stefan Hajnoczi
2014-09-08 10:51 ` [Qemu-devel] [PULL 16/24] qemu-nbd: fix indentation and coding style Stefan Hajnoczi
2014-09-08 10:51 ` [Qemu-devel] [PULL 17/24] MAINTAINERS: update sheepdog maintainer Stefan Hajnoczi
2014-09-08 10:51 ` [Qemu-devel] [PULL 18/24] libqos: add a simple first-fit memory allocator Stefan Hajnoczi
2014-09-08 10:51 ` [Qemu-devel] [PULL 19/24] qtest/ide: Uninitialize PC allocator Stefan Hajnoczi
2014-09-08 10:51 ` [Qemu-devel] [PULL 20/24] ide: Add wwn support to IDE-ATAPI drive Stefan Hajnoczi
2014-09-08 10:51 ` [Qemu-devel] [PULL 21/24] vmdk: fix vmdk_parse_extents() extent_file leaks Stefan Hajnoczi
2014-09-08 10:51 ` [Qemu-devel] [PULL 22/24] vmdk: fix buf leak in vmdk_parse_extents() Stefan Hajnoczi
2014-09-08 10:51 ` [Qemu-devel] [PULL 23/24] IDE: Fill the IDENTIFY request consistently Stefan Hajnoczi
2014-09-08 10:51 ` [Qemu-devel] [PULL 24/24] ide: Add resize callback to ide/core Stefan Hajnoczi
2014-09-08 14:06 ` [Qemu-devel] [PULL v2 00/24] Block patches Peter Maydell

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=1410173509-26667-14-git-send-email-stefanha@redhat.com \
    --to=stefanha@redhat.com \
    --cc=cnanakos@grnet.gr \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    /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).