Received: by 2002:a25:ab43:0:0:0:0:0 with SMTP id u61csp273555ybi; Wed, 29 May 2019 21:08:34 -0700 (PDT) X-Google-Smtp-Source: APXvYqwJWDhhaPb13ygek1j5I8+KbBj6VabBLPNZtOzagQ7XiOLP6HO4OU9y3zb3kD1lw3evr0ML X-Received: by 2002:a17:902:8ec3:: with SMTP id x3mr1777607plo.340.1559189314401; Wed, 29 May 2019 21:08:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1559189314; cv=none; d=google.com; s=arc-20160816; b=Sl6Mf1crXXl0671CwsqlK+NrKS8xESJcP2B6SHJdvhdv/C/Tl9WNPvG9N/QGzLVrUz bPC2Nxfg7MzyaXaW0mOWCAf9bi7qp/+aN8h2ke5Jp39EM/EJ7hFk80rN0qke6TVeb1LM J/ikzhedxZTIkVNjbE/luhWRQdet0nUhPREQmCZyQvOB6jso98SVU5icCHHHyiH3OLfe dNXEaboqYveLpj/3vu3kD2l635YL+0af6HrUhAjHIir6NQDHvJLJSfLVxFpGE9GRivqs 6cQTxww/2jyIgInw33VAfar3wR1wEuGHddefLhx3aoSIf5AJxsjqBQCZ6Pm21y0rkMJo tUZw== 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=5r7MUS5/Ha2nzT51YXnO+VyV8HjtIid12Y1viySXO4w=; b=pjSpzDEvv20eBQ6pcSqk0U7h2fFoJg1p+fxzX94I/GgfK0DlwGQwihthRr2uo4No7c JAtHzCfdttp8/U3Y99nfAG5qcZk7KICAfjHk6OO80ZxT6cknu2fvO9iqimGGf0XH3oxR DgXR5s/tKIFVIOexFstcY9S4zQ4JZh+uoZG+wPtLOi/8cwuWtgq5LOhDunvBuddwiLwl Sv/6Oe0eJQ44LtLCLb3VZaEvzd5EJ/5iHG/mUImqI269N0wJpnElRSprKymaM4YXIPff BDJ2jMczQwVbwxSag649RvHcxt8GRhYoHpZ2deQHfgjHc/BXr07XNXufZXwX0gjEln1w 0Miw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=gO3EX1Q1; 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 t1si1917972plr.74.2019.05.29.21.08.19; Wed, 29 May 2019 21:08:34 -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=gO3EX1Q1; 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 S1726280AbfE3EHP (ORCPT + 99 others); Thu, 30 May 2019 00:07:15 -0400 Received: from mail.kernel.org ([198.145.29.99]:47300 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731136AbfE3DRa (ORCPT ); Wed, 29 May 2019 23:17:30 -0400 Received: from localhost (ip67-88-213-2.z213-88-67.customer.algx.net [67.88.213.2]) (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 DCFD323B5C; Thu, 30 May 2019 03:17:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1559186249; bh=A61OVX+qhxljkiOkU0eMW39eESdk+BXN3QoFqUVRpco=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=gO3EX1Q1N7deQkUi1JSq5EED1ulNKwp7N5vOi32i3+gC7z3k+pOGOz9DE3iQ4QxSV JCFmvGCrFkSGHHehkQBTaVppv6DbJl7OKBryvxzOfbNyF03L/Og/d4HRwD9j7lxYwq mc3LWpzc9LRwjf6dGwdvj4f5zqv4qQCJ28xIM2Xk= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, =?UTF-8?q?Christian=20K=C3=B6nig?= , Chunming Zhou , Alex Deucher , Sasha Levin Subject: [PATCH 4.19 168/276] drm/amdgpu: fix old fence check in amdgpu_fence_emit Date: Wed, 29 May 2019 20:05:26 -0700 Message-Id: <20190530030535.911897710@linuxfoundation.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190530030523.133519668@linuxfoundation.org> References: <20190530030523.133519668@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 [ Upstream commit 3d2aca8c8620346abdba96c6300d2c0b90a1d0cc ] We don't hold a reference to the old fence, so it can go away any time we are waiting for it to signal. Signed-off-by: Christian König Reviewed-by: Chunming Zhou Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c | 24 ++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c index 7056925eb3860..869ff624b108c 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c @@ -136,8 +136,9 @@ int amdgpu_fence_emit(struct amdgpu_ring *ring, struct dma_fence **f, { struct amdgpu_device *adev = ring->adev; struct amdgpu_fence *fence; - struct dma_fence *old, **ptr; + struct dma_fence __rcu **ptr; uint32_t seq; + int r; fence = kmem_cache_alloc(amdgpu_fence_slab, GFP_KERNEL); if (fence == NULL) @@ -153,15 +154,24 @@ int amdgpu_fence_emit(struct amdgpu_ring *ring, struct dma_fence **f, seq, flags | AMDGPU_FENCE_FLAG_INT); ptr = &ring->fence_drv.fences[seq & ring->fence_drv.num_fences_mask]; + if (unlikely(rcu_dereference_protected(*ptr, 1))) { + struct dma_fence *old; + + rcu_read_lock(); + old = dma_fence_get_rcu_safe(ptr); + rcu_read_unlock(); + + if (old) { + r = dma_fence_wait(old, false); + dma_fence_put(old); + if (r) + return r; + } + } + /* This function can't be called concurrently anyway, otherwise * emitting the fence would mess up the hardware ring buffer. */ - old = rcu_dereference_protected(*ptr, 1); - if (old && !dma_fence_is_signaled(old)) { - DRM_INFO("rcu slot is busy\n"); - dma_fence_wait(old, false); - } - rcu_assign_pointer(*ptr, dma_fence_get(&fence->base)); *f = &fence->base; -- 2.20.1