Received: by 2002:a5b:505:0:0:0:0:0 with SMTP id o5csp3398871ybp; Sun, 6 Oct 2019 11:04:14 -0700 (PDT) X-Google-Smtp-Source: APXvYqz5j32fUexkd0u/qYapNgJ7WSS5Dsg6OOLGbIpaBRocl96/AmJ8Ja+lGr46midfPDX1SBAO X-Received: by 2002:a50:aa8e:: with SMTP id q14mr25762123edc.155.1570385053969; Sun, 06 Oct 2019 11:04:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1570385053; cv=none; d=google.com; s=arc-20160816; b=bUGGFSR5odUXiyIFG+9K8UbwQFnt/yggHA4P2tnM7BtkoRGt7r86nUh78Wq3jjzWVy 7X/KIF/WJ6KR7cGbDZ7cFmIBsgseg6sDDc9MydgD4CV+yEwWOhFbCbxhRSRwqyCdLFaK X1j5ShqGuIBNgTyK21fEpn42MXr51wUSUmWBTdqxLABTJOv+yiZlfdWCUD45hJjGpYu6 i4/tRjH0CpvJj6lOlkUznatYQ1YkQ0PBUqtT5VqttMPVtMyy2IkzqEu5x5pBT7BDl/t6 uAOJRJrBMicviHHKZv7q7P2FxnbT5bcGuJvohR6dcSqNl7pmgv5hhfhqW7tnd4Xn40YY FD8g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=+m132GpnmwDotxGoiboIO0IqIKB/y8UKD/j5nkUsoEg=; b=H2UCTKJtaFUS3xnZUUHtyNWRArpbPNqWEgig2Aa+3+BOxJGcNPOcoVduHRrT+qemEN IO1/c4LJfs+yqWm9GK4c+QdUsXZE9ntPpcPMYxGDdPi3qO33NpfYbzI1cyJIGraTDm1N K7OGpjtYQPsRMFcPYnxna7XFCAeMxIypOHxFKR8vWN1S6eibuVKGTQeQlohOe7p5O+bt 4eWxGPjCsTuBN5J3r7kHGDyRzndnOPJG7LqHr0YkxUCkHZvaubdGBKDuEx6P488gBt4b gQ3twPzqQ6sXBSyqDiIEAnn7V5QMEQPx5BWFjaRvaoEyy9oiMwr424K029nln97FUcYR hCNQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=IOdJXIi+; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id gh16si6401826ejb.150.2019.10.06.11.03.50; Sun, 06 Oct 2019 11:04:13 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=IOdJXIi+; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728609AbfJFSC2 (ORCPT + 99 others); Sun, 6 Oct 2019 14:02:28 -0400 Received: from mail.kernel.org ([198.145.29.99]:50940 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728145AbfJFRZ5 (ORCPT ); Sun, 6 Oct 2019 13:25:57 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 78DD82070B; Sun, 6 Oct 2019 17:25:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1570382757; bh=amDmrhtd7S+OYG+hIT3jMeWRCF3PInftd+EiIusg/Hk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=IOdJXIi+KveRBwRLvKb0skfybm6F04fypK6dsZDWxUMJK8EK48WiztHvc4nAz3G8x uaRovaGQ8idNI1pO8dQ2BkhJ9ZlmzmXBhCxPG+Yt62+zt4SxzaR2KJjm4X5IZAEk4S LLLlIk0LddKI6Yim+sTzkczbRMNeogRCm79XExZM= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Chris Wilson , Sumit Semwal , Sean Paul , Gustavo Padovan , =?UTF-8?q?Christian=20K=C3=B6nig?= , Sasha Levin Subject: [PATCH 4.14 28/68] dma-buf/sw_sync: Synchronize signal vs syncpt free Date: Sun, 6 Oct 2019 19:21:04 +0200 Message-Id: <20191006171120.827270506@linuxfoundation.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191006171108.150129403@linuxfoundation.org> References: <20191006171108.150129403@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Chris Wilson [ Upstream commit d3c6dd1fb30d3853c2012549affe75c930f4a2f9 ] During release of the syncpt, we remove it from the list of syncpt and the tree, but only if it is not already been removed. However, during signaling, we first remove the syncpt from the list. So, if we concurrently free and signal the syncpt, the free may decide that it is not part of the tree and immediately free itself -- meanwhile the signaler goes on to use the now freed datastructure. In particular, we get struck by commit 0e2f733addbf ("dma-buf: make dma_fence structure a bit smaller v2") as the cb_list is immediately clobbered by the kfree_rcu. v2: Avoid calling into timeline_fence_release() from under the spinlock Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=111381 Fixes: d3862e44daa7 ("dma-buf/sw-sync: Fix locking around sync_timeline lists") Signed-off-by: Chris Wilson Cc: Sumit Semwal Cc: Sean Paul Cc: Gustavo Padovan Cc: Christian König Cc: # v4.14+ Acked-by: Christian König Link: https://patchwork.freedesktop.org/patch/msgid/20190812154247.20508-1-chris@chris-wilson.co.uk Signed-off-by: Sasha Levin --- drivers/dma-buf/sw_sync.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/drivers/dma-buf/sw_sync.c b/drivers/dma-buf/sw_sync.c index 24f83f9eeaedc..114b36674af42 100644 --- a/drivers/dma-buf/sw_sync.c +++ b/drivers/dma-buf/sw_sync.c @@ -141,17 +141,14 @@ static void timeline_fence_release(struct dma_fence *fence) { struct sync_pt *pt = dma_fence_to_sync_pt(fence); struct sync_timeline *parent = dma_fence_parent(fence); + unsigned long flags; + spin_lock_irqsave(fence->lock, flags); if (!list_empty(&pt->link)) { - unsigned long flags; - - spin_lock_irqsave(fence->lock, flags); - if (!list_empty(&pt->link)) { - list_del(&pt->link); - rb_erase(&pt->node, &parent->pt_tree); - } - spin_unlock_irqrestore(fence->lock, flags); + list_del(&pt->link); + rb_erase(&pt->node, &parent->pt_tree); } + spin_unlock_irqrestore(fence->lock, flags); sync_timeline_put(parent); dma_fence_free(fence); @@ -275,7 +272,8 @@ static struct sync_pt *sync_pt_create(struct sync_timeline *obj, p = &parent->rb_left; } else { if (dma_fence_get_rcu(&other->base)) { - dma_fence_put(&pt->base); + sync_timeline_put(obj); + kfree(pt); pt = other; goto unlock; } -- 2.20.1