From nobody Tue May 7 12:49:41 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1616671906; cv=none; d=zohomail.com; s=zohoarc; b=OGW/BrsAyuBJ4KT6zYIlWR+PtmWwjz8j0uG5qZJNuMZD7E617eDKmYPLxm9UlqKMQ/nDIi+mnXghadRw5ccZA6cmNNxg3LYm4Ha2jU+BviK49kIYw3NRucQYo3cluqWUGbsAiAqcKplXuPm1dcP0JWh/ji3GHsZp1XD+Ppq4RF0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1616671906; 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=icH2+ws4BA3MF/VhEqXoYhWBQcPa1zTAGZW92CWb7og=; b=cn2D5k5NMiDQRvfhAUF7G6FF7fN93EstyVXssnpQkG8YMhZf5CERdPDXehImlmcF7Y2407JmtChk/pMs7q4e9gt8+AJmKAq5k+KuWiTt99rdsp+xxpdfpCPMjjraU7l8r0eYew6HvDB6U2XkPNJw75ajWxA0sug8rCTnq/mf70c= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; 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=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1616671906057670.4001898257615; Thu, 25 Mar 2021 04:31:46 -0700 (PDT) Received: from localhost ([::1]:44074 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lPODH-00054m-Fs for importer@patchew.org; Thu, 25 Mar 2021 07:31:43 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:34042) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lPOBP-0003VW-E3 for qemu-devel@nongnu.org; Thu, 25 Mar 2021 07:29:47 -0400 Received: from mail-wm1-x334.google.com ([2a00:1450:4864:20::334]:42566) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lPOBN-0006hI-HQ for qemu-devel@nongnu.org; Thu, 25 Mar 2021 07:29:47 -0400 Received: by mail-wm1-x334.google.com with SMTP id b2-20020a7bc2420000b029010be1081172so974640wmj.1 for ; Thu, 25 Mar 2021 04:29:45 -0700 (PDT) Received: from avogadro.lan ([2001:b07:6468:f312:5e2c:eb9a:a8b6:fd3e]) by smtp.gmail.com with ESMTPSA id g11sm7220118wrw.89.2021.03.25.04.29.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Mar 2021 04:29:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=icH2+ws4BA3MF/VhEqXoYhWBQcPa1zTAGZW92CWb7og=; b=CavDZxvQHAH1WrgLmp5i96hztzD1hLZhh/QzHO6jZG9kZXrRyV0r3WJe9LQ6PWGEyg 3gBBQyTyVkuoGJLuuYPAz9EKjxVepLUJD6whM3Ft7nzONsVQNi1rpwqDy19T3uiCPqOz NN5+8diIRcnaygwAX5K/3dQvc/iTSAGbOjlT/yHFSoSD/Bb2y6pGnZw/k3RlXEMQIfVT /YNBJMsCIvKD7QnDtS01LfUIZ0GTcAricZniU1ui5fyLQUlH6l2g0JjbEpf7Atq1OQtO QYaSnxUKWDDKFl2pmYaLxyVOE1dgTSSJuBAqQBTE+gUsj8fsX2VMS0uwFacSb9Tvy5rp j11Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=icH2+ws4BA3MF/VhEqXoYhWBQcPa1zTAGZW92CWb7og=; b=pJn9dCH33ibA5MrpOcw6DQbcWAgqkljnmn3yuA5eqi7NdTM9ajW9y2zjzkattiDS7/ 9jlFH8ZZZptgGxsu/cvI4Qbn5wizSwhRx4hnLEj2ZajoONw0z5XNkXGAy23neFvI9TKx ydblwByJpYqSZn0iSgx3poYFtUmDqez/8EY+QrFpNw8FT93B3RGrFnSqEHFagfzOCYKl 84Imkii/5a1p5kSspNdbKrgbTsmg1hbXJukEV2XxEFc+9xfRwGOHuFTmsL6dquReWMlX UldgTMjCMx/9sBS7v/fVrFKk6YVtpXGZOXorLy8R+fzOZNNOfyj6EeHCoERF8FC4wxKm QlBg== X-Gm-Message-State: AOAM531BE8okTu8H+Z1b6+I/yRSOotwUvzCPwXtvD0PC/QAmrZLV7LKr 0fT14PTIxbTI4ContiXf60t9gKROvWs= X-Google-Smtp-Source: ABdhPJyGX9Z6x/cvL0dfgZbbT/0yFIg/oYTE3MQL0vwgWyHD6wRxDZs0MAI2GRzJrwGaWWg9qPqpuA== X-Received: by 2002:a1c:4b0a:: with SMTP id y10mr7329840wma.141.1616671784114; Thu, 25 Mar 2021 04:29:44 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH v6 1/6] block/vdi: When writing new bmap entry fails, don't leak the buffer Date: Thu, 25 Mar 2021 12:29:36 +0100 Message-Id: <20210325112941.365238-2-pbonzini@redhat.com> X-Mailer: git-send-email 2.30.1 In-Reply-To: <20210325112941.365238-1-pbonzini@redhat.com> References: <20210325112941.365238-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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=2a00:1450:4864:20::334; envelope-from=paolo.bonzini@gmail.com; helo=mail-wm1-x334.google.com X-Spam_score_int: -14 X-Spam_score: -1.5 X-Spam_bar: - X-Spam_report: (-1.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FORGED_FROMDOMAIN=0.249, FREEMAIL_FROM=0.001, HEADER_FROM_DIFFERENT_DOMAINS=0.25, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no 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: david.edmondson@oracle.com, =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , stefanha@redhat.com, Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) From: David Edmondson If a new bitmap entry is allocated, requiring the entire block to be written, avoiding leaking the buffer allocated for the block should the write fail. Reviewed-by: Philippe Mathieu-Daud=C3=A9 Signed-off-by: David Edmondson Message-Id: <20210309144015.557477-2-david.edmondson@oracle.com> Acked-by: Max Reitz Signed-off-by: Paolo Bonzini --- block/vdi.c | 1 + 1 file changed, 1 insertion(+) diff --git a/block/vdi.c b/block/vdi.c index 5627e7d764..2a6dc26124 100644 --- a/block/vdi.c +++ b/block/vdi.c @@ -690,6 +690,7 @@ nonallocating_write: =20 logout("finished data write\n"); if (ret < 0) { + g_free(block); return ret; } =20 --=20 2.29.2 From nobody Tue May 7 12:49:41 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1616672029; cv=none; d=zohomail.com; s=zohoarc; b=DHa08yQgr/oPigvIqW73rJyUtAajRj85UqF4ldHzJxVAI+s2SwWgk3vfWWqt+65PUj1E2xo5i/fjux9NxKy+XJuq8Pl57gEsaWUevNMXBu8LPIitHERE8ldEXzBkrKz8tHBOck/tSo62cXEd1oQkBWxsbI1woUCTCg6doVBDkq4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1616672029; 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=Tnr9N7af2ViS1uL0xjvifCX4tlVCM+d0rldwp52WGRY=; b=nyfxnZdKY01DRaghNEfVhjDHyJoUJGbl+730NkdlIKZJb2sbKlA9VpGLluyglnriu9wGhfkqsrnpa/sc8/+O80DZGXJ5fAEGkKmIKo5Hq6bQc3fjQtAjcXAg6wEsr/XgCp/ql0lu8IHNU7qKUHB27t1CW+Q2FCZY0UitlrHoc68= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; 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=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1616672029421333.4214633412495; Thu, 25 Mar 2021 04:33:49 -0700 (PDT) Received: from localhost ([::1]:51600 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lPOFI-0008BH-D8 for importer@patchew.org; Thu, 25 Mar 2021 07:33:48 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:34046) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lPOBP-0003Vc-Qy for qemu-devel@nongnu.org; Thu, 25 Mar 2021 07:29:47 -0400 Received: from mail-wm1-x332.google.com ([2a00:1450:4864:20::332]:33357) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lPOBO-0006hS-Cl for qemu-devel@nongnu.org; Thu, 25 Mar 2021 07:29:47 -0400 Received: by mail-wm1-x332.google.com with SMTP id w203-20020a1c49d40000b029010c706d0642so4183704wma.0 for ; Thu, 25 Mar 2021 04:29:46 -0700 (PDT) Received: from avogadro.lan ([2001:b07:6468:f312:5e2c:eb9a:a8b6:fd3e]) by smtp.gmail.com with ESMTPSA id g11sm7220118wrw.89.2021.03.25.04.29.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Mar 2021 04:29:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Tnr9N7af2ViS1uL0xjvifCX4tlVCM+d0rldwp52WGRY=; b=QMmkhFCLyPGPkNqblRf540DjJ/fse6cNc8l/Bl/byMmLrxpQxZbweTkhxTqGHN14T5 FWEyqbLPKYsjiDLepIM6vBYu3+mfkIptik5UN2Pu7jwIkEnT5PaKS4vx0RBWqRASrZ0y JBehMo2zc3NNw5LhnuHJ3WzArxCon3nl6rTjqRBpIEfqVVT0peZmgeUNJSzMnfDh7yq5 urL3nsPB8Cq0tksjiBDKWbHvMiM92UggcGMZHuah3kLgY+UaQ23hErCGom50jMMM6CwL FPP1ClVbBa2bTTr3wcQRHQEA5osK3F+ikAScCRXUCNir9ZYhqWGFeY8FVuGIudyyDScI m8cA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=Tnr9N7af2ViS1uL0xjvifCX4tlVCM+d0rldwp52WGRY=; b=T1DslXQDrvN6qkogNdGXkX7ls/UKqBBtc4XXvGCmK0BFVP8H4UF1X/ALm31K2y4opk sP6lM2IKNwGuBJkczgnffaYMWA61frd4owocigJF/pxW0Kb8C7cYOJRG2gZxxBJPE/pE 9csICNETx60HZyTdTsb0JYUYX+IyCsq0CVn0cx87Y9RSCnSptWChJL7bNzO3BJ02LUnV 3QlmcdZwIFLG/qJpp1SM7akbX73Y9I9QQZ+3SGx4Nn13ws8TGVROafFVh9ikjXedhW7v AyEOfZTO0AFME9Omuf14/2i42c7SWqfL7cvBitApznbYKvkDdODdozJqoL++trsuu2/p 4Lcw== X-Gm-Message-State: AOAM531FU4qKluL/FsuVG9BdWDfgqfwC3RMLX2FRWf8SbmhZ/D2R89lW bv7OADgAKfzVs6Mgej2X8uSo090lQH8= X-Google-Smtp-Source: ABdhPJwzbnRTETEdHdK1NCB50FKfLw21FsXUooax6R4RYJGjdDvZk+Gsn8ZvDPOa5V/jHiqzdtWjPw== X-Received: by 2002:a05:600c:252:: with SMTP id 18mr7280562wmj.67.1616671785094; Thu, 25 Mar 2021 04:29:45 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH v6 2/6] block/vdi: Don't assume that blocks are larger than VdiHeader Date: Thu, 25 Mar 2021 12:29:37 +0100 Message-Id: <20210325112941.365238-3-pbonzini@redhat.com> X-Mailer: git-send-email 2.30.1 In-Reply-To: <20210325112941.365238-1-pbonzini@redhat.com> References: <20210325112941.365238-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=2a00:1450:4864:20::332; envelope-from=paolo.bonzini@gmail.com; helo=mail-wm1-x332.google.com X-Spam_score_int: -14 X-Spam_score: -1.5 X-Spam_bar: - X-Spam_report: (-1.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FORGED_FROMDOMAIN=0.249, FREEMAIL_FROM=0.001, HEADER_FROM_DIFFERENT_DOMAINS=0.25, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no 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: david.edmondson@oracle.com, stefanha@redhat.com, Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: David Edmondson Given that the block size is read from the header of the VDI file, a wide variety of sizes might be seen. Rather than re-using a block sized memory region when writing the VDI header, allocate an appropriately sized buffer. Signed-off-by: David Edmondson Message-Id: <20210309144015.557477-3-david.edmondson@oracle.com> Acked-by: Max Reitz Signed-off-by: Paolo Bonzini Reviewed-by: Stefan Hajnoczi --- block/vdi.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/block/vdi.c b/block/vdi.c index 2a6dc26124..548f8a057b 100644 --- a/block/vdi.c +++ b/block/vdi.c @@ -696,18 +696,20 @@ nonallocating_write: =20 if (block) { /* One or more new blocks were allocated. */ - VdiHeader *header =3D (VdiHeader *) block; + VdiHeader *header; uint8_t *base; uint64_t offset; uint32_t n_sectors; =20 + g_free(block); + header =3D g_malloc(sizeof(*header)); + logout("now writing modified header\n"); assert(VDI_IS_ALLOCATED(bmap_first)); *header =3D s->header; vdi_header_to_le(header); - ret =3D bdrv_pwrite(bs->file, 0, block, sizeof(VdiHeader)); - g_free(block); - block =3D NULL; + ret =3D bdrv_pwrite(bs->file, 0, header, sizeof(*header)); + g_free(header); =20 if (ret < 0) { return ret; --=20 2.29.2 From nobody Tue May 7 12:49:41 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1616672029; cv=none; d=zohomail.com; s=zohoarc; b=LuIflZFYRHyhM45HW5CTVGbMEY7cIOMLW/I0wUyuOFzESkYn0Tv4gYZ13k4u+ICpaDUJSLmRJmY2noAnShKzI3UB3Lc9tl4ChJjM/zW6VOytX03rEJj0BO+cpxTAw1ZDRT0J1C1u4hmnrwcBH/ZUDlyY1v4y7yE2JSpb9Gv33SY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1616672029; 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=Xgtdm62nkB77KDEB509RPm6RJ/Eax7jgJ8G9QzqE+DA=; b=kg6k+CwjbmHY4yXyaFOuaVqFzmaHdGT/dQrBRcx283SUHqu1f6XqH3OivwKabVMPAPbLpOljeT+L4n78NeGGDFWO3BjOXyTFtr0kA0YVFI5Lugt/ajXAgcpRdK3fspMdY/Kn3CGYNXYbfsPTzBZ0JCdb5f0fd46IJjOu/kDriPU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; 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=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1616672029252538.133624449545; Thu, 25 Mar 2021 04:33:49 -0700 (PDT) Received: from localhost ([::1]:51594 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lPOFI-0008BB-9H for importer@patchew.org; Thu, 25 Mar 2021 07:33:48 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:34058) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lPOBQ-0003Vj-Oh for qemu-devel@nongnu.org; Thu, 25 Mar 2021 07:29:48 -0400 Received: from mail-wr1-x42d.google.com ([2a00:1450:4864:20::42d]:40677) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lPOBP-0006iA-Ew for qemu-devel@nongnu.org; Thu, 25 Mar 2021 07:29:48 -0400 Received: by mail-wr1-x42d.google.com with SMTP id v11so1903160wro.7 for ; Thu, 25 Mar 2021 04:29:47 -0700 (PDT) Received: from avogadro.lan ([2001:b07:6468:f312:5e2c:eb9a:a8b6:fd3e]) by smtp.gmail.com with ESMTPSA id g11sm7220118wrw.89.2021.03.25.04.29.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Mar 2021 04:29:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Xgtdm62nkB77KDEB509RPm6RJ/Eax7jgJ8G9QzqE+DA=; b=cty7rJ8veC1Qjnh0f60jvJPzV9DMq8zRdSDzVqNn44UGm2R+7qhheW596Kz81gFRIo +s5lkN7+IpNZfmlP8WuAhy0kAGy8iUVul3qj6fYkLyspqAIZPhWtSF+HQfS2rI3TABQD 36L4w+OFxAC+m/e1B66mW8AYTcktxjvV4r2q8OdAOF1eFJg4gMznGldsbNG8Bka9Crfn 1fk2xHOn5nEAlJbrj4W+0I/uHkVVtyaEQyiuwmeAcMQNXurCvEJm+ML+NpLRrY5O4dOY bSi4JZvSSLJdvyE/Yxz08LyOkBFOZL2CGPqBahtuwNr7nsHOgKcooFd72i1iZkzOOtjo 9d/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=Xgtdm62nkB77KDEB509RPm6RJ/Eax7jgJ8G9QzqE+DA=; b=drFpYG/o62NsqaEeLqrrgngVm0SZabnELTlrwSW9C4UNbbO0jFse57mS4ekK14vSRh TiodUdmTCAmxXjQQh4Jc+nV8oGLdnQ2Xw8X7alod72NjN2peLKR44sYLnWo+vkwF0c9D X2+jW0mIbTsT+I+tqFgAVoVwyJvGWY0usdRSYLe4YbERvDPcRTr43jSDNB7xgQlq6L2d RZxCpxQ1brDDt24SKtr5acjUYlnAQ47D1quNh1Uq3N6+UEXbG3+3fenkuyaWlqVaKpYD UDsypyz2CMjJaN1qwCfyrj6IMXkMG1zfCvMvdxVC21kxutT+tOPkkV3GLaXLYzbIqEvd FbiA== X-Gm-Message-State: AOAM531t3mIvEFi2pFQqwuw/BnanxSQig+St4jPKm9/o0d4Uqkqyqh+n FQEhM6aucNRTZfBVK9e506Zxd7yvwoo= X-Google-Smtp-Source: ABdhPJwvhRwnVVVGaSeQt6fHDd711rF/w4wFIcqLadAHX4J0twUe6K+sOmpQJcg/BopYpn/eYllM9g== X-Received: by 2002:a5d:47c4:: with SMTP id o4mr8324081wrc.138.1616671786210; Thu, 25 Mar 2021 04:29:46 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH v6 3/6] coroutine-lock: Store the coroutine in the CoWaitRecord only once Date: Thu, 25 Mar 2021 12:29:38 +0100 Message-Id: <20210325112941.365238-4-pbonzini@redhat.com> X-Mailer: git-send-email 2.30.1 In-Reply-To: <20210325112941.365238-1-pbonzini@redhat.com> References: <20210325112941.365238-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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=2a00:1450:4864:20::42d; envelope-from=paolo.bonzini@gmail.com; helo=mail-wr1-x42d.google.com X-Spam_score_int: -14 X-Spam_score: -1.5 X-Spam_bar: - X-Spam_report: (-1.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FORGED_FROMDOMAIN=0.249, FREEMAIL_FROM=0.001, HEADER_FROM_DIFFERENT_DOMAINS=0.25, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no 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: david.edmondson@oracle.com, =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , stefanha@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) From: David Edmondson When taking the slow path for mutex acquisition, set the coroutine value in the CoWaitRecord in push_waiter(), rather than both there and in the caller. Reviewed-by: Paolo Bonzini Reviewed-by: Philippe Mathieu-Daud=C3=A9 Signed-off-by: David Edmondson Message-Id: <20210309144015.557477-4-david.edmondson@oracle.com> Signed-off-by: Paolo Bonzini Reviewed-by: Stefan Hajnoczi --- util/qemu-coroutine-lock.c | 1 - 1 file changed, 1 deletion(-) diff --git a/util/qemu-coroutine-lock.c b/util/qemu-coroutine-lock.c index 5816bf8900..eb73cf11dc 100644 --- a/util/qemu-coroutine-lock.c +++ b/util/qemu-coroutine-lock.c @@ -204,7 +204,6 @@ static void coroutine_fn qemu_co_mutex_lock_slowpath(Ai= oContext *ctx, unsigned old_handoff; =20 trace_qemu_co_mutex_lock_entry(mutex, self); - w.co =3D self; push_waiter(mutex, &w); =20 /* This is the "Responsibility Hand-Off" protocol; a lock() picks from --=20 2.29.2 From nobody Tue May 7 12:49:41 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1616671926; cv=none; d=zohomail.com; s=zohoarc; b=m3ZAds9miDcU4vQdraMsu7tZZ/x4BMsOLMDkwByI7Ou4OUhgLQGYViK6OBZ5NYVhn2T8AY+pjddXyKfB7CIsh4ijsua5RkmaO9IKwCq/9T+u5FlcymhBzRgQV1TBLBL7siCrnSFt5XpoGbKDDWOrQUAm2Clc+1oLXd+LPQ5tT6U= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1616671926; 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=YblhuIkh5xNVfWBJe+b/yvre1lCOLi6tB8Zxn3pXVkg=; b=WLsas3zalQugpuqsioljR4RzfNMxnwU2IaH/S2S4W+FIa8wcgcE3LgKMzvoPdfsQVEBFX8+RVNuXGHiDJHuuLJuBXUaC8sR7R1dKtJITKjrd+sGMRDBax2EkocMBY8eWiQoKE8Vt5vFvQ4Hil41AwDQr6iaepcdT7CnjIey9YV4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; 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=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1616671926866722.7550713889262; Thu, 25 Mar 2021 04:32:06 -0700 (PDT) Received: from localhost ([::1]:44534 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lPODd-0005Kd-P4 for importer@patchew.org; Thu, 25 Mar 2021 07:32:05 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:34078) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lPOBS-0003Xu-9R for qemu-devel@nongnu.org; Thu, 25 Mar 2021 07:29:50 -0400 Received: from mail-wr1-x42c.google.com ([2a00:1450:4864:20::42c]:39899) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lPOBQ-0006jS-Fh for qemu-devel@nongnu.org; Thu, 25 Mar 2021 07:29:50 -0400 Received: by mail-wr1-x42c.google.com with SMTP id e18so1911096wrt.6 for ; Thu, 25 Mar 2021 04:29:48 -0700 (PDT) Received: from avogadro.lan ([2001:b07:6468:f312:5e2c:eb9a:a8b6:fd3e]) by smtp.gmail.com with ESMTPSA id g11sm7220118wrw.89.2021.03.25.04.29.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Mar 2021 04:29:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=YblhuIkh5xNVfWBJe+b/yvre1lCOLi6tB8Zxn3pXVkg=; b=q88GcfOOfiXffF6LWs4q7qXeIJdgWOaP24oJfo/I+ttEauM0dD9g0NGHQuB6x1U0wF tKAZvXkIeURimuimFepfpLoAj3+CrfyBXX27LokdKYVFO6pLljGCh+UGIAlTQ3ddH3QZ pI1aQ0zwPXaJ6BBwfQRgua/6R+yEgDxyKC8rajWFmQToqXwD15H/FS4EtjdrbR0llL3y 1du/Bn65CjodjbvYffxKwXoPWdZKBymaMCsKv0deYYH3W6Z9kxdpzhA9kqLR1Wiurf4T s3Tnq36vxCw0Ey7Cnec40kq++o1HIty/eLsabltATwXXarliKlZsmCAdQUi/sTdjNPuu s+cg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=YblhuIkh5xNVfWBJe+b/yvre1lCOLi6tB8Zxn3pXVkg=; b=O7SrE1QALa7fnIYqlvZ7vPy+Yt9mHx6726bXBijn2yJpIg5d82IudMY6u94ZdSDBFM pY5ECTushPv+mVlHfta1xp5jNhsYvIlT0T0rDIqV1VrZ5uvHdGdPb1zNe6rQ+K4FQQzn cgH13dsRMZRVIWXGo7QMSl5Vow1AWWNszCe7Y9TUrPBIbIXJUdL0Lmh8EN4A/wqTAlPS V15OCkcilLjkEVYjG6op9R3TOraOiQCDjMkqvB1uJJX6RKTkT+Gola9WllNkTCSPhAQX FfihKiPJlCwpCpyiC3+GwA9TY6O5NA/bUxTT9WADGgUCr1f/jEpaBcGLWDxuwbVhebuB mmng== X-Gm-Message-State: AOAM530Wk42ZqrGEyIpqFQ7Vqv/hhAO4fFs2YSlUURGOT83IWmuSYNmV rU/5IcxKY2hfl4pQox7wtC2Vrb/3jCE= X-Google-Smtp-Source: ABdhPJwq/jUCn6d4namddk4lU6gocc2tG2HlDiNEFvXH231LLHucVv5rF+Ejqf7bQt0PDt8MWfVJyA== X-Received: by 2002:adf:e809:: with SMTP id o9mr8643086wrm.110.1616671787207; Thu, 25 Mar 2021 04:29:47 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH v6 4/6] coroutine-lock: Reimplement CoRwlock to fix downgrade bug Date: Thu, 25 Mar 2021 12:29:39 +0100 Message-Id: <20210325112941.365238-5-pbonzini@redhat.com> X-Mailer: git-send-email 2.30.1 In-Reply-To: <20210325112941.365238-1-pbonzini@redhat.com> References: <20210325112941.365238-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=2a00:1450:4864:20::42c; envelope-from=paolo.bonzini@gmail.com; helo=mail-wr1-x42c.google.com X-Spam_score_int: -14 X-Spam_score: -1.5 X-Spam_bar: - X-Spam_report: (-1.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FORGED_FROMDOMAIN=0.249, FREEMAIL_FROM=0.001, HEADER_FROM_DIFFERENT_DOMAINS=0.25, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no 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: david.edmondson@oracle.com, stefanha@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" An invariant of the current rwlock is that if multiple coroutines hold a reader lock, all must be runnable. The unlock implementation relies on this, choosing to wake a single coroutine when the final read lock holder exits the critical section, assuming that it will wake a coroutine attempting to acquire a write lock. The downgrade implementation violates this assumption by creating a read lock owning coroutine that is exclusively runnable - any other coroutines that are waiting to acquire a read lock are *not* made runnable when the write lock holder converts its ownership to read only. More in general, the old implementation had lots of other fairness bugs. The root cause of the bugs was that CoQueue would wake up readers even if there were pending writers, and would wake up writers even if there were readers. In that case, the coroutine would go back to sleep *at the end* of the CoQueue, losing its place at the head of the line. To fix this, keep the queue of waiters explicitly in the CoRwlock instead of using CoQueue, and store for each whether it is a potential reader or a writer. This way, downgrade can look at the first queued coroutines and wake it only if it is a reader, causing all other readers in line to be released in turn. Reported-by: David Edmondson Reviewed-by: David Edmondson Signed-off-by: Paolo Bonzini Reviewed-by: Stefan Hajnoczi --- v3->v4: clean up the code and fix upgrade logic. Fix upgrade comment too. include/qemu/coroutine.h | 17 +++-- util/qemu-coroutine-lock.c | 148 ++++++++++++++++++++++++------------- 2 files changed, 106 insertions(+), 59 deletions(-) diff --git a/include/qemu/coroutine.h b/include/qemu/coroutine.h index 84eab6e3bf..7919d3bb62 100644 --- a/include/qemu/coroutine.h +++ b/include/qemu/coroutine.h @@ -237,11 +237,15 @@ bool qemu_co_enter_next_impl(CoQueue *queue, QemuLock= able *lock); bool qemu_co_queue_empty(CoQueue *queue); =20 =20 +typedef struct CoRwTicket CoRwTicket; typedef struct CoRwlock { - int pending_writer; - int reader; CoMutex mutex; - CoQueue queue; + + /* Number of readers, or -1 if owned for writing. */ + int owners; + + /* Waiting coroutines. */ + QSIMPLEQ_HEAD(, CoRwTicket) tickets; } CoRwlock; =20 /** @@ -260,10 +264,9 @@ void qemu_co_rwlock_rdlock(CoRwlock *lock); /** * Write Locks the CoRwlock from a reader. This is a bit more efficient t= han * @qemu_co_rwlock_unlock followed by a separate @qemu_co_rwlock_wrlock. - * However, if the lock cannot be upgraded immediately, control is transfe= rred - * to the caller of the current coroutine. Also, @qemu_co_rwlock_upgrade - * only overrides CoRwlock fairness if there are no concurrent readers, so - * another writer might run while @qemu_co_rwlock_upgrade blocks. + * Note that if the lock cannot be upgraded immediately, control is transf= erred + * to the caller of the current coroutine; another writer might run while + * @qemu_co_rwlock_upgrade blocks. */ void qemu_co_rwlock_upgrade(CoRwlock *lock); =20 diff --git a/util/qemu-coroutine-lock.c b/util/qemu-coroutine-lock.c index eb73cf11dc..2669403839 100644 --- a/util/qemu-coroutine-lock.c +++ b/util/qemu-coroutine-lock.c @@ -327,11 +327,51 @@ void coroutine_fn qemu_co_mutex_unlock(CoMutex *mutex) trace_qemu_co_mutex_unlock_return(mutex, self); } =20 +struct CoRwTicket { + bool read; + Coroutine *co; + QSIMPLEQ_ENTRY(CoRwTicket) next; +}; + void qemu_co_rwlock_init(CoRwlock *lock) { - memset(lock, 0, sizeof(*lock)); - qemu_co_queue_init(&lock->queue); qemu_co_mutex_init(&lock->mutex); + lock->owners =3D 0; + QSIMPLEQ_INIT(&lock->tickets); +} + +/* Releases the internal CoMutex. */ +static void qemu_co_rwlock_maybe_wake_one(CoRwlock *lock) +{ + CoRwTicket *tkt =3D QSIMPLEQ_FIRST(&lock->tickets); + Coroutine *co =3D NULL; + + /* + * Setting lock->owners here prevents rdlock and wrlock from + * sneaking in between unlock and wake. + */ + + if (tkt) { + if (tkt->read) { + if (lock->owners >=3D 0) { + lock->owners++; + co =3D tkt->co; + } + } else { + if (lock->owners =3D=3D 0) { + lock->owners =3D -1; + co =3D tkt->co; + } + } + } + + if (co) { + QSIMPLEQ_REMOVE_HEAD(&lock->tickets, next); + qemu_co_mutex_unlock(&lock->mutex); + aio_co_wake(co); + } else { + qemu_co_mutex_unlock(&lock->mutex); + } } =20 void qemu_co_rwlock_rdlock(CoRwlock *lock) @@ -340,13 +380,22 @@ void qemu_co_rwlock_rdlock(CoRwlock *lock) =20 qemu_co_mutex_lock(&lock->mutex); /* For fairness, wait if a writer is in line. */ - while (lock->pending_writer) { - qemu_co_queue_wait(&lock->queue, &lock->mutex); + if (lock->owners =3D=3D 0 || (lock->owners > 0 && QSIMPLEQ_EMPTY(&lock= ->tickets))) { + lock->owners++; + qemu_co_mutex_unlock(&lock->mutex); + } else { + CoRwTicket my_ticket =3D { true, self }; + + QSIMPLEQ_INSERT_TAIL(&lock->tickets, &my_ticket, next); + qemu_co_mutex_unlock(&lock->mutex); + qemu_coroutine_yield(); + assert(lock->owners >=3D 1); + + /* Possibly wake another reader, which will wake the next in line.= */ + qemu_co_mutex_lock(&lock->mutex); + qemu_co_rwlock_maybe_wake_one(lock); } - lock->reader++; - qemu_co_mutex_unlock(&lock->mutex); =20 - /* The rest of the read-side critical section is run without the mutex= . */ self->locks_held++; } =20 @@ -355,69 +404,64 @@ void qemu_co_rwlock_unlock(CoRwlock *lock) Coroutine *self =3D qemu_coroutine_self(); =20 assert(qemu_in_coroutine()); - if (!lock->reader) { - /* The critical section started in qemu_co_rwlock_wrlock. */ - qemu_co_queue_restart_all(&lock->queue); - } else { - self->locks_held--; + self->locks_held--; =20 - qemu_co_mutex_lock(&lock->mutex); - lock->reader--; - assert(lock->reader >=3D 0); - /* Wakeup only one waiting writer */ - if (!lock->reader) { - qemu_co_queue_next(&lock->queue); - } + qemu_co_mutex_lock(&lock->mutex); + if (lock->owners > 0) { + lock->owners--; + } else { + assert(lock->owners =3D=3D -1); + lock->owners =3D 0; } - qemu_co_mutex_unlock(&lock->mutex); + + qemu_co_rwlock_maybe_wake_one(lock); } =20 void qemu_co_rwlock_downgrade(CoRwlock *lock) { - Coroutine *self =3D qemu_coroutine_self(); - - /* lock->mutex critical section started in qemu_co_rwlock_wrlock or - * qemu_co_rwlock_upgrade. - */ - assert(lock->reader =3D=3D 0); - lock->reader++; - qemu_co_mutex_unlock(&lock->mutex); + qemu_co_mutex_lock(&lock->mutex); + assert(lock->owners =3D=3D -1); + lock->owners =3D 1; =20 - /* The rest of the read-side critical section is run without the mutex= . */ - self->locks_held++; + /* Possibly wake another reader, which will wake the next in line. */ + qemu_co_rwlock_maybe_wake_one(lock); } =20 void qemu_co_rwlock_wrlock(CoRwlock *lock) { + Coroutine *self =3D qemu_coroutine_self(); + qemu_co_mutex_lock(&lock->mutex); - lock->pending_writer++; - while (lock->reader) { - qemu_co_queue_wait(&lock->queue, &lock->mutex); + if (lock->owners =3D=3D 0) { + lock->owners =3D -1; + qemu_co_mutex_unlock(&lock->mutex); + } else { + CoRwTicket my_ticket =3D { false, qemu_coroutine_self() }; + + QSIMPLEQ_INSERT_TAIL(&lock->tickets, &my_ticket, next); + qemu_co_mutex_unlock(&lock->mutex); + qemu_coroutine_yield(); + assert(lock->owners =3D=3D -1); } - lock->pending_writer--; =20 - /* The rest of the write-side critical section is run with - * the mutex taken, so that lock->reader remains zero. - * There is no need to update self->locks_held. - */ + self->locks_held++; } =20 void qemu_co_rwlock_upgrade(CoRwlock *lock) { - Coroutine *self =3D qemu_coroutine_self(); - qemu_co_mutex_lock(&lock->mutex); - assert(lock->reader > 0); - lock->reader--; - lock->pending_writer++; - while (lock->reader) { - qemu_co_queue_wait(&lock->queue, &lock->mutex); - } - lock->pending_writer--; + assert(lock->owners > 0); + /* For fairness, wait if a writer is in line. */ + if (lock->owners =3D=3D 1 && QSIMPLEQ_EMPTY(&lock->tickets)) { + lock->owners =3D -1; + qemu_co_mutex_unlock(&lock->mutex); + } else { + CoRwTicket my_ticket =3D { false, qemu_coroutine_self() }; =20 - /* The rest of the write-side critical section is run with - * the mutex taken, similar to qemu_co_rwlock_wrlock. Do - * not account for the lock twice in self->locks_held. - */ - self->locks_held--; + lock->owners--; + QSIMPLEQ_INSERT_TAIL(&lock->tickets, &my_ticket, next); + qemu_co_rwlock_maybe_wake_one(lock); + qemu_coroutine_yield(); + assert(lock->owners =3D=3D -1); + } } --=20 2.29.2 From nobody Tue May 7 12:49:41 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1616672100; cv=none; d=zohomail.com; s=zohoarc; b=FFW4Wp3wzil5t09ulLB+PnBOaeDjGLWitz7dKy2f7f8v07gC+adxV3OerKePxiAUUCtSfpEraFdHMvQTaTrMab1RjQCmTiltb1CWkCOWVFq5iFwke/9JTiXr7BXp9Hh6JV3dspzKXzr3W/LmEK74usowSbBIUOwZABU5LBNQ0b4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1616672100; 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=oT4p1KHSGxZ7LX2qzvJOdZpm8tKTnC34BumbQ35O8mA=; b=F8joHrn1XmpzSA0o/IUqdK/sEAyWB/MuCpoGkrxDAHey2kHfMhzBnCe1A+3fbDYg8mFxu1aWJMMUDbb56MrRfY+/W0H9NCLrHdoHlinQl/YRlPxtLgmSIch+tlb2n3h5dO2RfUUU3bZkLO6Cxg2vmTaXzprSHFWrhjA/c/en9jM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; 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=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 161667210048982.02631006384092; Thu, 25 Mar 2021 04:35:00 -0700 (PDT) Received: from localhost ([::1]:55590 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lPOGR-0001Na-Cm for importer@patchew.org; Thu, 25 Mar 2021 07:34:59 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:34082) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lPOBT-0003Yo-0C for qemu-devel@nongnu.org; Thu, 25 Mar 2021 07:29:51 -0400 Received: from mail-wr1-x433.google.com ([2a00:1450:4864:20::433]:37558) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lPOBR-0006ja-BQ for qemu-devel@nongnu.org; Thu, 25 Mar 2021 07:29:50 -0400 Received: by mail-wr1-x433.google.com with SMTP id x16so1915006wrn.4 for ; Thu, 25 Mar 2021 04:29:48 -0700 (PDT) Received: from avogadro.lan ([2001:b07:6468:f312:5e2c:eb9a:a8b6:fd3e]) by smtp.gmail.com with ESMTPSA id g11sm7220118wrw.89.2021.03.25.04.29.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Mar 2021 04:29:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=oT4p1KHSGxZ7LX2qzvJOdZpm8tKTnC34BumbQ35O8mA=; b=E4fiqLaII1WnJHqAafQl3fLf/r7HmiF3fglACzEV9ihOd4NdgpBz6w7BdNoCAxG7Bh 7GeeyLRpq42e7kSEVTzB8jB/qw8mNx4XfikiO2eL6O4/nT2Hv9wBGKVwjGvs+KQnvAKV Rdeh6Rx25rdtGnsI6jyQ8pjJ5EDFAWwz7UlQWATmu56V834eBlV4a8oS8ks+NDG+7PaG CQOAIcjRFJuPZbO2wmv3bP8usEKct2HkcazZ7/7HoOPbmIqw5/e1w6mYXKHTyKZOMapO 5WjaJhXP7O+CBd3E5Us4A3jY4GNgsm0R0MpGlAr/BLk0wvBTDtlKh2xTxvq+26iSN1zh r3Ww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=oT4p1KHSGxZ7LX2qzvJOdZpm8tKTnC34BumbQ35O8mA=; b=X0siwcxF7q1yAHv42kE2mHjhhlN5eVVI0YnR5ieqJMaOiNlGKeZPboTJ2GMvdA/ypi /DEbCAq510e3JQL9bpp5V0ctIn70A8iTryrBRJfC6gKyl7KtAgGQk0jLXIB5sOPW3v42 Jnj9K9X57FZsklKu6Zk4ZD69Ekhvk/b78UWzQ6m7NLEHCMvFMZKRM5nfOYw4Y4L3+iAB O7Va0qEgkUPrYbdz+yfmuMuNQxKl8ZiQWxrjfioWvXwMy4CbZ0y5JRyboKGoqKDY+aVi 6K8PvCGdGpsgk0WpJATCm1w5I20iDwuY6xORW+Qay1K56ftckFM0pJQRURJ9J/ZQInvM MpoQ== X-Gm-Message-State: AOAM533qBtpYY1vXjo+UR+uAgRNrFX6c4jxV0yqg4LPu1ajm1aSqEnse hrEaibBBSy6WbdCARZuAy8JbGp+mXr8= X-Google-Smtp-Source: ABdhPJxhiQCLE87Xp8DZERq8ayTlil0884bxmFjnqsB9QkAUhi09WqQD1uFUfc22w4tB/DrQE/MN5Q== X-Received: by 2002:a5d:4105:: with SMTP id l5mr8759721wrp.105.1616671788128; Thu, 25 Mar 2021 04:29:48 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH v6 5/6] test-coroutine: Add rwlock upgrade test Date: Thu, 25 Mar 2021 12:29:40 +0100 Message-Id: <20210325112941.365238-6-pbonzini@redhat.com> X-Mailer: git-send-email 2.30.1 In-Reply-To: <20210325112941.365238-1-pbonzini@redhat.com> References: <20210325112941.365238-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=2a00:1450:4864:20::433; envelope-from=paolo.bonzini@gmail.com; helo=mail-wr1-x433.google.com X-Spam_score_int: -14 X-Spam_score: -1.5 X-Spam_bar: - X-Spam_report: (-1.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FORGED_FROMDOMAIN=0.249, FREEMAIL_FROM=0.001, HEADER_FROM_DIFFERENT_DOMAINS=0.25, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no 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: david.edmondson@oracle.com, stefanha@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" Test that rwlock upgrade is fair, and that readers go back to sleep if a writer is in line. Signed-off-by: Paolo Bonzini --- tests/unit/test-coroutine.c | 62 +++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/tests/unit/test-coroutine.c b/tests/unit/test-coroutine.c index e946d93a65..6e6f51d480 100644 --- a/tests/unit/test-coroutine.c +++ b/tests/unit/test-coroutine.c @@ -264,6 +264,67 @@ static void test_co_mutex_lockable(void) g_assert(QEMU_MAKE_LOCKABLE(null_pointer) =3D=3D NULL); } =20 +static CoRwlock rwlock; + +/* Test that readers are properly sent back to the queue when upgrading, + * even if they are the sole readers. The test scenario is as follows: + * + * + * | c1 | c2 | + * |--------------+------------+ + * | rdlock | | + * | yield | | + * | | wrlock | + * | | | + * | upgrade | | + * | | | + * | | unlock | + * | | | + * | unlock | | + */ + +static void coroutine_fn rwlock_yield_upgrade(void *opaque) +{ + qemu_co_rwlock_rdlock(&rwlock); + qemu_coroutine_yield(); + + qemu_co_rwlock_upgrade(&rwlock); + qemu_co_rwlock_unlock(&rwlock); + + *(bool *)opaque =3D true; +} + +static void coroutine_fn rwlock_wrlock_yield(void *opaque) +{ + qemu_co_rwlock_wrlock(&rwlock); + qemu_coroutine_yield(); + + qemu_co_rwlock_unlock(&rwlock); + *(bool *)opaque =3D true; +} + +static void test_co_rwlock_upgrade(void) +{ + bool c1_done =3D false; + bool c2_done =3D false; + Coroutine *c1, *c2; + + qemu_co_rwlock_init(&rwlock); + c1 =3D qemu_coroutine_create(rwlock_yield_upgrade, &c1_done); + c2 =3D qemu_coroutine_create(rwlock_wrlock_yield, &c2_done); + + qemu_coroutine_enter(c1); + qemu_coroutine_enter(c2); + + /* c1 now should go to sleep. */ + qemu_coroutine_enter(c1); + g_assert(!c1_done); + + qemu_coroutine_enter(c2); + g_assert(c1_done); + g_assert(c2_done); +} + /* * Check that creation, enter, and return work */ @@ -501,6 +562,7 @@ int main(int argc, char **argv) g_test_add_func("/basic/order", test_order); g_test_add_func("/locking/co-mutex", test_co_mutex); g_test_add_func("/locking/co-mutex/lockable", test_co_mutex_lockable); + g_test_add_func("/locking/co-rwlock/upgrade", test_co_rwlock_upgrade); if (g_test_perf()) { g_test_add_func("/perf/lifecycle", perf_lifecycle); g_test_add_func("/perf/nesting", perf_nesting); --=20 2.29.2 From nobody Tue May 7 12:49:41 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1616671928; cv=none; d=zohomail.com; s=zohoarc; b=NWdpId1iASk9xIBcHHoZum3gEDXfy6QsqseZJah4mkidgVJvXABzVfqUaWSys2S69VQ8X/qvk8W4rlzdzGOFMDNfepuSOU/8Jm5hY8n2qNeojSZAOx02BwabBye+V7GUk1uYvR+2hEDnu3vgAGgpqRwAFgq7hnjKxG5yRzv0Xrg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1616671928; 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=smfqshe5rWL1zIyiqGH7+GywYlbeI5eZY7MNQuJ+Muk=; b=mhUWfsH/QmYEt6fFBcSQKdAYu5s8SnAMRRNeb1mviXALxQkyJnnRtvRzTkIgeRN7yqqxCiRHezKaiC6L8y2baDfkTvM0lrglgqX9jxWBqfBWhdoXYGo/rSRtjwovSEw8GapBA8sFliW7a9lAegubI/Q4b+eiJPWG1fcYLlZGWQU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; 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=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1616671928784187.23132103007333; Thu, 25 Mar 2021 04:32:08 -0700 (PDT) Received: from localhost ([::1]:44642 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lPODf-0005OA-Il for importer@patchew.org; Thu, 25 Mar 2021 07:32:07 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:34112) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lPOBU-0003bB-Bf for qemu-devel@nongnu.org; Thu, 25 Mar 2021 07:29:52 -0400 Received: from mail-wr1-x42d.google.com ([2a00:1450:4864:20::42d]:38436) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lPOBS-0006kJ-Fi for qemu-devel@nongnu.org; Thu, 25 Mar 2021 07:29:52 -0400 Received: by mail-wr1-x42d.google.com with SMTP id z2so1911604wrl.5 for ; Thu, 25 Mar 2021 04:29:50 -0700 (PDT) Received: from avogadro.lan ([2001:b07:6468:f312:5e2c:eb9a:a8b6:fd3e]) by smtp.gmail.com with ESMTPSA id g11sm7220118wrw.89.2021.03.25.04.29.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Mar 2021 04:29:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=smfqshe5rWL1zIyiqGH7+GywYlbeI5eZY7MNQuJ+Muk=; b=nsdPFx1puYrLkbwqlVtbmicHvfHWd1sIByXDPH011FLGpI7MK+FVJ0TLPnmBEbrQN6 iyhFxrqMHXSSoT9h1pfZWLDKJsaU+FEbggFc/MsiHZDZ35yDYpj1maPbc7XuakbzGyUA EPAHlODCDUnp3PNZPB86/KwPnTFcBrT7h/FRgpqMcoRRi3+Px27IYTIXPXXbD0CuSZJQ ooxIIth9SmHk0wQfQH95EW7xIFUKO64zL0O47HC0G6enoK600S5wz5Mz/fTIXzyxdyq+ DzwCV4CKmwYXlfkgMmwhNn1p1w2VRR7tk53tkZYa0UL4sH6qpbREySzxe/Oivtj7IeAX 9OKw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=smfqshe5rWL1zIyiqGH7+GywYlbeI5eZY7MNQuJ+Muk=; b=e6KUXS6ZipG6cnjQUEtBPeLBcBw4+FgrxqJrTfE4iY7gUoFJyMgog2jyWqhtjrApG9 sSoJtdY+yqVAI3BDJ7AJ5IEXEA4gRpe9N8KtOEY1D1s1ss47d+tCPs/G0tKjNiQaksJa f1MFTSnhuqLvaFdiFJrQIBVjVc2E15upLjehJizk+cV+Lks35nekh/1A/kW0+RWpmcEn xGUE7V2ZxnPe8rFcGazkcz7jg8bN63Gs3a/nufzKP2WFdAEcut5fE8Kv/bCRqEmgwPZZ vXhK3aJDSOK8HPez+he9koKJNsm0i3ax1EaWQ2NPxfsou1DiHRLwJ4W7tbOdR1/bU7b7 MjSQ== X-Gm-Message-State: AOAM531lyiTrI3Ch3xwMN8Xh/P5m57ENEsH6cgGebb4/BCRu783kLAsP 53tCRgb6u3V5SJT3ZNfDThfyaFpj3qA= X-Google-Smtp-Source: ABdhPJx2XB6QU3EOpOfyyMHdJhYlynrZfRIcfQZPShQG/99xGMXBOfT1KFxHgMe08Mwf2u3dhCh0UA== X-Received: by 2002:adf:c40b:: with SMTP id v11mr8296123wrf.320.1616671789296; Thu, 25 Mar 2021 04:29:49 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH v6 6/6] test-coroutine: Add rwlock downgrade test Date: Thu, 25 Mar 2021 12:29:41 +0100 Message-Id: <20210325112941.365238-7-pbonzini@redhat.com> X-Mailer: git-send-email 2.30.1 In-Reply-To: <20210325112941.365238-1-pbonzini@redhat.com> References: <20210325112941.365238-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=2a00:1450:4864:20::42d; envelope-from=paolo.bonzini@gmail.com; helo=mail-wr1-x42d.google.com X-Spam_score_int: -14 X-Spam_score: -1.5 X-Spam_bar: - X-Spam_report: (-1.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FORGED_FROMDOMAIN=0.249, FREEMAIL_FROM=0.001, HEADER_FROM_DIFFERENT_DOMAINS=0.25, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no 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: david.edmondson@oracle.com, stefanha@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: David Edmondson Test that downgrading an rwlock does not result in a failure to schedule coroutines queued on the rwlock. The diagram associated with test_co_rwlock_downgrade() describes the intended behaviour, but what was observed previously corresponds to: | c1 | c2 | c3 | c4 | |--------+------------+------------+----------| | rdlock | | | | | yield | | | | | | wrlock | | | | | | | | | | | rdlock | | | | | | | | | | | wrlock | | | | | | | unlock | | | | | yield | | | | | | | | | | | downgrade | | | | | ... | | | | | unlock | | | | | | | | | | | | | This results in a failure... ERROR:../tests/test-coroutine.c:369:test_co_rwlock_downgrade: assertion fai= led: (c3_done) Bail out! ERROR:../tests/test-coroutine.c:369:test_co_rwlock_downgrade: ass= ertion failed: (c3_done) ...as a result of the c3 coroutine failing to run to completion. Signed-off-by: David Edmondson Message-Id: <20210309144015.557477-5-david.edmondson@oracle.com> Signed-off-by: Paolo Bonzini --- tests/unit/test-coroutine.c | 99 +++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) diff --git a/tests/unit/test-coroutine.c b/tests/unit/test-coroutine.c index 6e6f51d480..aa77a3bcb3 100644 --- a/tests/unit/test-coroutine.c +++ b/tests/unit/test-coroutine.c @@ -325,6 +325,104 @@ static void test_co_rwlock_upgrade(void) g_assert(c2_done); } =20 +static void coroutine_fn rwlock_rdlock_yield(void *opaque) +{ + qemu_co_rwlock_rdlock(&rwlock); + qemu_coroutine_yield(); + + qemu_co_rwlock_unlock(&rwlock); + qemu_coroutine_yield(); + + *(bool *)opaque =3D true; +} + +static void coroutine_fn rwlock_wrlock_downgrade(void *opaque) +{ + qemu_co_rwlock_wrlock(&rwlock); + + qemu_co_rwlock_downgrade(&rwlock); + qemu_co_rwlock_unlock(&rwlock); + *(bool *)opaque =3D true; +} + +static void coroutine_fn rwlock_rdlock(void *opaque) +{ + qemu_co_rwlock_rdlock(&rwlock); + + qemu_co_rwlock_unlock(&rwlock); + *(bool *)opaque =3D true; +} + +static void coroutine_fn rwlock_wrlock(void *opaque) +{ + qemu_co_rwlock_wrlock(&rwlock); + + qemu_co_rwlock_unlock(&rwlock); + *(bool *)opaque =3D true; +} + +/* + * Check that downgrading a reader-writer lock does not cause a hang. + * + * Four coroutines are used to produce a situation where there are + * both reader and writer hopefuls waiting to acquire an rwlock that + * is held by a reader. + * + * The correct sequence of operations we aim to provoke can be + * represented as: + * + * | c1 | c2 | c3 | c4 | + * |--------+------------+------------+------------| + * | rdlock | | | | + * | yield | | | | + * | | wrlock | | | + * | | | | | + * | | | rdlock | | + * | | | | | + * | | | | wrlock | + * | | | | | + * | unlock | | | | + * | yield | | | | + * | | | | | + * | | downgrade | | | + * | | | | | + * | | | unlock | | + * | | ... | | | + * | | unlock | | | + * | | | | | + * | | | | unlock | + */ +static void test_co_rwlock_downgrade(void) +{ + bool c1_done =3D false; + bool c2_done =3D false; + bool c3_done =3D false; + bool c4_done =3D false; + Coroutine *c1, *c2, *c3, *c4; + + qemu_co_rwlock_init(&rwlock); + + c1 =3D qemu_coroutine_create(rwlock_rdlock_yield, &c1_done); + c2 =3D qemu_coroutine_create(rwlock_wrlock_downgrade, &c2_done); + c3 =3D qemu_coroutine_create(rwlock_rdlock, &c3_done); + c4 =3D qemu_coroutine_create(rwlock_wrlock, &c4_done); + + qemu_coroutine_enter(c1); + qemu_coroutine_enter(c2); + qemu_coroutine_enter(c3); + qemu_coroutine_enter(c4); + + qemu_coroutine_enter(c1); + + g_assert(c2_done); + g_assert(c3_done); + g_assert(c4_done); + + qemu_coroutine_enter(c1); + + g_assert(c1_done); +} + /* * Check that creation, enter, and return work */ @@ -563,6 +661,7 @@ int main(int argc, char **argv) g_test_add_func("/locking/co-mutex", test_co_mutex); g_test_add_func("/locking/co-mutex/lockable", test_co_mutex_lockable); g_test_add_func("/locking/co-rwlock/upgrade", test_co_rwlock_upgrade); + g_test_add_func("/locking/co-rwlock/downgrade", test_co_rwlock_downgra= de); if (g_test_perf()) { g_test_add_func("/perf/lifecycle", perf_lifecycle); g_test_add_func("/perf/nesting", perf_nesting); --=20 2.29.2