From nobody Mon May 13 22:42:22 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; 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; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1652195984; cv=none; d=zohomail.com; s=zohoarc; b=j40lJoy+Wr72mQSj4XxuBFPuEwkysovtTGCYBJpsGvmqlUJI13+FPSR+tO8mytiPa6Kcsw1xteuB65CIZJ/I5fNXBpG+Tf0xKJT0VW0jjag8v/q6DqCSw/puoFhH2WMhqJojzmziRFzI7ZrBPT+svsOILXCbzo+zZjhpC1nL5wo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1652195984; h=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=w6bR2CMU/qWOjJ7v5X/qMDwGRLOSZAFvuettfkW6gpM=; b=IE8nyXYAmVQLPHrPTRSq4sj52fqQEPhgkbc4FYbApd8RBsiOwsAsyQtUAZK8rBo6KaNcaUu+JseSQjnwYBqnTe3rsqUCGZCTTgycTbrs0SXiUhp6f9fgkzFyamVcNOVW7KKAwD21LpSznQJQ3nnW0UgxrA5MEXV76reYOBmcTzw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1652195984810707.2707225857306; Tue, 10 May 2022 08:19:44 -0700 (PDT) Received: from localhost ([::1]:49944 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1noReJ-0002NR-Ap for importer@patchew.org; Tue, 10 May 2022 11:19:43 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:60602) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1noRWB-0000Bj-4g for qemu-devel@nongnu.org; Tue, 10 May 2022 11:11:20 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:27580) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1noRW9-0002t8-II for qemu-devel@nongnu.org; Tue, 10 May 2022 11:11:18 -0400 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-362-EcDnoPLHMhCe_3-uFucp1A-1; Tue, 10 May 2022 11:11:14 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id D13DC83FCE5; Tue, 10 May 2022 15:11:00 +0000 (UTC) Received: from merkur.redhat.com (unknown [10.39.194.149]) by smtp.corp.redhat.com (Postfix) with ESMTP id 8D5F29E84; Tue, 10 May 2022 15:10:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1652195475; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=w6bR2CMU/qWOjJ7v5X/qMDwGRLOSZAFvuettfkW6gpM=; b=aBzPQUpf4MIgfVggAvFsdVZgLAmBm+66ma8dwgkE5hVnXtFGWFid6AYG822iu3XMs5KxC0 zrS6FAWtLhMLt8Q9TmM7L1Cw92gWlr0j/sJrf0VbjS3Yum5pLtXg6iQiSByUDfDqiv/2jj CGJ4M2HSHWdMqAFtlL0ByK0ZfpJyO7o= X-MC-Unique: EcDnoPLHMhCe_3-uFucp1A-1 From: Kevin Wolf To: qemu-block@nongnu.org Cc: kwolf@redhat.com, stefanha@redhat.com, hnarukaw@yahoo-corp.jp, qemu-devel@nongnu.org, qemu-stable@nongnu.org Subject: [PATCH 1/2] coroutine: Rename qemu_coroutine_inc/dec_pool_size() Date: Tue, 10 May 2022 17:10:19 +0200 Message-Id: <20220510151020.105528-2-kwolf@redhat.com> In-Reply-To: <20220510151020.105528-1-kwolf@redhat.com> References: <20220510151020.105528-1-kwolf@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 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=170.10.133.124; envelope-from=kwolf@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -28 X-Spam_score: -2.9 X-Spam_bar: -- X-Spam_report: (-2.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.082, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1652195986007100001 Content-Type: text/plain; charset="utf-8" It's true that these functions currently affect the batch size in which coroutines are reused (i.e. moved from the global release pool to the allocation pool of a specific thread), but this is a bug and will be fixed in a separate patch. In fact, the comment in the header file already just promises that it influences the pool size, so reflect this in the name of the functions. As a nice side effect, the shorter function name makes some line wrapping unnecessary. Cc: qemu-stable@nongnu.org Signed-off-by: Kevin Wolf --- include/qemu/coroutine.h | 6 +++--- hw/block/virtio-blk.c | 6 ++---- util/qemu-coroutine.c | 4 ++-- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/include/qemu/coroutine.h b/include/qemu/coroutine.h index 284571badb..031cf23711 100644 --- a/include/qemu/coroutine.h +++ b/include/qemu/coroutine.h @@ -334,12 +334,12 @@ void coroutine_fn yield_until_fd_readable(int fd); /** * Increase coroutine pool size */ -void qemu_coroutine_increase_pool_batch_size(unsigned int additional_pool_= size); +void qemu_coroutine_inc_pool_size(unsigned int additional_pool_size); =20 /** - * Devcrease coroutine pool size + * Decrease coroutine pool size */ -void qemu_coroutine_decrease_pool_batch_size(unsigned int additional_pool_= size); +void qemu_coroutine_dec_pool_size(unsigned int additional_pool_size); =20 #include "qemu/lockable.h" =20 diff --git a/hw/block/virtio-blk.c b/hw/block/virtio-blk.c index 540c38f829..6a1cc41877 100644 --- a/hw/block/virtio-blk.c +++ b/hw/block/virtio-blk.c @@ -1215,8 +1215,7 @@ static void virtio_blk_device_realize(DeviceState *de= v, Error **errp) for (i =3D 0; i < conf->num_queues; i++) { virtio_add_queue(vdev, conf->queue_size, virtio_blk_handle_output); } - qemu_coroutine_increase_pool_batch_size(conf->num_queues * conf->queue= _size - / 2); + qemu_coroutine_inc_pool_size(conf->num_queues * conf->queue_size / 2); virtio_blk_data_plane_create(vdev, conf, &s->dataplane, &err); if (err !=3D NULL) { error_propagate(errp, err); @@ -1253,8 +1252,7 @@ static void virtio_blk_device_unrealize(DeviceState *= dev) for (i =3D 0; i < conf->num_queues; i++) { virtio_del_queue(vdev, i); } - qemu_coroutine_decrease_pool_batch_size(conf->num_queues * conf->queue= _size - / 2); + qemu_coroutine_dec_pool_size(conf->num_queues * conf->queue_size / 2); qemu_del_vm_change_state_handler(s->change); blockdev_mark_auto_del(s->blk); virtio_cleanup(vdev); diff --git a/util/qemu-coroutine.c b/util/qemu-coroutine.c index f3e8300c8d..ea23929a74 100644 --- a/util/qemu-coroutine.c +++ b/util/qemu-coroutine.c @@ -212,12 +212,12 @@ AioContext *coroutine_fn qemu_coroutine_get_aio_conte= xt(Coroutine *co) return co->ctx; } =20 -void qemu_coroutine_increase_pool_batch_size(unsigned int additional_pool_= size) +void qemu_coroutine_inc_pool_size(unsigned int additional_pool_size) { qatomic_add(&pool_batch_size, additional_pool_size); } =20 -void qemu_coroutine_decrease_pool_batch_size(unsigned int removing_pool_si= ze) +void qemu_coroutine_dec_pool_size(unsigned int removing_pool_size) { qatomic_sub(&pool_batch_size, removing_pool_size); } --=20 2.35.3 From nobody Mon May 13 22:42:22 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; 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; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1652195775; cv=none; d=zohomail.com; s=zohoarc; b=V7ZWUhfu63iNoEvRrbfx2ecFMX3qC8FGg6yygsk54ia2snbjy7l0W97iGs83CyCmCkW0Ij7ksqGH4VHG3RPCIpKwUFwOfGXRTrktixODhUrPUPQXw7Q1W1ui2pM8WLba8jT+9tVkzVgRgonQuAvpq10Mo/izZ3DpxczB+RD18gs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1652195775; h=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=CfoIFrxu+5MlSYRXI6HehGB0WDw/rAF+N9LSQNJ9/dM=; b=bhwC6iq/U96ZDtfdfjalQVStO8fq7RBznFBryozLl9mcAtyyx1kydodqktWLZdtfxo2Czh7pnyuhcN//cF8ZkHDTIKXpatC117YI+6RA7lLM4Rmuq8DbFA6ktmooQmSMLRHhujUAnlG0gijB4zfyYx84hXr9dSgHAws1qMDn47g= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1652195775693752.449198324481; Tue, 10 May 2022 08:16:15 -0700 (PDT) Received: from localhost ([::1]:44580 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1noRaw-000718-Kb for importer@patchew.org; Tue, 10 May 2022 11:16:14 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:60528) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1noRW5-0000AH-Vy for qemu-devel@nongnu.org; Tue, 10 May 2022 11:11:18 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:35428) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1noRW3-0002ox-97 for qemu-devel@nongnu.org; Tue, 10 May 2022 11:11:12 -0400 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-141-mMPoL2bqOdaFE5ZhElvZ6Q-1; Tue, 10 May 2022 11:11:05 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 0F1C381B547; Tue, 10 May 2022 15:11:02 +0000 (UTC) Received: from merkur.redhat.com (unknown [10.39.194.149]) by smtp.corp.redhat.com (Postfix) with ESMTP id 164E89E78; Tue, 10 May 2022 15:11:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1652195470; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=CfoIFrxu+5MlSYRXI6HehGB0WDw/rAF+N9LSQNJ9/dM=; b=Sq3tPytzab39Zx/D7BpTD4xppC+MUdDvmnB4xZg+s8fxD92aUVJJlaOSQ/u47PIjN3XgLB H1HTscrDMVrzGaKDuRD5DOqSG2CK12SzoawGl9tASIsUP0g4cUpazRqKpvoum/0m77809G FWvOGYyAxlz993ruPSm8XfL9qPbq1Ws= X-MC-Unique: mMPoL2bqOdaFE5ZhElvZ6Q-1 From: Kevin Wolf To: qemu-block@nongnu.org Cc: kwolf@redhat.com, stefanha@redhat.com, hnarukaw@yahoo-corp.jp, qemu-devel@nongnu.org, qemu-stable@nongnu.org Subject: [PATCH 2/2] coroutine: Revert to constant batch size Date: Tue, 10 May 2022 17:10:20 +0200 Message-Id: <20220510151020.105528-3-kwolf@redhat.com> In-Reply-To: <20220510151020.105528-1-kwolf@redhat.com> References: <20220510151020.105528-1-kwolf@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 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=170.10.129.124; envelope-from=kwolf@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -28 X-Spam_score: -2.9 X-Spam_bar: -- X-Spam_report: (-2.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.082, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1652195776959100001 Content-Type: text/plain; charset="utf-8" Commit 4c41c69e changed the way the coroutine pool is sized because for virtio-blk devices with a large queue size and heavy I/O, it was just too small and caused coroutines to be deleted and reallocated soon afterwards. The change made the size dynamic based on the number of queues and the queue size of virtio-blk devices. There are two important numbers here: Slightly simplified, when a coroutine terminates, it is generally stored in the global release pool up to a certain pool size, and if the pool is full, it is freed. Conversely, when allocating a new coroutine, the coroutines in the release pool are reused if the pool already has reached a certain minimum size (the batch size), otherwise we allocate new coroutines. The problem after commit 4c41c69e is that it not only increases the maximum pool size (which is the intended effect), but also the batch size for reusing coroutines (which is a bug). It means that in cases with many devices and/or a large queue size (which defaults to the number of vcpus for virtio-blk-pci), many thousand coroutines could be sitting in the release pool without being reused. This is not only a waste of memory and allocations, but it actually makes the QEMU process likely to hit the vm.max_map_count limit on Linux because each coroutine requires two mappings (its stack and the guard page for the stack), causing it to abort() in qemu_alloc_stack() because when the limit is hit, mprotect() starts to fail with ENOMEM. In order to fix the problem, change the batch size back to 64 to avoid uselessly accumulating coroutines in the release pool, but keep the dynamic maximum pool size so that coroutines aren't freed too early in heavy I/O scenarios. Note that this fix doesn't strictly make it impossible to hit the limit, but this would only happen if most of the coroutines are actually in use at the same time, not just sitting in a pool. This is the same behaviour as we already had before commit 4c41c69e. Fully preventing this would require allowing qemu_coroutine_create() to return an error, but it doesn't seem to be a scenario that people hit in practice. Cc: qemu-stable@nongnu.org Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=3D2079938 Fixes: 4c41c69e05fe28c0f95f8abd2ebf407e95a4f04b Signed-off-by: Kevin Wolf Tested-by: Hiroki Narukawa --- util/qemu-coroutine.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/util/qemu-coroutine.c b/util/qemu-coroutine.c index ea23929a74..4a8bd63ef0 100644 --- a/util/qemu-coroutine.c +++ b/util/qemu-coroutine.c @@ -21,14 +21,20 @@ #include "qemu/coroutine-tls.h" #include "block/aio.h" =20 -/** Initial batch size is 64, and is increased on demand */ +/** + * The minimal batch size is always 64, coroutines from the release_pool a= re + * reused as soon as there are 64 coroutines in it. The maximum pool size = starts + * with 64 and is increased on demand so that coroutines are not deleted e= ven if + * they are not immediately reused. + */ enum { - POOL_INITIAL_BATCH_SIZE =3D 64, + POOL_MIN_BATCH_SIZE =3D 64, + POOL_INITIAL_MAX_SIZE =3D 64, }; =20 /** Free list to speed up creation */ static QSLIST_HEAD(, Coroutine) release_pool =3D QSLIST_HEAD_INITIALIZER(p= ool); -static unsigned int pool_batch_size =3D POOL_INITIAL_BATCH_SIZE; +static unsigned int pool_max_size =3D POOL_INITIAL_MAX_SIZE; static unsigned int release_pool_size; =20 typedef QSLIST_HEAD(, Coroutine) CoroutineQSList; @@ -57,7 +63,7 @@ Coroutine *qemu_coroutine_create(CoroutineEntry *entry, v= oid *opaque) =20 co =3D QSLIST_FIRST(alloc_pool); if (!co) { - if (release_pool_size > qatomic_read(&pool_batch_size)) { + if (release_pool_size > POOL_MIN_BATCH_SIZE) { /* Slow path; a good place to register the destructor, too= . */ Notifier *notifier =3D get_ptr_coroutine_pool_cleanup_noti= fier(); if (!notifier->notify) { @@ -95,12 +101,12 @@ static void coroutine_delete(Coroutine *co) co->caller =3D NULL; =20 if (CONFIG_COROUTINE_POOL) { - if (release_pool_size < qatomic_read(&pool_batch_size) * 2) { + if (release_pool_size < qatomic_read(&pool_max_size) * 2) { QSLIST_INSERT_HEAD_ATOMIC(&release_pool, co, pool_next); qatomic_inc(&release_pool_size); return; } - if (get_alloc_pool_size() < qatomic_read(&pool_batch_size)) { + if (get_alloc_pool_size() < qatomic_read(&pool_max_size)) { QSLIST_INSERT_HEAD(get_ptr_alloc_pool(), co, pool_next); set_alloc_pool_size(get_alloc_pool_size() + 1); return; @@ -214,10 +220,10 @@ AioContext *coroutine_fn qemu_coroutine_get_aio_conte= xt(Coroutine *co) =20 void qemu_coroutine_inc_pool_size(unsigned int additional_pool_size) { - qatomic_add(&pool_batch_size, additional_pool_size); + qatomic_add(&pool_max_size, additional_pool_size); } =20 void qemu_coroutine_dec_pool_size(unsigned int removing_pool_size) { - qatomic_sub(&pool_batch_size, removing_pool_size); + qatomic_sub(&pool_max_size, removing_pool_size); } --=20 2.35.3