Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/813723/?format=api
{ "id": 813723, "url": "http://patchwork.ozlabs.org/api/patches/813723/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/1505375436-28439-2-git-send-email-peterx@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": "<1505375436-28439-2-git-send-email-peterx@redhat.com>", "list_archive_url": null, "date": "2017-09-14T07:50:22", "name": "[RFC,01/15] char-io: fix possible race on IOWatchPoll", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "ec219ae99d48055fcce5eb1a07d3eed1b4dcf6d9", "submitter": { "id": 67717, "url": "http://patchwork.ozlabs.org/api/people/67717/?format=api", "name": "Peter Xu", "email": "peterx@redhat.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/1505375436-28439-2-git-send-email-peterx@redhat.com/mbox/", "series": [ { "id": 3043, "url": "http://patchwork.ozlabs.org/api/series/3043/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=3043", "date": "2017-09-14T07:50:21", "name": "QMP: out-of-band (OOB) execution support", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/3043/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/813723/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/813723/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-mx10.extmail.prod.ext.phx2.redhat.com;\n\tdmarc=none (p=none dis=none) header.from=redhat.com", "ext-mx10.extmail.prod.ext.phx2.redhat.com;\n\tspf=fail smtp.mailfrom=peterx@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 3xt9j232M5z9sRm\n\tfor <incoming@patchwork.ozlabs.org>;\n\tThu, 14 Sep 2017 17:51:50 +1000 (AEST)", "from localhost ([::1]:46186 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 1dsOw8-0006A0-Ea\n\tfor incoming@patchwork.ozlabs.org; Thu, 14 Sep 2017 03:51:48 -0400", "from eggs.gnu.org ([2001:4830:134:3::10]:51620)\n\tby lists.gnu.org with esmtp (Exim 4.71)\n\t(envelope-from <peterx@redhat.com>) id 1dsOvK-00063v-Md\n\tfor qemu-devel@nongnu.org; Thu, 14 Sep 2017 03:50:59 -0400", "from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)\n\t(envelope-from <peterx@redhat.com>) id 1dsOvJ-0006Sf-Mr\n\tfor qemu-devel@nongnu.org; Thu, 14 Sep 2017 03:50:58 -0400", "from mx1.redhat.com ([209.132.183.28]:37266)\n\tby eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32)\n\t(Exim 4.71) (envelope-from <peterx@redhat.com>) id 1dsOvJ-0006Rs-8O\n\tfor qemu-devel@nongnu.org; Thu, 14 Sep 2017 03:50:57 -0400", "from smtp.corp.redhat.com\n\t(int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12])\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 43B6A5F7B0;\n\tThu, 14 Sep 2017 07:50:56 +0000 (UTC)", "from pxdev.xzpeter.org.com (dhcp-15-224.nay.redhat.com\n\t[10.66.15.224])\n\tby smtp.corp.redhat.com (Postfix) with ESMTP id 638FD60F9F;\n\tThu, 14 Sep 2017 07:50:52 +0000 (UTC)" ], "DMARC-Filter": "OpenDMARC Filter v1.3.2 mx1.redhat.com 43B6A5F7B0", "From": "Peter Xu <peterx@redhat.com>", "To": "qemu-devel@nongnu.org", "Date": "Thu, 14 Sep 2017 15:50:22 +0800", "Message-Id": "<1505375436-28439-2-git-send-email-peterx@redhat.com>", "In-Reply-To": "<1505375436-28439-1-git-send-email-peterx@redhat.com>", "References": "<1505375436-28439-1-git-send-email-peterx@redhat.com>", "MIME-Version": "1.0", "Content-Type": "text/plain; charset=UTF-8", "X-Scanned-By": "MIMEDefang 2.79 on 10.5.11.12", "X-Greylist": "Sender IP whitelisted, not delayed by milter-greylist-4.5.16\n\t(mx1.redhat.com [10.5.110.39]);\n\tThu, 14 Sep 2017 07:50:56 +0000 (UTC)", "Content-Transfer-Encoding": "quoted-printable", "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] [RFC 01/15] char-io: fix possible race on IOWatchPoll", "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": "Laurent Vivier <lvivier@redhat.com>, Fam Zheng <famz@redhat.com>, Juan\n\tQuintela <quintela@redhat.com>, Markus Armbruster <armbru@redhat.com>,\n\tpeterx@redhat.com, mdroth@linux.vnet.ibm.com,\n\tStefan Hajnoczi <shajnocz@redhat.com>, =?utf-8?q?Marc-Andr=C3=A9_Lure?=\n\t=?utf-8?q?au?= <marcandre.lureau@gmail.com>,\n\tPaolo Bonzini <pbonzini@redhat.com>, \"Dr . David Alan Gilbert\"\n\t<dgilbert@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": "This is not a problem if we are only having one single loop thread like\nbefore. However, after per-monitor thread is introduced, this is not\ntrue any more, and the race can happen.\n\nThe race can be triggered with \"make check -j8\" sometimes:\n\n qemu-system-x86_64: /root/git/qemu/chardev/char-io.c:91:\n io_watch_poll_finalize: Assertion `iwp->src == NULL' failed.\n\nThis patch keeps the reference for the watch object when creating in\nio_add_watch_poll(), so that the object will never be released in the\ncontext main loop, especially when the context loop is running in\nanother standalone thread. Meanwhile, when we want to remove the watch\nobject, we always first detach the watch object from its owner context,\nthen we continue with the cleanup.\n\nWithout this patch, calling io_remove_watch_poll() in main loop thread\nis not thread-safe, since the other per-monitor thread may be modifying\nthe watch object at the same time.\n\nReviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>\nSigned-off-by: Peter Xu <peterx@redhat.com>\n---\n chardev/char-io.c | 15 +++++++++++++--\n 1 file changed, 13 insertions(+), 2 deletions(-)", "diff": "diff --git a/chardev/char-io.c b/chardev/char-io.c\nindex f810524..3828c20 100644\n--- a/chardev/char-io.c\n+++ b/chardev/char-io.c\n@@ -122,7 +122,6 @@ GSource *io_add_watch_poll(Chardev *chr,\n g_free(name);\n \n g_source_attach(&iwp->parent, context);\n- g_source_unref(&iwp->parent);\n return (GSource *)iwp;\n }\n \n@@ -131,12 +130,24 @@ static void io_remove_watch_poll(GSource *source)\n IOWatchPoll *iwp;\n \n iwp = io_watch_poll_from_source(source);\n+\n+ /*\n+ * Here the order of destruction really matters. We need to first\n+ * detach the IOWatchPoll object from the context (which may still\n+ * be running in another loop thread), only after that could we\n+ * continue to operate on iwp->src, or there may be race condition\n+ * between current thread and the context loop thread.\n+ *\n+ * Let's blame the glib bug mentioned in commit 2b3167 (again) for\n+ * this extra complexity.\n+ */\n+ g_source_destroy(&iwp->parent);\n if (iwp->src) {\n g_source_destroy(iwp->src);\n g_source_unref(iwp->src);\n iwp->src = NULL;\n }\n- g_source_destroy(&iwp->parent);\n+ g_source_unref(&iwp->parent);\n }\n \n void remove_fd_in_watch(Chardev *chr)\n", "prefixes": [ "RFC", "01/15" ] }