From nobody Wed Oct 22 13:01:17 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1519795231052483.58099226944466; Tue, 27 Feb 2018 21:20:31 -0800 (PST) Received: from localhost ([::1]:42304 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1equA8-0001R1-9y for importer@patchew.org; Wed, 28 Feb 2018 00:20:20 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33697) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eqtxi-0008LV-Vc for qemu-devel@nongnu.org; Wed, 28 Feb 2018 00:07:32 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eqtxh-0000rT-Un for qemu-devel@nongnu.org; Wed, 28 Feb 2018 00:07:30 -0500 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:49542 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1eqtxh-0000qO-QI for qemu-devel@nongnu.org; Wed, 28 Feb 2018 00:07:29 -0500 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7D3D1402290A for ; Wed, 28 Feb 2018 05:07:29 +0000 (UTC) Received: from xz-mi.redhat.com (ovpn-12-95.pek2.redhat.com [10.72.12.95]) by smtp.corp.redhat.com (Postfix) with ESMTP id 407562024CA6; Wed, 28 Feb 2018 05:07:25 +0000 (UTC) From: Peter Xu To: qemu-devel@nongnu.org Date: Wed, 28 Feb 2018 13:06:31 +0800 Message-Id: <20180228050633.7410-13-peterx@redhat.com> In-Reply-To: <20180228050633.7410-1-peterx@redhat.com> References: <20180228050633.7410-1-peterx@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.6]); Wed, 28 Feb 2018 05:07:29 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.6]); Wed, 28 Feb 2018 05:07:29 +0000 (UTC) for IP:'10.11.54.4' DOMAIN:'int-mx04.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'peterx@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH 12/14] qio: move QIOTaskThreadData into QIOTask X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Juan Quintela , Markus Armbruster , peterx@redhat.com, "Dr . David Alan Gilbert" , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Paolo Bonzini Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The major reason to do this is that, after the upper level can cache the QIOTask, it should also be able to further manage the QIOTask. And, it can't if it does not have the information in QIOTaskThreadData. So let's just merge this struct with QIOTask. Actually by doing this, it'll simplify the code a bit too. This will be needed in the next patch, when we want to rebuild the completion GSource when the GMainContext changed. Signed-off-by: Peter Xu --- io/task.c | 46 ++++++++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/io/task.c b/io/task.c index 00d3a5096a..080f9560ea 100644 --- a/io/task.c +++ b/io/task.c @@ -24,6 +24,13 @@ #include "qemu/thread.h" #include "trace.h" =20 +struct QIOTaskThreadData { + QIOTaskWorker worker; + gpointer opaque; + GDestroyNotify destroy; +}; +typedef struct QIOTaskThreadData QIOTaskThreadData; + struct QIOTask { Object *source; QIOTaskFunc func; @@ -37,6 +44,7 @@ struct QIOTask { /* Threaded QIO task specific fields */ GSource *idle_source; /* The idle task to run complete routine */ GMainContext *context; /* The context that idle task will run with */ + QIOTaskThreadData thread_data; }; =20 =20 @@ -86,26 +94,25 @@ static void qio_task_free(QIOTask *task) } =20 =20 -struct QIOTaskThreadData { - QIOTask *task; - QIOTaskWorker worker; - gpointer opaque; - GDestroyNotify destroy; -}; - - static gboolean qio_task_thread_result(gpointer opaque) { - struct QIOTaskThreadData *data =3D opaque; + QIOTask *task =3D opaque; + QIOTaskThreadData *data =3D &task->thread_data; =20 - trace_qio_task_thread_result(data->task); - qio_task_complete(data->task); + /* + * Take one more refcount since qio_task_complete() may otherwise + * release the last refcount and free, then "data" may be invalid. + */ + qio_task_ref(task); + + trace_qio_task_thread_result(task); + qio_task_complete(task); =20 if (data->destroy) { data->destroy(data->opaque); } =20 - g_free(data); + qio_task_unref(task); =20 return FALSE; } @@ -113,19 +120,19 @@ static gboolean qio_task_thread_result(gpointer opaqu= e) =20 static gpointer qio_task_thread_worker(gpointer opaque) { - struct QIOTaskThreadData *data =3D opaque; - QIOTask *task =3D data->task; + QIOTask *task =3D opaque; + QIOTaskThreadData *data =3D &task->thread_data; GSource *idle; =20 - trace_qio_task_thread_run(data->task); - data->worker(data->task, data->opaque); + trace_qio_task_thread_run(task); + data->worker(task, data->opaque); =20 /* We're running in the background thread, and must only * ever report the task results in the main event loop * thread. So we schedule an idle callback to report * the worker results */ - trace_qio_task_thread_exit(data->task); + trace_qio_task_thread_exit(task); =20 idle =3D g_idle_source_new(); g_source_set_callback(idle, qio_task_thread_result, data, NULL); @@ -142,15 +149,14 @@ void qio_task_run_in_thread(QIOTask *task, GDestroyNotify destroy, GMainContext *context) { - struct QIOTaskThreadData *data =3D g_new0(struct QIOTaskThreadData, 1); QemuThread thread; + QIOTaskThreadData *data =3D &task->thread_data; =20 if (context) { g_main_context_ref(context); task->context =3D context; } =20 - data->task =3D task; data->worker =3D worker; data->opaque =3D opaque; data->destroy =3D destroy; @@ -159,7 +165,7 @@ void qio_task_run_in_thread(QIOTask *task, qemu_thread_create(&thread, "io-task-worker", qio_task_thread_worker, - data, + task, QEMU_THREAD_DETACHED); } =20 --=20 2.14.3