[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 15/26] block/archipelago: Use QEMU atomic builtins
From: |
Stefan Hajnoczi |
Subject: |
[Qemu-devel] [PULL 15/26] block/archipelago: Use QEMU atomic builtins |
Date: |
Fri, 5 Sep 2014 17:13:43 +0100 |
From: Chrysostomos Nanakos <address@hidden>
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 <address@hidden>
Signed-off-by: Stefan Hajnoczi <address@hidden>
---
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
- [Qemu-devel] [PULL 05/26] block: Always compile virtio-blk dataplane, (continued)
- [Qemu-devel] [PULL 05/26] block: Always compile virtio-blk dataplane, Stefan Hajnoczi, 2014/09/05
- [Qemu-devel] [PULL 06/26] tests: Functions bus_foreach and device_find from libqos virtio API, Stefan Hajnoczi, 2014/09/05
- [Qemu-devel] [PULL 07/26] tests: Add virtio device initialization, Stefan Hajnoczi, 2014/09/05
- [Qemu-devel] [PULL 08/26] libqos: Added basic virtqueue support to virtio implementation, Stefan Hajnoczi, 2014/09/05
- [Qemu-devel] [PULL 09/26] libqos: Added indirect descriptor support to virtio implementation, Stefan Hajnoczi, 2014/09/05
- [Qemu-devel] [PULL 10/26] libqos: Added test case for configuration changes in virtio-blk test, Stefan Hajnoczi, 2014/09/05
- [Qemu-devel] [PULL 11/26] libqos: Added MSI-X support, Stefan Hajnoczi, 2014/09/05
- [Qemu-devel] [PULL 12/26] libqos: Added EVENT_IDX support, Stefan Hajnoczi, 2014/09/05
- [Qemu-devel] [PULL 13/26] qemu-img: clarify src_cache option documentation, Stefan Hajnoczi, 2014/09/05
- [Qemu-devel] [PULL 14/26] qemu-img: fix rebase src_cache option documentation, Stefan Hajnoczi, 2014/09/05
- [Qemu-devel] [PULL 15/26] block/archipelago: Use QEMU atomic builtins,
Stefan Hajnoczi <=
- [Qemu-devel] [PULL 16/26] rename parse_enum_option to qapi_enum_parse and make it public, Stefan Hajnoczi, 2014/09/05
- [Qemu-devel] [PULL 19/26] MAINTAINERS: update sheepdog maintainer, Stefan Hajnoczi, 2014/09/05
- [Qemu-devel] [PULL 17/26] qemu-nbd: add option to set detect-zeroes mode, Stefan Hajnoczi, 2014/09/05
- [Qemu-devel] [PULL 18/26] qemu-nbd: fix indentation and coding style, Stefan Hajnoczi, 2014/09/05
- [Qemu-devel] [PULL 20/26] libqos: add a simple first-fit memory allocator, Stefan Hajnoczi, 2014/09/05
- [Qemu-devel] [PULL 22/26] ide: Add wwn support to IDE-ATAPI drive, Stefan Hajnoczi, 2014/09/05
- [Qemu-devel] [PULL 23/26] vmdk: fix vmdk_parse_extents() extent_file leaks, Stefan Hajnoczi, 2014/09/05
- [Qemu-devel] [PULL 24/26] vmdk: fix buf leak in vmdk_parse_extents(), Stefan Hajnoczi, 2014/09/05
- [Qemu-devel] [PULL 25/26] IDE: Fill the IDENTIFY request consistently, Stefan Hajnoczi, 2014/09/05
- [Qemu-devel] [PULL 26/26] ide: Add resize callback to ide/core, Stefan Hajnoczi, 2014/09/05