From patchwork Sun Aug 25 04:35:46 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nuo Mi X-Patchwork-Id: 51138 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:b3c7:0:b0:48e:c0f8:d0de with SMTP id g7csp1159199vqt; Sat, 24 Aug 2024 21:45:05 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCXiRn+PnV3nO0zakaH1jQy9Aus791VoamztA9uZomchWwJkp5ritL1yFxGnqUkcUnxGAT/zf9ADHfU8wS/H5Mt5@gmail.com X-Google-Smtp-Source: AGHT+IE1pk2yybQAP5cBGLj7VHyQ9/hDpwVewVWSNSZj0GAw6vd+RPQUHXNEN5jdZMKI8kZOUva3 X-Received: by 2002:a17:907:868e:b0:a7a:8c2b:3ac1 with SMTP id a640c23a62f3a-a86a54a8550mr285510966b.6.1724561105198; Sat, 24 Aug 2024 21:45:05 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a640c23a62f3a-a868f553635si497439266b.963.2024.08.24.21.45.04; Sat, 24 Aug 2024 21:45:05 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@outlook.com header.s=selector1 header.b=f+Ztuop8; arc=fail (body hash mismatch); spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B76A068DB72; Sun, 25 Aug 2024 07:36:22 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from APC01-TYZ-obe.outbound.protection.outlook.com (mail-tyzapc01olkn2105.outbound.protection.outlook.com [40.92.107.105]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0E6D268D960 for ; Sun, 25 Aug 2024 07:36:14 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=t36YCg5ZPC6kXMRwh0zJ0tCAs8FUKnE5Mwa+f8ZVpF6nURA3G6saGllDJ0sueidQ+xD2ybbRhoemK2oLQ/53c6ByCvyoK9FNY63knDJkSaniTq7FSu/J5BEThW47pn0B9/ceVDbACGYbhYi2NWj7aQhu9MsT5kXkU2iNS4fzM2MqHg/A6AKxcFdpiYeiiqWdIcHx5E9ChjDLxlTmP81igpqvfitb4dAoawW7Bwki5rBZ9RUPwsB3DtC0rg6nTfWIqYpGVyEGmBS5ycvKqmPkxznkLpbr9EyquddIM6kgIpOjKtfSBMyZ2/hcdSPgmcoBMnApwqffxq4V+L1DLSZr+w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=5oyRuPwnER8W9GwNvU2tciDPsUijRp5oHFW/xT+mjmM=; b=KwSAnoUbWZu0Z4egAXs3+B2vhihbJ3faOEYAbWqSamw6pxDBOK1U+Q1XuTXHhMbwlcz2Z/IUyBJTi15xIG/D7aI4xAgmeUYyCpa9bvg4GAl327AKCzKN/OHyQi6LKZ9YHpd0Lu9tVT4YIg6i+P8/URQJMehj9o+L3A+zDwPv89URxz64VNArZk0K9pk8yUFPTnkCvUy0ofC9Ets3FA7KyR7zx+5MXJ228szOkCO/HTbEvmPbZHYDklSpQP03KcrqZLT2GscHru8TuAXyfAh/8mrutkAj8EfA9fRNSF+Ymai2/58aPk96UavlZ9YL9gNu/Q25v9tbq5nXcrvjBLzznQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=5oyRuPwnER8W9GwNvU2tciDPsUijRp5oHFW/xT+mjmM=; b=f+Ztuop8pWqL/3FLeiOZvSr7K3mpi3pc1d5ymvYrB+cEXJmOZZ3Z4zTiwRt5cugp8MpUU6IwfjG+abS+NgxTiDE2teWhesftPNII3hkfgeHsm4QwmWVCv7Jm2mlJq6wsMoBVQIO3zgPe+bJBI5RCg9ScXiCdUbaOuYGnLtuUkB6Mg7VcFfp4ZaUzpIaIsUkV91Bf0asm1G0vDrdCP7rpukmJJQ5CNWss9VnAJcgX7jTXi4zretCmeckiqUKX8hFWhNkG8A82ywCQVfsSNPgpECALavdbWCFs3PPt+PYKKHMIExJUR7kSWYHSmqq1x0aiIU+85faDX6cU/2gD+mnJ3w== Received: from TYSPR06MB6433.apcprd06.prod.outlook.com (2603:1096:400:47a::6) by TYSPR06MB6969.apcprd06.prod.outlook.com (2603:1096:405:31::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7897.24; Sun, 25 Aug 2024 04:36:09 +0000 Received: from TYSPR06MB6433.apcprd06.prod.outlook.com ([fe80::81f7:9125:583a:1cca]) by TYSPR06MB6433.apcprd06.prod.outlook.com ([fe80::81f7:9125:583a:1cca%5]) with mapi id 15.20.7897.021; Sun, 25 Aug 2024 04:36:09 +0000 From: Nuo Mi To: ffmpeg-devel@ffmpeg.org Date: Sun, 25 Aug 2024 12:35:46 +0800 Message-ID: X-Mailer: git-send-email 2.34.1 X-TMN: [YtMqQlALfiz+9xLYn3Q7K0AVuRT3LrRr] X-ClientProxiedBy: TYCP286CA0186.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:382::14) To TYSPR06MB6433.apcprd06.prod.outlook.com (2603:1096:400:47a::6) X-Microsoft-Original-Message-ID: <20240825043546.182918-1-nuomi2021@gmail.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 2 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: TYSPR06MB6433:EE_|TYSPR06MB6969:EE_ X-MS-Office365-Filtering-Correlation-Id: a648de31-9ed8-479a-6d7a-08dcc4bf707a X-Microsoft-Antispam: BCL:0; ARA:14566002|19110799003|5072599009|8060799006|15080799006|461199028|1602099012|440099028|3412199025|4302099013|1710799026; X-Microsoft-Antispam-Message-Info: JYtMWOj5X3jbcYkYuNvGFpXB6bDhbWLcNjXler06AGyOmgAVlF9+6o8WZjPuV0ZkB+Pgk52yGg/s9Jtd3RIIkkb9NVJPAj1f8rRbvVpNtlm/+ZBLn31iraJofYs6w8Aaqdm3xF83g5zXWX6MhbL0qzHACROvdFIQ5v0L7HRz6zmPcJG9+me6X+84gjyqp7wa6KJtBy1Ouih+BIuph7j/HoCUkZKdtdvGebpHJQSgo2VJ6iTFqidQrB5BfmKZlXykL1pQrrQUdSwDbk7rDRcSisr3IrqohNGv69wfmDjIg4ND2jjQJPPr+BULFQLB8f7/BpTEdIYBB21HJNVBsYtuTqESq8SmMl2WTI4+WCQJooJ01iV67F069+40yEhrD93NO2DCajQDZO7w0GAhHB6Vs94OBm5J68uYhW4p0NgdjWmzTGQlCoGvypznnm8tily7U8loFRGd+oDbAq8wqSdNNCtjlhDt0Pm/qqG/WLJMiN3mQCPB7/It+i7dZ8H1p2IGvuM5BYjZIJk19sZE7BKLWaptxilGLS6ISDmI58ZwQfOKmjOkOqpk5UzREZIY/JV8cui6Nhd0tkR+1THmlcetUSTvhfMtkgEN8DyQh7lAWNGmRPboUgblkXQmE9x6y6TLBUk4f7FHiHIlUQgz+7ML1zYDx5vxPQ3aHD7xks/eemopfCQG6vtMZitf9FFeYANCDaLw48eFh6YQst1hPwPfBUP9lAfVDXI3WGDIFRhyLc4hFZ+TY4Ed3pnjnzhsFhuyGX1EcAOzNF2DxfUqc7JizfhCuLJwG88la3VTxOtNYuNgBQkLbcDBVZMsSav5MwTqirz1NrHoLIUFd8dyGWpvkw== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: vH9VoAT/UeyMzv/qecXkiOvCJyOYGqf6Xj3YecNyfVjbhf+45cQ6Qp32fdLc+Ff52QoLYZn9epHSa/8TA8RjmYROR3nANC3a35w6mw4NuQzsT294tvwksBY322ENcanGvbn46iYfFGwFKb6lLNh6tLMeq8L5uLlubIcULwNfvmu40skgOj2EnrwSbeft/NqsnwXPkE718qNgfbgVJNSTF0MkG1p1Pa+sxplZorsLv9E7Vmf/BnyAvA79XabbiXs3AZkwea9zcwR43JTDYVWvyL0TcRArwsSkZ3nYC4OPz47165MIrn/yJp6GqEfZ/jTKEgo1P5UVyZQeqkI5k9zcKb4oFXYkGiVPuXU9jazbzgFVj8FTdra2rd5Eqo7BXhpc1RwCz0o0Ap/cycTpGQuWmO1pULJOu0efAQVSuRuq837Ue7GZnIZi+cr2p7HZP/6eQ9TGCMWmSF/SPHUkngWHGp1jeXcNYNZVUh4LbFWuCnOdZB14GxLnwfN97n8vgt6YUsfsH7ks8wr2dz+kbnC1MphytUvCACTL4+yfzRF0G/Z7C4dzS9cie48pO5t88ubHYyyJ3VVB/P77yiZkPedR8ESeQPNvP+95k1rJsRW081QnQs/og7Cy9jGSDds1afsRsNfzxs+mOBLOeZo2+9yseZ5yBqhcakVesPYkiHyjd2OiJOcCut2wjGUx1H7GVNSnOjrgCSpZ3ptMOKhYYs80iyU2+kM9vNoACqmsNBO3y31+zkvHvZYUbjFzk1R+3Viwyzp3PE2tmuS4dU4pREeautJPOfnAW1/Z9S7dkYhDWy+8ojRW9zw8c0zGdK6EAgN1xTwmu/NfXizx3X96pKmTki3FTtZsp0uxt33Yax65X6T1h1DKqJO2czn0TFK5f4CA92QUYTb5XrQiZE2ZhhyOZCnZYENHfEsRxjEakxFITJA+cygHCPidys8GNpo2JIZOqIz9F5zC/CgBAkd537n5k+D1+nxNo6pnJ6b9aRv5WmNKUF2eGyzqhVQlI7c4h2hMMNVmj0WsF+56W9trQMdfrAQgEntQ76UJv201V3bmmo1TpwMzdpgWw3tLoNe260aCx1QyHWxWtgPuMknWEajfeZqyzWJG5YIPHKn3NaB4ed+vGyq/pUMUDRMM2Q8J349B4z8wJfEe0CJ1xOqlCeI4NLVDtjp0sb1vPmlVDS/1ZDndLNj3o18Dg0HT3zmBHlgEURQybjsOrfVh1Criv6gjMZr8AV19tWtXg/Y1r1DpICeOeE/3FegmX/RV9MsjGUvBenaXZlxDIxZS7SzezccycQ== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: a648de31-9ed8-479a-6d7a-08dcc4bf707a X-MS-Exchange-CrossTenant-AuthSource: TYSPR06MB6433.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Aug 2024 04:36:08.7874 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYSPR06MB6969 Subject: [FFmpeg-devel] [PATCH] avcodec/vvcdec: fix potential deadlock in report_frame_progress X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Nuo Mi Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: yIBb0l7NxTDX Fixes: https://fate.ffmpeg.org/report.cgi?slot=x86_64-archlinux-gcc-tsan&time=20240823175808 Reproduction steps: ./configure --enable-memory-poisoning --toolchain=gcc-tsan --disable-stripping && make fate-vvc Root cause: We hold the current frame's lock while updating progress for other frames. This process also requires acquiring other frame locks. It could lead to a deadlock. Example scenario: - Frame F0 holds mutex M0 and then tries to lock M1. - Frame F1, meanwhile, holds mutex M1 and attempts to lock M0. --- libavcodec/vvc/refs.c | 13 +++++++------ libavcodec/vvc/thread.c | 8 ++++++-- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/libavcodec/vvc/refs.c b/libavcodec/vvc/refs.c index c1fc6132c2..bebcef7fd6 100644 --- a/libavcodec/vvc/refs.c +++ b/libavcodec/vvc/refs.c @@ -588,12 +588,13 @@ void ff_vvc_report_progress(VVCFrame *frame, const VVCProgress vp, const int y) VVCProgressListener *l = NULL; ff_mutex_lock(&p->lock); - - av_assert0(p->progress[vp] < y || p->progress[vp] == INT_MAX); - p->progress[vp] = y; - l = get_done_listener(p, vp); - ff_cond_signal(&p->cond); - + if (p->progress[vp] < y) { + // Due to the nature of thread scheduling, later progress may reach this point before earlier progress. + // Therefore, we only update the progress when p->progress[vp] < y. + p->progress[vp] = y; + l = get_done_listener(p, vp); + ff_cond_signal(&p->cond); + } ff_mutex_unlock(&p->lock); while (l) { diff --git a/libavcodec/vvc/thread.c b/libavcodec/vvc/thread.c index 74f8e4e9d0..86a7753c6a 100644 --- a/libavcodec/vvc/thread.c +++ b/libavcodec/vvc/thread.c @@ -466,12 +466,16 @@ static void report_frame_progress(VVCFrameContext *fc, y = old = ft->row_progress[idx]; while (y < ft->ctu_height && atomic_load(&ft->rows[y].col_progress[idx]) == ft->ctu_width) y++; + if (old != y) + ft->row_progress[idx] = y; + // ff_vvc_report_progress will acquire other frames' locks, which could lead to a deadlock + // We need to unlock ft->lock first + ff_mutex_unlock(&ft->lock); + if (old != y) { const int progress = y == ft->ctu_height ? INT_MAX : y * ctu_size; - ft->row_progress[idx] = y; ff_vvc_report_progress(fc->ref, idx, progress); } - ff_mutex_unlock(&ft->lock); } }