Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/813566/?format=api
{ "id": 813566, "url": "http://patchwork.ozlabs.org/api/patches/813566/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20170913181910.29688-7-mreitz@redhat.com/", "project": { "id": 14, "url": "http://patchwork.ozlabs.org/api/projects/14/?format=api", "name": "QEMU Development", "link_name": "qemu-devel", "list_id": "qemu-devel.nongnu.org", "list_email": "qemu-devel@nongnu.org", "web_url": "", "scm_url": "", "webscm_url": "", "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20170913181910.29688-7-mreitz@redhat.com>", "list_archive_url": null, "date": "2017-09-13T18:18:58", "name": "[06/18] block/mirror: Use CoQueue to wait on in-flight ops", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "b7808cbe861bfa23afef97d1d4046b6573e2c97e", "submitter": { "id": 36836, "url": "http://patchwork.ozlabs.org/api/people/36836/?format=api", "name": "Max Reitz", "email": "mreitz@redhat.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20170913181910.29688-7-mreitz@redhat.com/mbox/", "series": [ { "id": 2960, "url": "http://patchwork.ozlabs.org/api/series/2960/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=2960", "date": "2017-09-13T18:18:52", "name": "block/mirror: Add active-sync mirroring", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/2960/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/813566/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/813566/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>", "X-Original-To": "incoming@patchwork.ozlabs.org", "Delivered-To": "patchwork-incoming@bilbo.ozlabs.org", "Authentication-Results": [ "ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=nongnu.org\n\t(client-ip=2001:4830:134:3::11; helo=lists.gnu.org;\n\tenvelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n\treceiver=<UNKNOWN>)", "ext-mx09.extmail.prod.ext.phx2.redhat.com;\n\tdmarc=none (p=none dis=none) header.from=redhat.com", "ext-mx09.extmail.prod.ext.phx2.redhat.com;\n\tspf=fail smtp.mailfrom=mreitz@redhat.com" ], "Received": [ "from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11])\n\t(using TLSv1 with cipher AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xsqtx2953z9s3T\n\tfor <incoming@patchwork.ozlabs.org>;\n\tThu, 14 Sep 2017 04:29:13 +1000 (AEST)", "from localhost ([::1]:44036 helo=lists.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.71) (envelope-from\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>)\n\tid 1dsCPP-0006zj-7u\n\tfor incoming@patchwork.ozlabs.org; Wed, 13 Sep 2017 14:29:11 -0400", "from eggs.gnu.org ([2001:4830:134:3::10]:36762)\n\tby lists.gnu.org with esmtp (Exim 4.71)\n\t(envelope-from <mreitz@redhat.com>) id 1dsCGw-0008LA-G5\n\tfor qemu-devel@nongnu.org; Wed, 13 Sep 2017 14:20:27 -0400", "from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)\n\t(envelope-from <mreitz@redhat.com>) id 1dsCGv-0005FA-7y\n\tfor qemu-devel@nongnu.org; Wed, 13 Sep 2017 14:20:26 -0400", "from mx1.redhat.com ([209.132.183.28]:41576)\n\tby eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32)\n\t(Exim 4.71) (envelope-from <mreitz@redhat.com>)\n\tid 1dsCGo-0005Ac-KB; Wed, 13 Sep 2017 14:20:18 -0400", "from smtp.corp.redhat.com\n\t(int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13])\n\t(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby mx1.redhat.com (Postfix) with ESMTPS id B5B984ACA5;\n\tWed, 13 Sep 2017 18:20:17 +0000 (UTC)", "from localhost (ovpn-204-23.brq.redhat.com [10.40.204.23])\n\tby smtp.corp.redhat.com (Postfix) with ESMTPS id 5307060600;\n\tWed, 13 Sep 2017 18:20:10 +0000 (UTC)" ], "DMARC-Filter": "OpenDMARC Filter v1.3.2 mx1.redhat.com B5B984ACA5", "From": "Max Reitz <mreitz@redhat.com>", "To": "qemu-block@nongnu.org", "Date": "Wed, 13 Sep 2017 20:18:58 +0200", "Message-Id": "<20170913181910.29688-7-mreitz@redhat.com>", "In-Reply-To": "<20170913181910.29688-1-mreitz@redhat.com>", "References": "<20170913181910.29688-1-mreitz@redhat.com>", "X-Scanned-By": "MIMEDefang 2.79 on 10.5.11.13", "X-Greylist": "Sender IP whitelisted, not delayed by milter-greylist-4.5.16\n\t(mx1.redhat.com [10.5.110.38]);\n\tWed, 13 Sep 2017 18:20:17 +0000 (UTC)", "X-detected-operating-system": "by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]\n\t[fuzzy]", "X-Received-From": "209.132.183.28", "Subject": "[Qemu-devel] [PATCH 06/18] block/mirror: Use CoQueue to wait on\n\tin-flight ops", "X-BeenThere": "qemu-devel@nongnu.org", "X-Mailman-Version": "2.1.21", "Precedence": "list", "List-Id": "<qemu-devel.nongnu.org>", "List-Unsubscribe": "<https://lists.nongnu.org/mailman/options/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>", "List-Archive": "<http://lists.nongnu.org/archive/html/qemu-devel/>", "List-Post": "<mailto:qemu-devel@nongnu.org>", "List-Help": "<mailto:qemu-devel-request@nongnu.org?subject=help>", "List-Subscribe": "<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=subscribe>", "Cc": "Kevin Wolf <kwolf@redhat.com>, Fam Zheng <famz@redhat.com>,\n\tqemu-devel@nongnu.org, Max Reitz <mreitz@redhat.com>,\n\tStefan Hajnoczi <stefanha@redhat.com>, John Snow <jsnow@redhat.com>", "Errors-To": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org", "Sender": "\"Qemu-devel\"\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>" }, "content": "Attach a CoQueue to each in-flight operation so if we need to wait for\nany we can use it to wait instead of just blindly yielding and hoping\nfor some operation to wake us.\n\nA later patch will use this infrastructure to allow requests accessing\nthe same area of the virtual disk to specifically wait for each other.\n\nSigned-off-by: Max Reitz <mreitz@redhat.com>\n---\n block/mirror.c | 34 +++++++++++++++++++++++-----------\n 1 file changed, 23 insertions(+), 11 deletions(-)", "diff": "diff --git a/block/mirror.c b/block/mirror.c\nindex 2b3297aa61..81253fbad1 100644\n--- a/block/mirror.c\n+++ b/block/mirror.c\n@@ -13,6 +13,7 @@\n \n #include \"qemu/osdep.h\"\n #include \"qemu/cutils.h\"\n+#include \"qemu/coroutine.h\"\n #include \"trace.h\"\n #include \"block/blockjob_int.h\"\n #include \"block/block_int.h\"\n@@ -34,6 +35,8 @@ typedef struct MirrorBuffer {\n QSIMPLEQ_ENTRY(MirrorBuffer) next;\n } MirrorBuffer;\n \n+typedef struct MirrorOp MirrorOp;\n+\n typedef struct MirrorBlockJob {\n BlockJob common;\n RateLimit limit;\n@@ -67,15 +70,15 @@ typedef struct MirrorBlockJob {\n unsigned long *in_flight_bitmap;\n int in_flight;\n int64_t bytes_in_flight;\n+ QTAILQ_HEAD(MirrorOpList, MirrorOp) ops_in_flight;\n int ret;\n bool unmap;\n- bool waiting_for_io;\n int target_cluster_size;\n int max_iov;\n bool initial_zeroing_ongoing;\n } MirrorBlockJob;\n \n-typedef struct MirrorOp {\n+struct MirrorOp {\n MirrorBlockJob *s;\n QEMUIOVector qiov;\n int64_t offset;\n@@ -83,7 +86,11 @@ typedef struct MirrorOp {\n \n /* Set by mirror_co_read() before yielding for the first time */\n uint64_t bytes_copied;\n-} MirrorOp;\n+\n+ CoQueue waiting_requests;\n+\n+ QTAILQ_ENTRY(MirrorOp) next;\n+};\n \n typedef enum MirrorMethod {\n MIRROR_METHOD_COPY,\n@@ -124,7 +131,9 @@ static void coroutine_fn mirror_iteration_done(MirrorOp *op, int ret)\n \n chunk_num = op->offset / s->granularity;\n nb_chunks = DIV_ROUND_UP(op->bytes, s->granularity);\n+\n bitmap_clear(s->in_flight_bitmap, chunk_num, nb_chunks);\n+ QTAILQ_REMOVE(&s->ops_in_flight, op, next);\n if (ret >= 0) {\n if (s->cow_bitmap) {\n bitmap_set(s->cow_bitmap, chunk_num, nb_chunks);\n@@ -134,11 +143,9 @@ static void coroutine_fn mirror_iteration_done(MirrorOp *op, int ret)\n }\n }\n qemu_iovec_destroy(&op->qiov);\n- g_free(op);\n \n- if (s->waiting_for_io) {\n- qemu_coroutine_enter(s->common.co);\n- }\n+ qemu_co_queue_restart_all(&op->waiting_requests);\n+ g_free(op);\n }\n \n static void coroutine_fn mirror_write_complete(MirrorOp *op, int ret)\n@@ -233,10 +240,11 @@ static int mirror_cow_align(MirrorBlockJob *s, int64_t *offset,\n \n static inline void mirror_wait_for_io(MirrorBlockJob *s)\n {\n- assert(!s->waiting_for_io);\n- s->waiting_for_io = true;\n- qemu_coroutine_yield();\n- s->waiting_for_io = false;\n+ MirrorOp *op;\n+\n+ op = QTAILQ_FIRST(&s->ops_in_flight);\n+ assert(op);\n+ qemu_co_queue_wait(&op->waiting_requests, NULL);\n }\n \n /* Submit async read while handling COW.\n@@ -342,6 +350,7 @@ static unsigned mirror_perform(MirrorBlockJob *s, int64_t offset,\n .offset = offset,\n .bytes = bytes,\n };\n+ qemu_co_queue_init(&op->waiting_requests);\n \n switch (mirror_method) {\n case MIRROR_METHOD_COPY:\n@@ -357,6 +366,7 @@ static unsigned mirror_perform(MirrorBlockJob *s, int64_t offset,\n abort();\n }\n \n+ QTAILQ_INSERT_TAIL(&s->ops_in_flight, op, next);\n qemu_coroutine_enter(co);\n \n if (mirror_method == MIRROR_METHOD_COPY) {\n@@ -1292,6 +1302,8 @@ static void mirror_start_job(const char *job_id, BlockDriverState *bs,\n }\n }\n \n+ QTAILQ_INIT(&s->ops_in_flight);\n+\n trace_mirror_start(bs, s, opaque);\n block_job_start(&s->common);\n return;\n", "prefixes": [ "06/18" ] }