From nobody Fri May 17 19:38:05 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1597071256; cv=none; d=zohomail.com; s=zohoarc; b=CiR8g9SnqIowGCuhMulX4ssYEgmqO62e3PXMt5OA4Q9Nd5QchiN7faIc3pevXSkkGP4F4GZFQ3xNv9nYUbuCjljy6gEyfiKLlRkkBfFVPaoXs8kiE8KZy9RqTfmft+9ZSW9O6uXaM1uCbCQqdPtIVaUXvS9rQ2kbuNc8nudISTc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1597071256; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=fUU35fmTvueEKtvyq+0RhQHMv3e+2zdGNqGo+ouV00s=; b=F9K4rm7D/LDpHaBdQ3Vbt78EQ501n/djyY8M5PwrcxUivIrEWh2S4yfLhHC5xFwveo9+qrOGikW8RqwfTMZK60kBC/Ejt7q4gNY+94sXb5d8UBVr+3v0CFO7q9WqtLX1DXip3Oc5zE/b0rh49bzGfvh82Pybwt1F4Tr6BOkSikE= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1597071256199986.8965692126598; Mon, 10 Aug 2020 07:54:16 -0700 (PDT) Received: from localhost ([::1]:34952 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1k59Bm-0007cR-RT for importer@patchew.org; Mon, 10 Aug 2020 10:54:14 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:40744) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1k59B0-0006Vq-EG; Mon, 10 Aug 2020 10:53:26 -0400 Received: from szxga04-in.huawei.com ([45.249.212.190]:4171 helo=huawei.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1k59Ax-0002ii-JS; Mon, 10 Aug 2020 10:53:26 -0400 Received: from DGGEMS406-HUB.china.huawei.com (unknown [172.30.72.59]) by Forcepoint Email with ESMTP id AFB42ED14DB327769A69; Mon, 10 Aug 2020 22:53:07 +0800 (CST) Received: from DESKTOP-KKJBAGG.china.huawei.com (10.174.186.173) by DGGEMS406-HUB.china.huawei.com (10.3.19.206) with Microsoft SMTP Server id 14.3.487.0; Mon, 10 Aug 2020 22:53:00 +0800 From: Zhenyu Ye To: , Subject: [PATCH v1 1/2] util: introduce aio_context_acquire_timeout Date: Mon, 10 Aug 2020 22:52:45 +0800 Message-ID: <20200810145246.1049-2-yezhenyu2@huawei.com> X-Mailer: git-send-email 2.22.0.windows.1 In-Reply-To: <20200810145246.1049-1-yezhenyu2@huawei.com> References: <20200810145246.1049-1-yezhenyu2@huawei.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [10.174.186.173] X-CFilter-Loop: Reflected Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=45.249.212.190; envelope-from=yezhenyu2@huawei.com; helo=huawei.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/08/10 10:53:08 X-ACL-Warn: Detected OS = Linux 3.11 and newer [fuzzy] X-Spam_score_int: -41 X-Spam_score: -4.2 X-Spam_bar: ---- X-Spam_report: (-4.2 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_MED=-2.3, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, fam@euphon.net, yezhenyu2@huawei.com, armbru@redhat.com, xiexiangyou@huawei.com, mreitz@redhat.com, stefanha@redhat.com, pbonzini@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Currently we only have the aio_context_acquire() to take the ownership of the AioContext. If the mutex is locked by other threads, this function will wait util the mutex is released. Sometimes we may want to get some return values after waiting for some time. So introduce aio_context_acquire_timeout(), which will return ETIMEDOUT after @t seconds. This will be used in next patch. Signed-off-by: Zhenyu Ye --- include/block/aio.h | 5 +++++ include/qemu/thread-posix.h | 1 + include/qemu/thread.h | 1 + util/async.c | 10 ++++++++++ util/qemu-thread-posix.c | 6 ++++++ 5 files changed, 23 insertions(+) diff --git a/include/block/aio.h b/include/block/aio.h index b2f703fa3f..cb178cdf5a 100644 --- a/include/block/aio.h +++ b/include/block/aio.h @@ -287,6 +287,11 @@ void aio_context_unref(AioContext *ctx); */ void aio_context_acquire(AioContext *ctx); =20 +/* Add timeout to aio_context_acquire(). If the time for obtaining + * the lock exceeds @t, return ETIMEDOUT. + */ +int aio_context_acquire_timeout(AioContext *ctx, int t); + /* Relinquish ownership of the AioContext. */ void aio_context_release(AioContext *ctx); =20 diff --git a/include/qemu/thread-posix.h b/include/qemu/thread-posix.h index c903525062..2e62181959 100644 --- a/include/qemu/thread-posix.h +++ b/include/qemu/thread-posix.h @@ -9,6 +9,7 @@ typedef QemuMutex QemuRecMutex; #define qemu_rec_mutex_lock_impl qemu_mutex_lock_impl #define qemu_rec_mutex_trylock_impl qemu_mutex_trylock_impl #define qemu_rec_mutex_unlock qemu_mutex_unlock +#define qemu_rec_mutex_timed_lock qemu_mutex_timed_lock =20 struct QemuMutex { pthread_mutex_t lock; diff --git a/include/qemu/thread.h b/include/qemu/thread.h index 4baf4d1715..7a96a5df2a 100644 --- a/include/qemu/thread.h +++ b/include/qemu/thread.h @@ -27,6 +27,7 @@ void qemu_mutex_destroy(QemuMutex *mutex); int qemu_mutex_trylock_impl(QemuMutex *mutex, const char *file, const int = line); void qemu_mutex_lock_impl(QemuMutex *mutex, const char *file, const int li= ne); void qemu_mutex_unlock_impl(QemuMutex *mutex, const char *file, const int = line); +int qemu_mutex_timed_lock(QemuMutex *mutex, const struct timespec *tsptr); =20 typedef void (*QemuMutexLockFunc)(QemuMutex *m, const char *f, int l); typedef int (*QemuMutexTrylockFunc)(QemuMutex *m, const char *f, int l); diff --git a/util/async.c b/util/async.c index 1319eee3bc..c478d3dbf5 100644 --- a/util/async.c +++ b/util/async.c @@ -605,6 +605,16 @@ void aio_context_acquire(AioContext *ctx) qemu_rec_mutex_lock(&ctx->lock); } =20 +int aio_context_acquire_timeout(AioContext *ctx, int t) +{ + struct timespec tout; + + clock_gettime(CLOCK_REALTIME, &tout); + tout.tv_sec +=3D t; + + return qemu_rec_mutex_timed_lock(&ctx->lock, &tout); +} + void aio_context_release(AioContext *ctx) { qemu_rec_mutex_unlock(&ctx->lock); diff --git a/util/qemu-thread-posix.c b/util/qemu-thread-posix.c index b4c2359272..49fb98a2e8 100644 --- a/util/qemu-thread-posix.c +++ b/util/qemu-thread-posix.c @@ -82,6 +82,12 @@ void qemu_mutex_lock_impl(QemuMutex *mutex, const char *= file, const int line) qemu_mutex_post_lock(mutex, file, line); } =20 +int qemu_mutex_timed_lock(QemuMutex *mutex, const struct timespec *tsptr) +{ + assert(mutex->initialized); + return pthread_mutex_timedlock(&mutex->lock, tsptr); +} + int qemu_mutex_trylock_impl(QemuMutex *mutex, const char *file, const int = line) { int err; --=20 2.22.0.windows.1 From nobody Fri May 17 19:38:05 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1597071256; cv=none; d=zohomail.com; s=zohoarc; b=dJiDRLnMVAIP6Q6Q+V+iyeidixB13CvixqW277Yh30AZoeGyCHkAHL5qHNw9q9KWKEXECAur83TQUl9F7zOdi3U9xMp2jJ6r8Fjz78huJzEDYb4b92IpHvr51BICznr9i2fNDNrmzFbEMEIxnpkyPa+JG5NgMO8SU3hCfPukRb0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1597071256; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=aGjWEt8rDL/9oc812GVpvVyvDP6zQ7VCOiaPWC6K2Lw=; b=Bnsfgq6oUYkHFSoLtjGTqFdp0mkgNPOIle5+JM9ClJQewJCP6jhKFCm0n52eygzwStVUQ/8pLnwub+cKFEtgGbteJEXvoHA57CTh6dVcX6fni6m14PKtFtn2LTGd+kweQPAGyQAxAkqTEfPt4k1ncEOOyZTlyHnNMnVVO5vaIJU= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1597071256060458.51081355875385; Mon, 10 Aug 2020 07:54:16 -0700 (PDT) Received: from localhost ([::1]:34870 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1k59Bl-0007aV-Ot for importer@patchew.org; Mon, 10 Aug 2020 10:54:13 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:40714) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1k59Ay-0006Vf-Ur; Mon, 10 Aug 2020 10:53:24 -0400 Received: from szxga04-in.huawei.com ([45.249.212.190]:4173 helo=huawei.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1k59Aw-0002ik-Ju; Mon, 10 Aug 2020 10:53:24 -0400 Received: from DGGEMS406-HUB.china.huawei.com (unknown [172.30.72.59]) by Forcepoint Email with ESMTP id A943CC12641990921B60; Mon, 10 Aug 2020 22:53:07 +0800 (CST) Received: from DESKTOP-KKJBAGG.china.huawei.com (10.174.186.173) by DGGEMS406-HUB.china.huawei.com (10.3.19.206) with Microsoft SMTP Server id 14.3.487.0; Mon, 10 Aug 2020 22:53:01 +0800 From: Zhenyu Ye To: , Subject: [PATCH v1 2/2] qmp: use aio_context_acquire_timeout replace aio_context_acquire Date: Mon, 10 Aug 2020 22:52:46 +0800 Message-ID: <20200810145246.1049-3-yezhenyu2@huawei.com> X-Mailer: git-send-email 2.22.0.windows.1 In-Reply-To: <20200810145246.1049-1-yezhenyu2@huawei.com> References: <20200810145246.1049-1-yezhenyu2@huawei.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [10.174.186.173] X-CFilter-Loop: Reflected Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=45.249.212.190; envelope-from=yezhenyu2@huawei.com; helo=huawei.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/08/10 10:53:08 X-ACL-Warn: Detected OS = Linux 3.11 and newer [fuzzy] X-Spam_score_int: -41 X-Spam_score: -4.2 X-Spam_bar: ---- X-Spam_report: (-4.2 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_MED=-2.3, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, fam@euphon.net, yezhenyu2@huawei.com, armbru@redhat.com, xiexiangyou@huawei.com, mreitz@redhat.com, stefanha@redhat.com, pbonzini@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Before doing qmp actions, we need to lock the qemu_global_mutex, so the qmp actions should not take too long time. Unfortunately, some qmp actions need to acquire aio context and this may take a long time. So replace aio_context_acquire() by aio_context_acquire_timeout() and return ETIMEDOUT if the waiting time exceeds LOCK_TIMEOUT (default set to 3 seconds). Signed-off-by: Zhenyu Ye --- block/qapi-sysemu.c | 7 ++++++- block/qapi.c | 6 +++++- blockdev.c | 35 ++++++++++++++++++++++++++++++----- include/block/aio.h | 1 + 4 files changed, 42 insertions(+), 7 deletions(-) diff --git a/block/qapi-sysemu.c b/block/qapi-sysemu.c index 8498402ad4..e7cd7d3c70 100644 --- a/block/qapi-sysemu.c +++ b/block/qapi-sysemu.c @@ -439,6 +439,7 @@ void qmp_block_set_io_throttle(BlockIOThrottle *arg, Er= ror **errp) BlockDriverState *bs; BlockBackend *blk; AioContext *aio_context; + int ret; =20 blk =3D qmp_get_blk(arg->has_device ? arg->device : NULL, arg->has_id ? arg->id : NULL, @@ -448,7 +449,11 @@ void qmp_block_set_io_throttle(BlockIOThrottle *arg, E= rror **errp) } =20 aio_context =3D blk_get_aio_context(blk); - aio_context_acquire(aio_context); + ret =3D aio_context_acquire_timeout(aio_context, LOCK_TIMEOUT); + if (ret) { + error_setg_errno(errp, ret, "acquire aio context failed"); + return; + } =20 bs =3D blk_bs(blk); if (!bs) { diff --git a/block/qapi.c b/block/qapi.c index afd9f3b4a7..ff2454daff 100644 --- a/block/qapi.c +++ b/block/qapi.c @@ -271,7 +271,11 @@ void bdrv_query_image_info(BlockDriverState *bs, Error *err =3D NULL; ImageInfo *info; =20 - aio_context_acquire(bdrv_get_aio_context(bs)); + ret =3D aio_context_acquire_timeout(bdrv_get_aio_context(bs), LOCK_TIM= EOUT); + if (ret) { + error_setg_errno(errp, ret, "acquire aio context failed"); + return; + } =20 size =3D bdrv_getlength(bs); if (size < 0) { diff --git a/blockdev.c b/blockdev.c index 3848a9c8ab..ce133c89e2 100644 --- a/blockdev.c +++ b/blockdev.c @@ -2431,6 +2431,7 @@ void qmp_block_resize(bool has_device, const char *de= vice, BlockBackend *blk =3D NULL; BlockDriverState *bs; AioContext *aio_context; + int ret; =20 bs =3D bdrv_lookup_bs(has_device ? device : NULL, has_node_name ? node_name : NULL, @@ -2441,7 +2442,11 @@ void qmp_block_resize(bool has_device, const char *d= evice, } =20 aio_context =3D bdrv_get_aio_context(bs); - aio_context_acquire(aio_context); + ret =3D aio_context_acquire_timeout(aio_context, LOCK_TIMEOUT); + if (ret) { + error_setg_errno(errp, ret, "acquire aio context failed"); + return; + } =20 if (size < 0) { error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "size", "a >0 size"= ); @@ -3016,7 +3021,11 @@ void qmp_drive_mirror(DriveMirror *arg, Error **errp) } =20 aio_context =3D bdrv_get_aio_context(bs); - aio_context_acquire(aio_context); + ret =3D aio_context_acquire_timeout(aio_context, LOCK_TIMEOUT); + if (ret) { + error_setg_errno(errp, ret, "acquire aio context failed"); + return; + } =20 if (!arg->has_mode) { arg->mode =3D NEW_IMAGE_MODE_ABSOLUTE_PATHS; @@ -3184,12 +3193,20 @@ void qmp_blockdev_mirror(bool has_job_id, const cha= r *job_id, /* Honor bdrv_try_set_aio_context() context acquisition requirements. = */ old_context =3D bdrv_get_aio_context(target_bs); aio_context =3D bdrv_get_aio_context(bs); - aio_context_acquire(old_context); + ret =3D aio_context_acquire_timeout(old_context, LOCK_TIMEOUT); + if (ret) { + error_setg_errno(errp, ret, "acquire aio context failed"); + return; + } =20 ret =3D bdrv_try_set_aio_context(target_bs, aio_context, errp); =20 aio_context_release(old_context); - aio_context_acquire(aio_context); + ret =3D aio_context_acquire_timeout(aio_context, LOCK_TIMEOUT); + if (ret) { + error_setg_errno(errp, ret, "acquire aio context failed"); + return; + } =20 if (ret < 0) { goto out; @@ -3603,6 +3620,7 @@ BlockJobInfoList *qmp_query_block_jobs(Error **errp) { BlockJobInfoList *head =3D NULL, **p_next =3D &head; BlockJob *job; + int ret; =20 for (job =3D block_job_next(NULL); job; job =3D block_job_next(job)) { BlockJobInfoList *elem; @@ -3613,7 +3631,14 @@ BlockJobInfoList *qmp_query_block_jobs(Error **errp) } elem =3D g_new0(BlockJobInfoList, 1); aio_context =3D blk_get_aio_context(job->blk); - aio_context_acquire(aio_context); + ret =3D aio_context_acquire_timeout(aio_context, LOCK_TIMEOUT); + if (ret) { + g_free(elem); + qapi_free_BlockJobInfoList(head); + error_setg_errno(errp, ret, "acquire aio context failed"); + return NULL; + } + elem->value =3D block_job_query(job, errp); aio_context_release(aio_context); if (!elem->value) { diff --git a/include/block/aio.h b/include/block/aio.h index cb178cdf5a..539096f547 100644 --- a/include/block/aio.h +++ b/include/block/aio.h @@ -290,6 +290,7 @@ void aio_context_acquire(AioContext *ctx); /* Add timeout to aio_context_acquire(). If the time for obtaining * the lock exceeds @t, return ETIMEDOUT. */ +#define LOCK_TIMEOUT 3 int aio_context_acquire_timeout(AioContext *ctx, int t); =20 /* Relinquish ownership of the AioContext. */ --=20 2.22.0.windows.1