From patchwork Tue Oct 23 07:57:54 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Chunming Zhou X-Patchwork-Id: 10652793 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id D84F713B5 for ; Tue, 23 Oct 2018 07:58:09 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A5CB52906E for ; Tue, 23 Oct 2018 07:58:09 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9A34D29088; Tue, 23 Oct 2018 07:58:09 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.2 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED autolearn=unavailable version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 299832906E for ; Tue, 23 Oct 2018 07:58:09 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 6BB236E0E6; Tue, 23 Oct 2018 07:58:05 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from NAM05-DM3-obe.outbound.protection.outlook.com (mail-eopbgr730078.outbound.protection.outlook.com [40.107.73.78]) by gabe.freedesktop.org (Postfix) with ESMTPS id 6A1816E070; Tue, 23 Oct 2018 07:58:03 +0000 (UTC) Received: from MWHPR12CA0054.namprd12.prod.outlook.com (2603:10b6:300:103::16) by CY1PR12MB0426.namprd12.prod.outlook.com (2a01:111:e400:5191::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1250.30; Tue, 23 Oct 2018 07:58:00 +0000 Received: from BY2NAM03FT028.eop-NAM03.prod.protection.outlook.com (2a01:111:f400:7e4a::206) by MWHPR12CA0054.outlook.office365.com (2603:10b6:300:103::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.1273.18 via Frontend Transport; Tue, 23 Oct 2018 07:58:00 +0000 Received-SPF: None (protection.outlook.com: amd.com does not designate permitted sender hosts) Received: from SATLEXCHOV02.amd.com (165.204.84.17) by BY2NAM03FT028.mail.protection.outlook.com (10.152.84.238) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.1273.13 via Frontend Transport; Tue, 23 Oct 2018 07:58:00 +0000 Received: from zhoucm1.amd.com (10.34.1.3) by SATLEXCHOV02.amd.com (10.181.40.72) with Microsoft SMTP Server id 14.3.389.1; Tue, 23 Oct 2018 02:57:58 -0500 From: Chunming Zhou To: Date: Tue, 23 Oct 2018 15:57:54 +0800 Message-ID: <20181023075754.13826-1-david1.zhou@amd.com> X-Mailer: git-send-email 2.17.1 MIME-Version: 1.0 X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:165.204.84.17; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(346002)(376002)(136003)(39860400002)(396003)(2980300002)(428003)(199004)(189003)(8936002)(66574009)(426003)(336012)(6916009)(126002)(77096007)(476003)(2616005)(316002)(1857600001)(186003)(54906003)(36756003)(486006)(4326008)(478600001)(104016004)(5660300001)(2870700001)(50466002)(14444005)(1076002)(305945005)(5820100001)(97736004)(86362001)(26005)(53936002)(106466001)(2351001)(68736007)(81156014)(8676002)(105586002)(81166006)(50226002)(2906002)(72206003)(53416004)(47776003)(23676004)(356004)(7696005)(6666004); DIR:OUT; SFP:1101; SCL:1; SRVR:CY1PR12MB0426; H:SATLEXCHOV02.amd.com; FPR:; SPF:None; LANG:en; PTR:InfoDomainNonexistent; A:1; MX:1; X-Microsoft-Exchange-Diagnostics: 1; BY2NAM03FT028; 1:iDo0w4AijfOHJAap4U3sbTZGm6ji5U25YSPOb4hjGrIHggK2cIYWVnp7Q6P1NneipH8vKCr8z+fPCy77Zw7kKHSmBI4o/UXvI1Rhi4m41S7p77Rw+o3t/dJzDwqpMZws X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: bda82c51-c598-4e2e-34c5-08d638bd40ab X-Microsoft-Antispam: BCL:0; PCL:0; RULEID:(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600074)(711020)(2017052603328)(7153060); SRVR:CY1PR12MB0426; X-Microsoft-Exchange-Diagnostics: 1; CY1PR12MB0426; 3:/6kkvDV3mKndsr3UDiYTMQ4Lh+0eCquj7IH3wT01JxcFZpn32XQ21vrIvfHiR6ILYLF4ZYQMrgFldNNjBheG+B6BPlLgX/wGEJg3I2HUjcXUJxLm4vG4VSa/i3V6Ya0cAn1ANk1mzp9AmoETG1l4fiY3345rsRq/S2yoL/xVUuYGGfDFvylV2+w7QbRzEvNPBlzd9RGmyejXzwpGpT7T0pEdtYXKXT+ULbRqbvaRWetlYbIe1G2/3cDX2dERqSuIU4II9pSIkgzWd09pYMu276Q02j6H110ntwQUaSRcfhIazHDRlrCxN0hC1CQ85Hf79FijmARHUAeP8JprAT0KSGJSCWm994T+sqzKDQ2sSCo=; 25:L+hZicDPQz7a/IHMwUDVh033rC2YkyfpYDv9eQmRTp18P3xGxezd0TbDddWE+urWY7l1IvD28bJJTJRAxf9T+ubn2MoGf4gJSzE9p2ApPlDUtCfAn7/ZZQTtp+YCslgyNf3omItQClJJ25ktdLs5HUwkYF3KMdPXa7hK49AUSbYnwX5yPyaP5Sj9N0Glsp0fpqRO7JIE/7hQy2Vy/UkwgOShDdUets6m1U5pPfp5NTs8UMhVk6tL3uC7BT0aNEJ3d7tXvEcjHXAmx/Kq8F2rQ6oQlaJ1ZE6aqPC47S2gfsVRTO+EroGjLFQoOh1Sxm6sp9uTU1ohZsva9Rmjnu1dbg== X-MS-TrafficTypeDiagnostic: CY1PR12MB0426: X-Microsoft-Exchange-Diagnostics: 1; CY1PR12MB0426; 31:y7S02hpkyUFADUCLE1Q4ZP/pP38l/sK5JyGBvRnubJGOxUehGVVxm8U0W4AfTP3s1IpN1n6Zs4fMBAiRzzLiPZ9o3dIXcXjcmWQGAPH1bCB6BS8rLWf0ncmgyST5CjiFQstOvtujWbaKJ/OWTNrJPNRIuSdCPAaClKuyziThn5tx58gwyVDiOMVjzCVHrPGgaGodCgHwQmSjM4Zy6K4OssGSwOyr6vrqL9aPu50q2i4=; 20:GY7Q/Yo6LuJqC6Ag3kU9K8Kq0RHEEuFxkZ8XsdNLTSwPeW29P2YTeIMULkQGSdY4ZbPM7Nbhpegi0kcMlavJDxDzBjq+P4R+pIOLquhKM3JVuwceM5VPvQsJbVWmv5qpBcQpPaEXqzluddhye3mjxOJ26ion7NIrdwBrnQgB0stJtXtZqWGW4ZjbiyiIvfKE71ms1qGPaTSZPbj+q8HrYhlkRNRm9Kp7IVdiEkY99SJ9DIjygSYCycdc49faRKb7Tg1xX+u2a86swbm64D5NY1CLnNtQE78gfmQDFCrffYCmyLy6XItZOmGLjWkAhbfLwBL9/yf9owSuFDklFwUSov0/KwoKnpkyS5S3MVI4WDLcJfFu/Dlxas2GUE+BicDzwZLT0o3cHRnVzmV+RHOfuVdRYEvItgu16cDZeJe/Sn97lPEjBa9Gm1/VgI7GVaiYtezB3ibBfzgZkJ4lLgKazbKnEsHWi6a4vpQoIVmthtpbfZaNRyqrT1f3AXUSmkKp X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110)(217544274631240)(788757137089); X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(5005006)(8121501046)(3002001)(10201501046)(3231355)(944501410)(52105095)(93006095)(93003095)(6055026)(148016)(149066)(150057)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123560045)(20161123562045)(201708071742011)(7699051)(76991095); SRVR:CY1PR12MB0426; BCL:0; PCL:0; RULEID:; SRVR:CY1PR12MB0426; X-Microsoft-Exchange-Diagnostics: 1; CY1PR12MB0426; 4:b7rnZ7jHQk8P8ZU2MeCmk5KbVn739XytyZHROb9/Q7dmQGRS5BGujcU+flVulYLpqo/8G3AOiPs549qML5UctGI0H3YUuDzgsKLK2xFxC/xgd1AboqkzJxgYuQbVOw35M7ECDx3qBgZwAzDjtwbXFIuWvt89lcBvdjKtH+iZQcu5SXvo/+ROhSIhuIJvyoA/flDdvlnYKv/JYiy4Sap8dfLMoAuNRIEQ1APZVA3LA4ul2rqhW3HeZ0hfU5d5gs/NFzkOGBPsKkwWUvOKJemjylf7nZYzOZN6BqWhpVx4BCEYKmRv2HYpv4L36ahARv6uKoCGAXoAfru31UBhWW59Dnb2+pI4IkFUrnNHdkviUeMVpYWiR/Yp/FIjcuaEm6/6 X-Forefront-PRVS: 0834BAF534 X-Microsoft-Exchange-Diagnostics: =?utf-8?q?1=3BCY1PR12MB0426=3B23=3A9sQhcNe?= =?utf-8?q?XnPJE9JhrNr3c/B2KZeijmIAQ/NHAjIrgXWVN2exBZHoMew/Ev3fEKnr+PwIM0OfI?= =?utf-8?q?wuJnJmwVEXbFDzYSeHtgipQvIcrYlYqnc5lKMFfUlPVvsFl7mrN5sOD2Yu5TspOLx?= =?utf-8?q?umaoSc2xOyFdye4BMvHhmX5h6J3JKuOw61WdYbA5c5D4ypzbHIiE5KMoFSV0TDTKk?= =?utf-8?q?pXf/0rJ+UYDccJcRbnq4bPvk4aUgFsN26HwoJDM84i0/sgt5+UqVzPgtVP/KAkHZ2?= =?utf-8?q?ePAWnz2+sHrmcSnmHKaaOsR45hGHlD/ipLvRgOIiFVEhcURZoTIL2ogzfzy1+GxEz?= =?utf-8?q?3xjwiKEzOcH+ToIanrY42YQh6FKLa/+dlDUaqZydHsVDK+T0I0IfPRhuns7LKWXNs?= =?utf-8?q?St3buxMZKzKCuIubuD6XSvf4JouUx8k8+e5tOoYNO06hHzMfzTc6+Z+Tz5m3sExCp?= =?utf-8?q?vNa5ywSLasvfVwcE9KGOcop5LwttkAMfdPtFQukdmGz96pddqnzi4m/qrEOMx13OH?= =?utf-8?q?dND0V1TOll+dIGAWa3Z0P9Fu06Xru8c4313CFjm4aJLcqNktIi9zcDK7RX0Ex1SNC?= =?utf-8?q?+6Bs+uk5UVnsQOCSDt9UyVZjOaLbJCrGmm4wj1x21ZbVkG+/JJs08WSaeCpkNd/Ak?= =?utf-8?q?2smWAN9Io+JQ0lA3cbsEniiDIg58pxJM3JmT9sXWxOhkitH33kRBGCk+aDEGkFeUU?= =?utf-8?q?dtlL0J7dMfIYFJxGLlnXiVzYlg0tMdez4S1B4/bmlmIdfpxc9fvJdHV/e5nwjKdOt?= =?utf-8?q?pW/CVYw/zmz4t6apV2iC9zBNefwlbCi44JpZzzu8im9XNrQOQgIxXqxvm2QYUAHVf?= =?utf-8?q?QyJuvNjDUgbhjK7TBX5NtTM4J35JpoPl3IcYNiuMyoN5MBBenbx0wn3HEEI5WXiPq?= =?utf-8?q?edTbP4kkTGtn7aB/EaLIhltIRW0mHOOs1k4tJCK5c/ZVOn3aS0P9wsRSToxiV0pF+?= =?utf-8?q?QftyE2AYEca+tr25GoMRZyS2r9ek6aGHPmJGVraJyND30oo/mupbCN6+LhG3FhDWQ?= =?utf-8?q?8jNI7tLUchO0ZTf4O26vGdVOCcXgJRN7FTYcwku6/DbuLskgIQt1GWnQ8i0apOGVb?= =?utf-8?q?9dbqbj8Dqkktpgy+QPeR6wmOhK2yYbWsEOUD3Td6eaRelS+uQvg0r4SbCmM5IMYPR?= =?utf-8?q?W3CMZchhHg2Df5flP6EEGqBRxHgcXl+ZfHKkyc4?= X-Microsoft-Antispam-Message-Info: EvZu7mxfyoKFVtoX1q7WYIjndeHLIv/AGC6uRJkwi6kRQhZ9gbOAjVUS0sUgg2eTtmrmRMpogvQmm/79LaVijakslBpkyvmmnj8uQy1s3k5td+m+xlhFok4XdA5TwROZmOWhWMFvYwoS01YIeAMnCQ01/DL7EX+0xY0OzKwLgfx43fcWWNQdAno9jvGPxyAyygG/N9ZWXJ7r67m2Df8QAURI8h5m0FmbB/jA8D/5uc2c7AkeQm+1YfKM2+xYzhfoYRDF6V5SQgz1VTv6AvUEGPL13R0PMdDPwYl4ujlKjZEZw1Dyb8Ie4eezlD51gGzkQV7GIEBaYovuMmyhqnZcq6yxtarTZ3QTvtMqqFjTTCA= X-Microsoft-Exchange-Diagnostics: 1; CY1PR12MB0426; 6:3Q0pmSEXG9ljbn5pnvepn8SmoNfbV+N04DuhSFCCmEohuvTYfC8mxDIVWVYjRKUSLbueHsAaTc1qJqYq/TkNE2/Dp+kueuy/nyQWOwJ8aPrapmJYOHrRgT9iqcTwnhDOTdw2Nbx4wq0BsvdVVBpx17zg9PrtZ5uTHKVIPp25rp9P1FH6YqvBgjkw07Txqzy2GSSrOdukSNYTAi7LMIihx9yVwKX2vBNv9DGa9KvpimRczF2POZBcOIPp1JhUuDkrO/QYRQnqw243xh2gKtzoe/4GGneeGNbm48yfvOvIshAEQFTUAPs81/Idw/+TVxua11fUP2Y1YHmepzhw+ARzYt5ZB21v29KKAG/G/HTO9CnVf3okYx6rCKnYPD5dWjdZxY17JGeo1JikGw3Rn3eYb4w49/NSm3WnrqL2JFvguPy18pEjA8qkh+4Ucrj/xHpy0snGvBNleTrJdhVr35tNAg==; 5:Amh8W2roQNWVelVpJk7ADTMQwpigoWhH8iBWp2M36aLPoT2FEqehWLv0eturYHc47d2UCsQRac5epr4773iM8oCQ8kgDdOtsjIzqq2E4YqXUqhdWse2O0QaWeL6kTTSIHZp4joTQe8kxoBBMuTwLGgPDpJZA8rqfRwgZhApmXuo=; 7:IDWB4EKg8HLDQ0U8rYB8Qjg33s0POttoyJB8NudqSsJvdaCEngHN3lheYbc0IYxWWIPOKs1JNubYYW2p8Au8X/QMQFrN7SiAiNmADwSv2cEsagjKKY+J727HG36nMb7K9WNlapGF7FFtWHt2tLzZsTFdirNuNdExSHgujGzhY9FKrH5R5TsBgjA5AQ1bQgJ7iRz3JIeBUhuf+20tm5YSKGZ2IBFYtHNG2Yrz1GVYNniAa4hTFJqB6vXiI64r/wGW SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; CY1PR12MB0426; 20:DbQigjPBQvP+jSB2tZU8KkZxkAh01L8AYnzzz2PhV/nFeiH8w1ifiHo4jy2uLKJI1EN9/8bARO8g69kPx9QlfBa/2gf3JLUBj1sFN2VUo5Lb5eGyA7mMIrM2Dyv1tYfIiq9VU4HVZSjky2wN2fI6qjh1uU+OPIGSNsc8LCC2fuD/+oqngjqSNHf7HIfcdfToOxj8iNLTcZu5jO2vXnFla4TRSVpUhay4DBf0AqWID07T8hpqwpR8veji0h4X7IFE X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Oct 2018 07:58:00.1783 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: bda82c51-c598-4e2e-34c5-08d638bd40ab X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d; Ip=[165.204.84.17]; Helo=[SATLEXCHOV02.amd.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR12MB0426 Subject: [Intel-gfx] [PATCH] drm: fix deadlock of syncobj v5 X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Chunming Zhou , intel-gfx@lists.freedesktop.org, =?utf-8?q?Christian_K=C3=B6nig?= Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Virus-Scanned: ClamAV using ClamSMTP v2: add a mutex between sync_cb execution and free. v3: clearly separating the roles for pt_lock and cb_mutex (Chris) v4: the cb_mutex should be taken outside of the pt_lock around this if() block. (Chris) v5: fix a corner case Tested by syncobj_basic and syncobj_wait of igt. Signed-off-by: Chunming Zhou Cc: Daniel Vetter Cc: Chris Wilson Cc: Christian König Cc: intel-gfx@lists.freedesktop.org Reviewed-by: Chris Wilson --- drivers/gpu/drm/drm_syncobj.c | 55 +++++++++++++++++++---------------- include/drm/drm_syncobj.h | 8 +++-- 2 files changed, 36 insertions(+), 27 deletions(-) diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c index 57bf6006394d..679a56791e34 100644 --- a/drivers/gpu/drm/drm_syncobj.c +++ b/drivers/gpu/drm/drm_syncobj.c @@ -125,23 +125,26 @@ static int drm_syncobj_fence_get_or_add_callback(struct drm_syncobj *syncobj, if (!ret) return 1; - spin_lock(&syncobj->lock); + mutex_lock(&syncobj->cb_mutex); /* We've already tried once to get a fence and failed. Now that we * have the lock, try one more time just to be sure we don't add a * callback when a fence has already been set. */ + spin_lock(&syncobj->pt_lock); if (!list_empty(&syncobj->signal_pt_list)) { - spin_unlock(&syncobj->lock); + spin_unlock(&syncobj->pt_lock); drm_syncobj_search_fence(syncobj, 0, 0, fence); - if (*fence) + if (*fence) { + mutex_unlock(&syncobj->cb_mutex); return 1; - spin_lock(&syncobj->lock); + } } else { + spin_unlock(&syncobj->pt_lock); *fence = NULL; drm_syncobj_add_callback_locked(syncobj, cb, func); ret = 0; } - spin_unlock(&syncobj->lock); + mutex_unlock(&syncobj->cb_mutex); return ret; } @@ -150,43 +153,43 @@ void drm_syncobj_add_callback(struct drm_syncobj *syncobj, struct drm_syncobj_cb *cb, drm_syncobj_func_t func) { - spin_lock(&syncobj->lock); + mutex_lock(&syncobj->cb_mutex); drm_syncobj_add_callback_locked(syncobj, cb, func); - spin_unlock(&syncobj->lock); + mutex_unlock(&syncobj->cb_mutex); } void drm_syncobj_remove_callback(struct drm_syncobj *syncobj, struct drm_syncobj_cb *cb) { - spin_lock(&syncobj->lock); + mutex_lock(&syncobj->cb_mutex); list_del_init(&cb->node); - spin_unlock(&syncobj->lock); + mutex_unlock(&syncobj->cb_mutex); } static void drm_syncobj_init(struct drm_syncobj *syncobj) { - spin_lock(&syncobj->lock); + spin_lock(&syncobj->pt_lock); syncobj->timeline_context = dma_fence_context_alloc(1); syncobj->timeline = 0; syncobj->signal_point = 0; init_waitqueue_head(&syncobj->wq); INIT_LIST_HEAD(&syncobj->signal_pt_list); - spin_unlock(&syncobj->lock); + spin_unlock(&syncobj->pt_lock); } static void drm_syncobj_fini(struct drm_syncobj *syncobj) { struct drm_syncobj_signal_pt *signal_pt = NULL, *tmp; - spin_lock(&syncobj->lock); + spin_lock(&syncobj->pt_lock); list_for_each_entry_safe(signal_pt, tmp, &syncobj->signal_pt_list, list) { list_del(&signal_pt->list); dma_fence_put(&signal_pt->fence_array->base); kfree(signal_pt); } - spin_unlock(&syncobj->lock); + spin_unlock(&syncobj->pt_lock); } static struct dma_fence @@ -249,14 +252,14 @@ static int drm_syncobj_create_signal_pt(struct drm_syncobj *syncobj, fences[num_fences++] = dma_fence_get(fence); /* timeline syncobj must take this dependency */ if (syncobj->type == DRM_SYNCOBJ_TYPE_TIMELINE) { - spin_lock(&syncobj->lock); + spin_lock(&syncobj->pt_lock); if (!list_empty(&syncobj->signal_pt_list)) { tail_pt = list_last_entry(&syncobj->signal_pt_list, struct drm_syncobj_signal_pt, list); fences[num_fences++] = dma_fence_get(&tail_pt->fence_array->base); } - spin_unlock(&syncobj->lock); + spin_unlock(&syncobj->pt_lock); } signal_pt->fence_array = dma_fence_array_create(num_fences, fences, syncobj->timeline_context, @@ -266,16 +269,16 @@ static int drm_syncobj_create_signal_pt(struct drm_syncobj *syncobj, goto fail; } - spin_lock(&syncobj->lock); + spin_lock(&syncobj->pt_lock); if (syncobj->signal_point >= point) { DRM_WARN("A later signal is ready!"); - spin_unlock(&syncobj->lock); + spin_unlock(&syncobj->pt_lock); goto exist; } signal_pt->value = point; list_add_tail(&signal_pt->list, &syncobj->signal_pt_list); syncobj->signal_point = point; - spin_unlock(&syncobj->lock); + spin_unlock(&syncobj->pt_lock); wake_up_all(&syncobj->wq); return 0; @@ -294,7 +297,7 @@ static void drm_syncobj_garbage_collection(struct drm_syncobj *syncobj) { struct drm_syncobj_signal_pt *signal_pt, *tmp, *tail_pt; - spin_lock(&syncobj->lock); + spin_lock(&syncobj->pt_lock); tail_pt = list_last_entry(&syncobj->signal_pt_list, struct drm_syncobj_signal_pt, list); @@ -315,7 +318,7 @@ static void drm_syncobj_garbage_collection(struct drm_syncobj *syncobj) } } - spin_unlock(&syncobj->lock); + spin_unlock(&syncobj->pt_lock); } /** * drm_syncobj_replace_fence - replace fence in a sync object. @@ -344,13 +347,14 @@ void drm_syncobj_replace_fence(struct drm_syncobj *syncobj, drm_syncobj_create_signal_pt(syncobj, fence, pt_value); if (fence) { struct drm_syncobj_cb *cur, *tmp; + LIST_HEAD(cb_list); - spin_lock(&syncobj->lock); + mutex_lock(&syncobj->cb_mutex); list_for_each_entry_safe(cur, tmp, &syncobj->cb_list, node) { list_del_init(&cur->node); cur->func(syncobj, cur); } - spin_unlock(&syncobj->lock); + mutex_unlock(&syncobj->cb_mutex); } } EXPORT_SYMBOL(drm_syncobj_replace_fence); @@ -386,11 +390,11 @@ drm_syncobj_point_get(struct drm_syncobj *syncobj, u64 point, u64 flags, if (ret < 0) return ret; } - spin_lock(&syncobj->lock); + spin_lock(&syncobj->pt_lock); *fence = drm_syncobj_find_signal_pt_for_point(syncobj, point); if (!*fence) ret = -EINVAL; - spin_unlock(&syncobj->lock); + spin_unlock(&syncobj->pt_lock); return ret; } @@ -500,7 +504,8 @@ int drm_syncobj_create(struct drm_syncobj **out_syncobj, uint32_t flags, kref_init(&syncobj->refcount); INIT_LIST_HEAD(&syncobj->cb_list); - spin_lock_init(&syncobj->lock); + spin_lock_init(&syncobj->pt_lock); + mutex_init(&syncobj->cb_mutex); if (flags & DRM_SYNCOBJ_CREATE_TYPE_TIMELINE) syncobj->type = DRM_SYNCOBJ_TYPE_TIMELINE; else diff --git a/include/drm/drm_syncobj.h b/include/drm/drm_syncobj.h index 5e8c5c027e09..29244cbcd05e 100644 --- a/include/drm/drm_syncobj.h +++ b/include/drm/drm_syncobj.h @@ -75,9 +75,13 @@ struct drm_syncobj { */ struct list_head cb_list; /** - * @lock: Protects syncobj list and write-locks &fence. + * @pt_lock: Protects pt list. */ - spinlock_t lock; + spinlock_t pt_lock; + /** + * @cb_mutex: Protects syncobj cb list. + */ + struct mutex cb_mutex; /** * @file: A file backing for this syncobj. */