From patchwork Tue Oct 23 01:50:08 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Chunming Zhou X-Patchwork-Id: 10652671 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 9611914BB for ; Tue, 23 Oct 2018 01:50:20 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4CEC028E8F for ; Tue, 23 Oct 2018 01:50:20 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3C0EC28E98; Tue, 23 Oct 2018 01:50:20 +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=ham 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 9EAF728E8F for ; Tue, 23 Oct 2018 01:50:19 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 9BA616E041; Tue, 23 Oct 2018 01:50:18 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from NAM01-BY2-obe.outbound.protection.outlook.com (mail-by2nam01on0081.outbound.protection.outlook.com [104.47.34.81]) by gabe.freedesktop.org (Postfix) with ESMTPS id 8A04B6E041 for ; Tue, 23 Oct 2018 01:50:17 +0000 (UTC) Received: from CY4PR12CA0046.namprd12.prod.outlook.com (2603:10b6:903:129::32) by SN1PR12MB0750.namprd12.prod.outlook.com (2a01:111:e400:c45b::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1250.29; Tue, 23 Oct 2018 01:50:15 +0000 Received: from BY2NAM03FT031.eop-NAM03.prod.protection.outlook.com (2a01:111:f400:7e4a::207) by CY4PR12CA0046.outlook.office365.com (2603:10b6:903:129::32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.1250.29 via Frontend Transport; Tue, 23 Oct 2018 01:50:15 +0000 Received-SPF: None (protection.outlook.com: amd.com does not designate permitted sender hosts) Received: from SATLEXCHOV01.amd.com (165.204.84.17) by BY2NAM03FT031.mail.protection.outlook.com (10.152.84.216) 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 01:50:14 +0000 Received: from zhoucm1.amd.com (10.34.1.3) by SATLEXCHOV01.amd.com (10.181.40.71) with Microsoft SMTP Server id 14.3.389.1; Mon, 22 Oct 2018 20:50:14 -0500 From: Chunming Zhou To: Subject: [PATCH] drm: fix deadlock of syncobj v4 Date: Tue, 23 Oct 2018 09:50:08 +0800 Message-ID: <20181023015008.6511-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)(376002)(346002)(396003)(39860400002)(136003)(2980300002)(428003)(199004)(189003)(97736004)(8676002)(5660300001)(105586002)(6916009)(4326008)(104016004)(8936002)(2906002)(1076002)(126002)(36756003)(2616005)(426003)(486006)(86362001)(336012)(23676004)(476003)(1857600001)(186003)(305945005)(5820100001)(14444005)(26005)(77096007)(7696005)(54906003)(2351001)(53416004)(47776003)(478600001)(66574009)(50226002)(50466002)(6666004)(356004)(68736007)(2870700001)(316002)(106466001)(81166006)(72206003)(81156014)(53936002); DIR:OUT; SFP:1101; SCL:1; SRVR:SN1PR12MB0750; H:SATLEXCHOV01.amd.com; FPR:; SPF:None; LANG:en; PTR:InfoDomainNonexistent; A:1; MX:1; X-Microsoft-Exchange-Diagnostics: 1; BY2NAM03FT031; 1:zwWThvW26yIBkS8Yf91W4sUFJWcYoAOEuM6GqQruHEcf7+vVNLMvm2zOFCEPBYQ1QyPI2Ecwijoh74pq3Fgpqogi4dsMdgSaeRrJDpzr7KYVjakcnybdibzebJw6JKHF X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 119097c0-a855-415a-a864-08d63889e089 X-Microsoft-Antispam: BCL:0; PCL:0; RULEID:(7020095)(4652040)(8989299)(5600074)(711020)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(2017052603328)(7153060); SRVR:SN1PR12MB0750; X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0750; 3:BgrhznPK1+NfuwAIC23jcFS83ez2eNL8OxjK+6+EOYFrEPRdHtSO5URSCsk221wjQzoQrduqe/psAZe8hXiZBL4RAcZIDTRIZEMbaZB+MVLIPRQJpwjYItwSkktNaIoLxfri0RGelfREFJ77YhOinE6lVURPauMy9WSEFOhtkiNnQlCamBfZhYKCH8tty8G8AMrf90/N1rf60lBWLVJZtTrwPOnsqzd1NTV7iqTBPeApFREUatluGCubhZge7nUUu1WExjDHVV+DYJU5A230YTglZbujqIXHJa4ClFhUYB1nFo9ZN7cXYC7a+Q2tkd/slqFB1XKBTPAcnC/nWcUZ80AOAMavMLzfwwzBuOex2tI=; 25:95nyrIFOWwTfmfZDPkwsw5Mn1gKNqHql2oCVJjz/XPIpcS8ygQ/ZDguRZxafhIT7uqENXTrjFaiWFIRZbbLfVlpnRwUFT6AQ90EG1ZaMem/D0A+p6MqBKDe/1Wiin/KnkHT3T0SFJiOUl0tfpT3rJ9BbDrdZ5T5/4IFKbhuDTQlQKYf9exujVOnSYluKoM+DpmIKsjvYlf/h7Q3IQPaGfT1/Wv7D7tSGr3gcgSCamrTXIJjAhqMwZUVvzvTB72zDpLF6VAMYWDaFkljpG6yjcKj0uEQpspXUZt+OaLqMF+idWEXYiaVvlyM0Gc2/US4WRJMLBGmK/gC3SrNSKN/WSZkSj+09jMMfznB5qdLyMYw= X-MS-TrafficTypeDiagnostic: SN1PR12MB0750: X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0750; 31:U8Qp2oZj8l6xzAp/S9gclfo2HkJdnSlmGEFen1xhghSJe36XKW/k5mImevFto6o+0rDWtbcfTnfRTjZT5HSfuDbO/dKKg0l170w+lnyoVcuK4tIJhCUHZNNiqGOF+iCyMHQByxN1khKBLMQOen+/hZN+dcnTg06D361hwb2MRGdjrXTx0VmVLpGr8TGg9Y0jIMOjEWn+RH99dhVBJjVURT0URGpAB7sr1rfcZg1OkKQ=; 20:EvyWptGubaGkHdfXb3Jder8FGvrJmJ+0e4scEL6XiyqJ8txMwhFQdH2Yyhm/UhrZmu+jNNyPdSI+zGQnJbjvfmN9O/++Jj2uvehlPv0kc1QaaoUYoVo/MZIhZRPa1i2INtEFZrEJYSUJ7I9qddm4WKWEJ8iOp/R1XG/wQo++gSzxs8/8okLbFZC5c/sfuWTnIojbDuHQcA8y7qWgPv2o9mPxGo8g7df86zj6cxCKAzeZ78UfiTy+ZaylVB9mv/OQsi9Z4o2gHWx8gmPloyLoXW/po0w7EwbaNsvRSRFHGTVJScwmBR2tLXxIaJQRxuT18KwbPbWMHdDaE7ja28f/8hfyeX8WDz7Uo+qCPXggKQEpg7U5FGXmu1o24PhZnQyykRzwHwl9w4I5Mo1tWWyQ4Al3+H3+T/m/hQLMbg/qVuh+V2YWUx1+ohefvOpO3/FDS3YtjnU+wDYyDng/DesGP6ztRHkEzkyqck4NTevu+XYShIzUYtkTai0/Yk9l31Hm X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110)(788757137089); X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(93006095)(93003095)(3231355)(944501410)(52105095)(10201501046)(3002001)(6055026)(148016)(149066)(150057)(6041310)(20161123560045)(20161123564045)(20161123562045)(20161123558120)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(201708071742011)(7699051)(76991095); SRVR:SN1PR12MB0750; BCL:0; PCL:0; RULEID:; SRVR:SN1PR12MB0750; X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0750; 4:Thns41jS0UosYkPnRvTEsMmu562LN2jxIqTIFf1Sgp4UnjLrRqica73Doru762KTPYqyJPzJISqEEL75n0qIHo74jOaMlZq/t60RsjVryLpZiNB/fbdvGuc99adykn4MGM8E+tFqmFpbvytDORE+xeG3Gq+a2Ta/kryIPl+0j/k5MybMcvzA7CqeWek56oBftQfCv6ocj3A4fVyPoW59NTncOvf4wrxsdNO6SWpO7ShdrL4WcwS+HqTGklnIWMam4Ls86SdK+4Bb6TXraKHMZK5NWAxbAiZdShSBCF31hkCEZLzsIJCmb8F/Mcu0EWfy9xDluQzbqU79DoOvtzlhAQ== X-Forefront-PRVS: 0834BAF534 X-Microsoft-Exchange-Diagnostics: =?utf-8?q?1=3BSN1PR12MB0750=3B23=3AlhrEKuG?= =?utf-8?q?NKaB6FUNsitAyXUJz4wqvgnfhggmv21zlRFRpXNKQDCBn9HO6d1BGV4+QYoaQSxTs?= =?utf-8?q?LcBZg3VCNDJPGSrZGHZHkyBAmwIEdWCd+djNk+r7MtGKNIrZL6SGANbQyX/LqGjQR?= =?utf-8?q?BBQ+cra4vENtBvm81heM5QA/57kDzNfMMpNa7PJFdIJMYq2LDIpeuJuyZLXG33wcZ?= =?utf-8?q?BA948viga+AYSmMvD09glVW8YDpo7ueSvOKQYz26gGo5CHP3FoMVrRJ++uEZWRcBh?= =?utf-8?q?IZUbdSvjW26/cY6GQTM3MuCN2ZcOZWuDqNtMXbTLe3ItGV9n0PaTyaGBhxhQuGo1m?= =?utf-8?q?Khb5B6knUHkJSnE8pHwbWpdH4wEscaxZDBAsnGLmaxTYuRcfUgloNq7/Hek8WwosP?= =?utf-8?q?w1nt8EW3Wcu1q7X2d5GLUQF11tHQhRCd9heBCzgvkbJYHIGWHZ+AS6Fd9SRWXQamf?= =?utf-8?q?Uu4IyLIWNkBXkFJrvapEV6S3nbfKHjNRJpxcq6hvVGV9XZRmbEg0lWhgT8ttjI3BF?= =?utf-8?q?Eav4pEtM3jF/zfjJvxbYQ+2kU2VC4C9riS//ZEr3PvUf9wlk5cpTdJ1LOrBM1/0JR?= =?utf-8?q?sh0G2bnhyZWidArX21OG9YXv2mVb4CciOn2dQV7UBPGgD1CoWxb+C+YRLFEUOtr2z?= =?utf-8?q?97YEpK3Hozk5EyfJPlzWxhIw+/89k4vPA9L9riLJEl203K1V7dcdYzpiwAl2Iw8n0?= =?utf-8?q?Vpee2jZFQMbOHPQXrJO/8WFugRSAJWXRSndIPf36Vaq9p6xfA6Ox+dfmCs4J30rh1?= =?utf-8?q?/PpDQ5BYZvdbbb0cjHNWEwWcWCqR7+4tLoDFoWMTVxpb6dRRfB797l7WwD6Xel1SU?= =?utf-8?q?JX5GgaOoEkWUXie0a4YII48SdMLvX+PJkgzeNviOZYxQ9qv+q1Zbc6cQ8zCEc+/ZK?= =?utf-8?q?NcdR8/vOgH7JaOuztiraX1cWNn0+8fG4dClFCbtccqC2Zw5dQsSQCZGKyabGQPgNz?= =?utf-8?q?EH+4ZzGv4GNWL2uSm4Ms0ENY2EXyhIMA1R/Y/qCFc2pIiUCJt2cMg4YhfbmtR/Zzo?= =?utf-8?q?7qGpwKHSJSyCDKF5vVsJVZIHKooUPC4HFYVydHXByBpyU2Qc00K6onuqWDyD8Lpcd?= =?utf-8?q?TZ+FsuQjNgEl2M96AGdgZZNMK71xbtu5Z9XcdYILNhMk/w4lNdAuh/yc3frmNAOfP?= =?utf-8?q?61vn9c9f9k66tUbScp3BYHZWO5vthhZMOKyvM4T?= X-Microsoft-Antispam-Message-Info: je6q1xBiw6ZI2w4ajRXP/YCcr1NMmPDTXD8ubJVmVs5ulGYZ9vboUnmK4a9iSoAytzo51M5tgg5cu0OuSgjU9rSxjMqyC6nENcTlNFbuGxcxvo6XQBh5fduBEOHGIrocLqxOJavTS1XZf5Ppk0HBwhMvg+2uILoRve/wOEF0TXDs+JyHvldHaB+r/ujYcwuDSJkOqSsJjmtBMprKfLBBVCfhbcbmNi3rbvVVDcM7QVsIvKd+P4SgvpdOBQ38xA/1MNN4Ty4aew2UtZVbdt6VqZWFslJm1baj86wy9uk4DGAEGVcmYiC4dEWrYP+tVw1QpU7OyBsTfHLJjQJ6fdkQOM8U+HAe74miz/OovMDT8bo= X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0750; 6:P/X3mO4IruZZPkLe8AkVaPn29sE/CGqc7qZXm/atM0CxqeSid9Hnyt0TZinaD+tneVO5FT7GbTRAAn55Ng5KK/3n8E+xVX9X2agv2UsNWeiZLRFWZEEjql5o7mz4jV142I7ckDKEYFI9HKGeJYINaYfPUne/c8wkAzBdW7NHGclpTTkVRD6F7/yDZU7FMSyMHPyAwyeVXeZvpJEqbmVsEXjcN0hyPSZp9Yj2X1WRT2jj8yHOVKwpvQ/b8nZOYVfu20lXjR6uUGluIw0GcBKNQPdEgV2tnV40Cf2TlMd/YC2pnbEoMa92tuo6N2BqoWxH67dQ17fowe1r/b0imfFV2eOTPOxHoouJA8inDSUsrxPBbtMcuc6ciw6HTxbZ0XVYdHUcXcqU4ZeKT48UASZbG0Swu1csuBdQ7xj0f5ekJPWrno0OHWHnWX1hMuvhvwApDW+sNFbO8ABiALYzZSojpg==; 5:oPLxOOe+KoyKsG+fA+hGjswtsbQAio+jOnx1rgW4n7RfCe2uEi/HGuL3ly7lAyGb2jmbn2WzRnn+1pAPcNg6pSP0gL+tL1tdElSXPtLaEDL0TXuDgkzWppIuxYedVBAkOIsbguH7wnLMaqPk9xeAI5hDIB9Xq4oBLlSlErkvUsE=; 7:QBrM+ztutLAJNoado5y+bjAwBBXGT/BkrpUkwimV8uZMHHWvOB/0Kxi3YcwnBti+Qe7hplJmAR5Wqxw6CwdIo58OyUg//Sw6JcOmnHFiWn5uWIpK9H7DYotekTvVtJnPZ7hoeiDht4OAiQ+8QG9GRhMjN4m10oUvqEAyVQjINRhsL3C8heF9VqvAyGy+op4MdLhlFlYXKfDq9L8jN9/FkwCWRGCU/doszmRgBMcIySgF93WWb4T5rwkgplIdKX+P SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0750; 20:8EFoSjRi7evfgycU1xTvC4u225AID/Zwg3aIAY3G7clS96+zIEA+b0obcYJGMU44cWGOa8Oc7Zk5PZjpq3VMhZ33SIHU8ccQccSxeZXd6xBcJB6btInC4OeWb7gXKFXWa65hMf8SChnuXwshPAuq8lRJLzwl2Pbv8pQVoDUtsoY/vJlRYDeIDSHS+UddDFLJiVsC294epaIvExPwNstWvLyU9tzLt8EoG7ZgC5v4yCPwLo/Ihs0eyZqJ/DAiBM0Y X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Oct 2018 01:50:14.6421 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 119097c0-a855-415a-a864-08d63889e089 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=[SATLEXCHOV01.amd.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN1PR12MB0750 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: =?utf-8?q?Christian_K=C3=B6nig?= Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" 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) Tested by syncobj_basic and syncobj_wait of igt. Signed-off-by: Chunming Zhou Cc: Daniel Vetter Cc: Chris Wilson Cc: Christian König Reviewed-by: Chris Wilson --- drivers/gpu/drm/drm_syncobj.c | 51 ++++++++++++++++++----------------- include/drm/drm_syncobj.h | 8 ++++-- 2 files changed, 33 insertions(+), 26 deletions(-) diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c index 57bf6006394d..315f08132f6d 100644 --- a/drivers/gpu/drm/drm_syncobj.c +++ b/drivers/gpu/drm/drm_syncobj.c @@ -125,23 +125,24 @@ 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) 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 +151,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 +250,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 +267,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 +295,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 +316,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 +345,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 +388,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 +502,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. */