Received: by 2002:a5b:505:0:0:0:0:0 with SMTP id o5csp3396305ybp; Sun, 6 Oct 2019 11:01:37 -0700 (PDT) X-Google-Smtp-Source: APXvYqyVraqilaaetKMd7LWZkdCw7d8QXM5K8brExHZBoWgOHBGc5yvXrWJnkTXdgJPzWyGP6F9h X-Received: by 2002:a17:906:fc02:: with SMTP id ov2mr20571604ejb.273.1570384897366; Sun, 06 Oct 2019 11:01:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1570384897; cv=none; d=google.com; s=arc-20160816; b=bQ739odxDkOcoaVLmGOc465YB8C/6qf8xyKajfCc2cCO6GV2aa/JXJfGkFbI6BZvbF eUhcDVKsYCK1jnqzPDBPzKTo4rbPHZd/5sWyouDadvHIuygzwgBiEnj4/8EGI4ffh6X+ HcTCR9d4/jpsK8ZbiaVVATta25RhadPl9WpDGQB3HHWD4hY5exYT3YeSahld8r2B+zcC iImuq6oiDoNMH6XbP6GRxsD1hYMztUy8Zfv2JbKNMcqCnecGNNwp0Fkib4gLPsyjpkea MySIFsOveB8nLjFY+3U6NNKoW+QceSTtUbGb5QWwRh0V2Fc1nJw8KbKKHBtdbPCB0zlk /tTA== 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=W2YGGKNCmzZEOHN0qldLMUa4Or7Oy7vLn3V6p6D/yjo=; b=F6WSoIvRs8Lc1+gT43liBmXCOeh/YQssLYdSlwXzIJ7B5PyWIPXEiwmLmCmzBE6/ba /+9tdr/SeHE3Z//vee9CKLcy/9nRMG3gR2ylt4PHAF/uV9q3JKoEUv+eiR9Ztt4C4frQ BbMXl3GURzlcypFeAhnqWtiwu0mpxgvGSV8c+SwMVVpYLGPDt6FZds0h922fwp06nKAS Zy4jHnhOlYGfc6mArmwo0QAE/0Qsp1sojt8qE39xe1luwiVXX5QTFZ8mGLgORhcTl6nf wP/ETaKSS1cgKRW+aLpJz5NAl2serX9g/zWwLSAKSOqj8DjDEtBrMEX6Dwy6ufk8cYfj amQQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=D9TSdNp+; 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 f19si7745863edb.385.2019.10.06.11.01.13; Sun, 06 Oct 2019 11:01:37 -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=D9TSdNp+; 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 S1729170AbfJFR35 (ORCPT + 99 others); Sun, 6 Oct 2019 13:29:57 -0400 Received: from mail.kernel.org ([198.145.29.99]:55610 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729056AbfJFR3u (ORCPT ); Sun, 6 Oct 2019 13:29:50 -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 EBAC92080F; Sun, 6 Oct 2019 17:29:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1570382989; bh=xd9FKbZCNcSShJBGOLUkhgzrMnFgc/j0qXHYi6FfljA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=D9TSdNp+VdDSA7qne2l80GgW+4cpfOAkAf9IHZcFdVFOLLqhwifKopILflvSlF1dE WyVy3I9hoFcbfTyAy5kNmpsFmcSUGeKxCnr4kPhdxHFdRFBR/OLoUqLMwUK6ZfFJtN h8R3WralV4LBL31KPgPeEiOe9yhQ4/ITbrEUhbPY= 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.19 046/106] dma-buf/sw_sync: Synchronize signal vs syncpt free Date: Sun, 6 Oct 2019 19:20:52 +0200 Message-Id: <20191006171143.424340388@linuxfoundation.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191006171124.641144086@linuxfoundation.org> References: <20191006171124.641144086@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 53c1d6d36a642..81ba4eb348909 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); @@ -274,7 +271,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