From patchwork Mon Oct 22 09:08:59 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Chunming Zhou X-Patchwork-Id: 10651865 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 0E39E1508 for ; Mon, 22 Oct 2018 09:09:14 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 008D528899 for ; Mon, 22 Oct 2018 09:09:14 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E7B6C2889C; Mon, 22 Oct 2018 09:09:13 +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 54A9D28899 for ; Mon, 22 Oct 2018 09:09:13 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 1CD2889C03; Mon, 22 Oct 2018 09:09:11 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from NAM03-BY2-obe.outbound.protection.outlook.com (mail-by2nam03on0064.outbound.protection.outlook.com [104.47.42.64]) by gabe.freedesktop.org (Postfix) with ESMTPS id 7941589C03 for ; Mon, 22 Oct 2018 09:09:09 +0000 (UTC) Received: from BN4PR12CA0010.namprd12.prod.outlook.com (2603:10b6:403:2::20) by BLUPR12MB0611.namprd12.prod.outlook.com (2a01:111:e400:594e::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1250.29; Mon, 22 Oct 2018 09:09:07 +0000 Received: from DM3NAM03FT047.eop-NAM03.prod.protection.outlook.com (2a01:111:f400:7e49::201) by BN4PR12CA0010.outlook.office365.com (2603:10b6:403:2::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.1250.22 via Frontend Transport; Mon, 22 Oct 2018 09:09:07 +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 DM3NAM03FT047.mail.protection.outlook.com (10.152.83.124) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.1273.13 via Frontend Transport; Mon, 22 Oct 2018 09:09:07 +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; Mon, 22 Oct 2018 04:09:05 -0500 From: Chunming Zhou To: Subject: [PATCH] drm: fix deadlock of syncobj v3 Date: Mon, 22 Oct 2018 17:08:59 +0800 Message-ID: <20181022090859.27427-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)(39860400002)(396003)(136003)(2980300002)(428003)(199004)(189003)(66574009)(72206003)(81156014)(97736004)(8676002)(316002)(36756003)(305945005)(47776003)(81166006)(50226002)(2906002)(478600001)(105586002)(126002)(186003)(486006)(77096007)(1857600001)(53416004)(2616005)(54906003)(2351001)(426003)(14444005)(106466001)(476003)(26005)(53936002)(336012)(356004)(6666004)(50466002)(8936002)(5660300001)(86362001)(1076002)(4326008)(5820100001)(104016004)(7696005)(23676004)(2870700001)(68736007)(6916009); DIR:OUT; SFP:1101; SCL:1; SRVR:BLUPR12MB0611; H:SATLEXCHOV02.amd.com; FPR:; SPF:None; LANG:en; PTR:InfoDomainNonexistent; A:1; MX:1; X-Microsoft-Exchange-Diagnostics: 1; DM3NAM03FT047; 1:cTHgDLKMz611VRj5A9QDK+APLsi6NvCX3GCrwvAIU9j/g9kYNUq6Z8RI4MZCW9HIYvjG/5Yd7VA2JVBhDWzBmSLQfDtn0pixaTpPUPasO1dLTqvxtZeCmxSX4d3ybHsS X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: b9735213-266d-47b0-3ebb-08d637fe0579 X-Microsoft-Antispam: BCL:0; PCL:0; RULEID:(7020095)(4652040)(8989299)(5600074)(711020)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(2017052603328)(7153060); SRVR:BLUPR12MB0611; X-Microsoft-Exchange-Diagnostics: 1; BLUPR12MB0611; 3:/JVlwYN97QCR2f+r5Vkm05a3k4CzIFxWffkouJLGmZ8wYjKn8vPpBU0IXV5FqtTd5MchiG8RihYBEZo+bJlYmXgh24bYagaUEbQH8nwulZmm9vr5szq3ZfMC+JNdxwKM6SPneRVeMWIRCRpxmW1D0rjn5WwFdv00Kmv9YToYXRd3MyrRfzj/67hTCTOnDni0do4+jbqftg5KHlb2bNB3dNpe2ImdgZTHy0fEPW9LLuE7amdaWwzxWD72nAYJXvxapldnMDTlXC3LTeku1Br0YtP/qjLU4uMl8Io3FiAf9h36sdQBcHOAARMYmubPt1XuTU76TOTwxgEggPM9xgP9qGRghSK8cNVbV60mcdw+kW0=; 25:he9xiuYc7DOvSlzw/CJbZko0IAX0tOc5QmliAfliVxpeTqDVIg94qUu+HM/KmFWt2tH66e4wuB2VyGhhX9a3/ULsOyqUIk5LXe9RIp/a9NgpvJ0JiC6PTYEnyh7EUmTL6waIT24+uMn9B3BBkKpa1UNJgjB9BICih+myySpfIsKs1oXoXhQ7E5cfJD9oTNK9E8Cz6YvhSwioptUAXYBOHf5CcGWSA0qtA5iA2NFbsR6+/OUUxz3eRxhQY++waCgbowhtvhmf/+ng2Rbf2C/1rO5+srr0hA0hsevkQQMdoFV+fexBOoLjTMLtKeavw4aVigVsyqFHhnqrZyoWuCdO6A== X-MS-TrafficTypeDiagnostic: BLUPR12MB0611: X-Microsoft-Exchange-Diagnostics: 1; BLUPR12MB0611; 31:2JuPAjbQE7UjdXMbzxM0VOhHvTPLQNk08r7CmD0uRVTM72oWdMVkdsBoY4JzjxSc8Z4rwEMgDinaTD9MWnskoOojKad7AFSoLxGNFH2sTLdRfeS4lcVcJ437UmQHEE4HFL7NinloRigzvosqOttyBYWVSc714+x5LJXJTKNS/crXCIwkR2l62IKnzG0P1ckIym0xMfj7Yh8eCB8QFtWPNUOkP4G2BLRx3lx0+018SSg=; 20:nHTTs2DNNyByACUt3vK9u9eAuJiwzXgt477wRNQeCmv5+t3E3pgrCfH/MOTiIzMTGTfeH40Avs61rpTRWnH5sypt1sG0n+6W39v8SDxF1sdUpxYQ0nqPGmRJ57bydxlql2sS7fyiBxeK/phi3PZ+LqBdkGcWRAYXzumsc63ypSw+L0/fF8R5eQafHVIL76xuJBZQpYRjDZCvsTZiu1zY70tslE3ALTlK4B17Zs8kEUrIuEnQIkN6oAgknFVYA12VHvrOnCZGfSBj8ZES4neOKKHDz4Et2SNwRtnQnupbR7amuxsgL/5tOXnAH2F5ivHn2vxxcWfMnAj5T/5Dlc1gsnOTQFTWs+qB8z61X+E2LY4vHGNGBKHhHxkcEYbgcbP9rvCz3F6kl26OFRSC7omzEuwupot0SaR2bN79DhhtncGfVHBGpXBOz+BJOdw/hOy/Nm2okdC5/fQfTaRFeNmdEqD2+/Qo/BxvoCAzwbaUfV8DD6NugEX6DDjLgQybYpi8 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)(10201501046)(3231355)(944501410)(52105095)(93006095)(93003095)(3002001)(6055026)(148016)(149066)(150057)(6041310)(20161123564045)(20161123562045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123560045)(201708071742011)(7699051)(76991095); SRVR:BLUPR12MB0611; BCL:0; PCL:0; RULEID:; SRVR:BLUPR12MB0611; X-Microsoft-Exchange-Diagnostics: 1; BLUPR12MB0611; 4:FiHBt2pnw/89kurniMZqBts65LmMr4hXzQ3EJBFu0wOTpxcm9phKyw/BQgHhXP8f3wCesckVETWpYyakY0kEOefY9PYU2GENvdZh5TC7oxUjG6+YRelXBH35lubKB81Em5VLmNcaU75GUValKVhhZeRouWymKoFIxzBzj593SgZWBXMy0rMLM9MBfFiDo4aV9hJpnIEM+fU0vaFe1y1y4nvgBwaGkea2IqKauYun+Jj/eDYHn3BAUqAVHZx4zVMxa/MUhvxb3dQy26a+y5q6MWezjBUF3jozhreNLImt5j2z2YHN/gnezu2Ka0FnwvOxexvhOu8SOY2vs4reQvVpRw== X-Forefront-PRVS: 08331F819E X-Microsoft-Exchange-Diagnostics: =?utf-8?q?1=3BBLUPR12MB0611=3B23=3AqD5KKux?= =?utf-8?q?zR2qczZyQkhzem9Sgri1d+zfJX2k0H9sWvYj17Ueb/9qM0km+caLgRjEHQhNmH3xY?= =?utf-8?q?sXKGCDlG++Q2QoG26O4TpkqT8o07+l+9U8KwdxLOyuhxwvyIjdVBr9yJ3qhAzRcEt?= =?utf-8?q?qwdqEkZ7iY1Zm0mTFV/gDp6eSfUQvrH/E3bHz0T2JBtYTvtvwCcx7eBBVQQmK4jU/?= =?utf-8?q?TZ6tgZtZxOrMZ/GvmUawnr9OELqxGgJ7Ed5LpDi/ZUlk2ZESPI3DvL0jmftVGnKsS?= =?utf-8?q?fNohGxfESIFImFC7GDoXAZl82InxZzsqqQENPMsGIpa3Mu9KhMisURVUeSfE2acyQ?= =?utf-8?q?oM6MS9I02KlN0R7EyGrM7MGIrZOMKGIWDXzdsyLJSX6FisKuYLV+QwUzLfgS5NzKk?= =?utf-8?q?LYHE/fmWbb204HVyX4VEkVV2iRB0y0bNwephc8PoYSF4ktk8EYG6iShlDe9xTFmSi?= =?utf-8?q?sK99A6siqIPPv0n98eAg353V2taDywPRt9UIHiM9gT2vgZLoIkkOe2+fvrv6iYdOm?= =?utf-8?q?zDR7yCxW0vKtUittzAYYz7GVaCbbcCuvX40kLYiUI+45NVVNatXBjJ8i4HnsH15w0?= =?utf-8?q?LtvGbwN4sM63Q5YNYYC8grGdrL1T46ykqeYbk3ZkxxzqRmpbM5rVVr5/ssCoYwWez?= =?utf-8?q?VNkSlyk5hYmoVvFxUFPm7ENFGpPKQLPjdhwrM4AkmgSQM2CUIAenUdp/RI6MmUJDe?= =?utf-8?q?6FO5X7tNHCw722PTAACIglvURGxg5KWoXkstJzBiiU9qlHEVTqa6/u8V08/VK6ZKE?= =?utf-8?q?K6oG0rkGzkI9bsRJlRYBe3ePl7L8n3S6mwjbM/z5u90ovgIsLwMt07L2jfEwxR3Fq?= =?utf-8?q?G3/gkFvb2+jrN5dcdrov/MKjaK6adlBc43gHTupJxieo57z448MWuwv06Y9WrHy+q?= =?utf-8?q?8HKOUvIs4VlZw7F/fdpbVD5WrushRU0C/3gtO9oFahdSGGhrWPtvtaHwaprWtng3r?= =?utf-8?q?GYoGuJMO1LC+oq1Bl7WdJ4KJ7BhTyVnplit7eYE1yeKpzDu7Z08dq9tkRFRgkP9Ig?= =?utf-8?q?3cNbDNtxf6f9xPC2JXiE2nsjRIqy3owE/TlALxkpDLIxLFfUYRVYd/PTXZOE8Ylox?= =?utf-8?q?WEwpwL7JfCd7rP/YiMFNa8ZOyvUEYCvQ+1feeeN0uwBt52st+9+9xH7PxynBjLhC4?= =?utf-8?q?vzAwp33Q2ltodP5f20LH5NZfP9SI2J1q3hJ4nQz?= X-Microsoft-Antispam-Message-Info: GeiqUlW4VOfdlJSD+Pg4tSGQULauVzJUGSF5GeRBjOvmj59AHgtLjKySQkD2i8GRMrn8a26yd96Wi/C4OwDQ0O1dz15FAvpAbtfAhxIqPV3quB2a3/p386e0/qzHG4qO24hR9sbAHp4iZF2U6DHDt4R9B2Twwacwbyrbd/KJlCFcsw2WOmJe21R6xRPTDH0sx8gZcASRce9legHB6J2mdJymHkOlTFTEo15kgGX/vkmprVmZUPAT9mQBimveB9VIGRHXrDMYOPmFNSWPPY4nTCDrI+jnli1Hibwx+U7BTbM3mqyaiVdiFst0I7MC4UxGbvheg4Dq8OniSLfk+03kKSj8hHsNrrt1JjE7nflVjeI= X-Microsoft-Exchange-Diagnostics: 1; BLUPR12MB0611; 6:/OawBBftuprds/g+23XtLfJCgiRv33hZhXMS2wIuhO6jLvyYyU3G+7muKCJdVRT56HS1q84HgJvCBf3BldloerbSKGjjGGi8e8HNo/BawXbLPqOcd1/CIRnWCy0Pycx9anYBYq46QT2L1hlIy6AZt0qbCt/xw8doVzEki0Z0C8ds4TT1eDKXhX7+3v4DS226QIT86ztVFj0/WiNkgdSw7FXB87250hoFWSc13vplWE6T/AO4pZkZKHrKvYcRIwJcrlWaX2a1PTSK67bas9yYOkxiZ5sVpYADKIan2rksF1yFI/YujaUZGgvwAchDo0sPafHD3XoegnwIUASbCr8FPKTa5VKMMRJ7kfn2orLsVaqK5wJ1ekbvZZfBf8hxE5qidfUm2U38JypH7NVB0CxW+2VMG85R+QqPI8SQLEwUzV+Hyb7UVyNXJ9w5cZ1LWMijBYP0ZHedlDz6w2E9uBleNg==; 5:LwLNRorAlsVmaHRhTRptr50ftMTZB8us3eyjFgEVy2Lx0SSSL32Ts0M1MGrDWYB15bNELuPFEES9G2nnjlUmeCpCKFiGaTntvi1h7gvqViWOXhQP6L8fu7EKulMG6BekqCLNGcpiNsuELB2gOQEQ6TW7byLN28kVBuFzNkqWXaM=; 7:xbXCb/DvzHMGdvLfOc3mck2xYLPWLmNn/T+qCR8XsN9bAHRMMCS1CY4vv9XeTIq7/0q8kMGKqc0jZ6dsNkaQX/jRjczLEjjk4kaVCuYgGTuOrlw1/XQvHIzAsBUDd2XUL8Jyszj3GVvOpWF/7CqpSP+BxAZ/RM7K4dMLAgsJ72zu111bZKKg3/ILtg4bU1td9vl42acdKVnc0wmTnEMn5sr1qE6yBrNl7pCPV5S1a5swvZKIQkjxtGXxVOoIS5uJ SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; BLUPR12MB0611; 20:ATUeJHYr4hQHiW1xMZNGr7GuJe27dwAagVGESlD/L38cln8RBGtnnTVlKLAhemNYedilMxaQABjpSXKxC9KFWjG8KCAs1xPawbQO9zjHCsvY3KL1w1LCl03iPy775iGTFmJJ3kWxf8Vn/lEzx8vCC0aaBOVIUHDyOoD0IBOReghVt/K+donWFBf/M/SG2YlREa6ToGYJ6nMjs575ly7xenh72MFt8nW64IAnxRaujhwHNJP12p/uGKmNq70Si/h7 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Oct 2018 09:09:07.0837 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: b9735213-266d-47b0-3ebb-08d637fe0579 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: BLUPR12MB0611 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) Signed-off-by: Chunming Zhou Cc: Daniel Vetter Cc: Chris Wilson Cc: Christian König --- 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..827d2ea5bb79 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); + spin_lock(&syncobj->pt_lock); /* 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. */ 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; + mutex_lock(&syncobj->cb_mutex); drm_syncobj_add_callback_locked(syncobj, cb, func); + mutex_unlock(&syncobj->cb_mutex); ret = 0; } - spin_unlock(&syncobj->lock); 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..30197ad7a575 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: mutex between syncobj cb execution and free. + */ + struct mutex cb_mutex; /** * @file: A file backing for this syncobj. */