Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp715822yba; Mon, 1 Apr 2019 15:28:30 -0700 (PDT) X-Google-Smtp-Source: APXvYqx6U/K2wEZdrS/tS4wjNS2lf+5h5OI4yNdS4lSYzcYvEejfj+KPT/mirXwnGIHzML2RfRm6 X-Received: by 2002:a63:c23:: with SMTP id b35mr22965036pgl.298.1554157710293; Mon, 01 Apr 2019 15:28:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1554157710; cv=none; d=google.com; s=arc-20160816; b=Rk5yXxfoT2Hsp5psaf/x6MbEVsi/E3zoRNE+wQgBT3azkqY61tB0B1Zby++VzUqaRs OoBN9t5wD0cWALRPDU7l2k0SgMNJCUzooPx3XJYA7rlasgV32Bh8GFuSNJFaZquEuCB2 w7fFWBt8O+Fkg6FamdNYKLcChyqbKjlZwHkvC3+omHJW8WBq7QkhnEI5AbHojqTiN/+s uSR+b7BCxnpdWG0QvhABNq3/br2fxGm3kIxKlPWzbreB22L8PcDglihqx2gHoHrcwuDr LFv2Ak6DSbGZo6emwkFQBUFRntIleRaWRyDQ3agqx0Mb+/ni/IHyhATi8ofX079CxW1K BTXA== 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 :references:in-reply-to:message-id:date:subject:cc:to:from; bh=qKomPT0ybC/AdzKxmv/yzK0tsYvEObS68cpfeCtu7UE=; b=x9TmSlypoymnHbTDc3bKCdzO81Jv91vqWM3L3mxLnNgwb82hXxwe9x6VbuEqyt5yWG sV1eWLYXqZ3IpD21SL4dIeS4t7GkN5jETuNpNb3063gfSZGXXGlsq+hPJaLbyxjPFqC8 8YRk+E/evZSi7c4r2XEOqPfvC+ujFKwEPW+jRfNkfFWokryydRtZFRp3W9sjBG54kglC uZUDXcVgcD4jjU07fNzbxLvbW41/wG+rt6YmxrscCcpcfLE65DyaVfDj1Ov7Zfc8oQMa HeBZkRfUXPQnrSb5MzuxKhZbFrcho2SwYKCWJWz2wE9RpHIjEWMeCDEPNgwyNm+c7nW3 Jwgw== ARC-Authentication-Results: i=1; mx.google.com; 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 a11si9609058pgw.243.2019.04.01.15.28.14; Mon, 01 Apr 2019 15:28:30 -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; 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 S1728718AbfDAW1A (ORCPT + 99 others); Mon, 1 Apr 2019 18:27:00 -0400 Received: from anholt.net ([50.246.234.109]:48392 "EHLO anholt.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728570AbfDAW06 (ORCPT ); Mon, 1 Apr 2019 18:26:58 -0400 Received: from localhost (localhost [127.0.0.1]) by anholt.net (Postfix) with ESMTP id 6CBAC10A280A; Mon, 1 Apr 2019 15:26:57 -0700 (PDT) X-Virus-Scanned: Debian amavisd-new at anholt.net Received: from anholt.net ([127.0.0.1]) by localhost (kingsolver.anholt.net [127.0.0.1]) (amavisd-new, port 10024) with LMTP id FOnfzCXikpFz; Mon, 1 Apr 2019 15:26:53 -0700 (PDT) Received: from eliezer.anholt.net (localhost [127.0.0.1]) by anholt.net (Postfix) with ESMTP id 06BCE10A2230; Mon, 1 Apr 2019 15:26:38 -0700 (PDT) Received: by eliezer.anholt.net (Postfix, from userid 1000) id CD6712FE3514; Mon, 1 Apr 2019 15:26:35 -0700 (PDT) From: Eric Anholt To: dri-devel@lists.freedesktop.org Cc: linux-kernel@vger.kernel.org, david.emett@broadcom.com, thomas.spurden@broadcom.com, Rob Herring , Qiang Yu , Eric Anholt Subject: [PATCH 7/7] drm/lima: Use the drm_gem_fence_array_add helpers for our deps. Date: Mon, 1 Apr 2019 15:26:35 -0700 Message-Id: <20190401222635.25013-8-eric@anholt.net> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190401222635.25013-1-eric@anholt.net> References: <20190401222635.25013-1-eric@anholt.net> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org I haven't tested this, but it's a pretty direct port of what I did for v3d. Signed-off-by: Eric Anholt --- drivers/gpu/drm/lima/lima_gem.c | 37 +---------------- drivers/gpu/drm/lima/lima_sched.c | 66 ++++++------------------------- drivers/gpu/drm/lima/lima_sched.h | 6 +-- 3 files changed, 16 insertions(+), 93 deletions(-) diff --git a/drivers/gpu/drm/lima/lima_gem.c b/drivers/gpu/drm/lima/lima_gem.c index 2d3cf96f6c58..8f80286c80b4 100644 --- a/drivers/gpu/drm/lima/lima_gem.c +++ b/drivers/gpu/drm/lima/lima_gem.c @@ -144,40 +144,7 @@ static int lima_gem_sync_bo(struct lima_sched_task *task, struct lima_bo *bo, if (explicit) return 0; - /* implicit sync use bo fence in resv obj */ - if (write) { - unsigned nr_fences; - struct dma_fence **fences; - int i; - - err = reservation_object_get_fences_rcu( - bo->gem.resv, NULL, &nr_fences, &fences); - if (err || !nr_fences) - return err; - - for (i = 0; i < nr_fences; i++) { - err = lima_sched_task_add_dep(task, fences[i]); - if (err) - break; - } - - /* for error case free remaining fences */ - for ( ; i < nr_fences; i++) - dma_fence_put(fences[i]); - - kfree(fences); - } else { - struct dma_fence *fence; - - fence = reservation_object_get_excl_rcu(bo->gem.resv); - if (fence) { - err = lima_sched_task_add_dep(task, fence); - if (err) - dma_fence_put(fence); - } - } - - return err; + return drm_gem_fence_array_add_implicit(&task->deps, &bo->gem, write); } static int lima_gem_lock_bos(struct lima_bo **bos, u32 nr_bos, @@ -250,7 +217,7 @@ static int lima_gem_add_deps(struct drm_file *file, struct lima_submit *submit) if (err) return err; - err = lima_sched_task_add_dep(submit->task, fence); + err = drm_gem_fence_array_add(&submit->task->deps, fence); if (err) { dma_fence_put(fence); return err; diff --git a/drivers/gpu/drm/lima/lima_sched.c b/drivers/gpu/drm/lima/lima_sched.c index 97bd9c1deb87..e253d031fb3d 100644 --- a/drivers/gpu/drm/lima/lima_sched.c +++ b/drivers/gpu/drm/lima/lima_sched.c @@ -3,6 +3,7 @@ #include #include +#include #include "lima_drv.h" #include "lima_sched.h" @@ -126,19 +127,24 @@ int lima_sched_task_init(struct lima_sched_task *task, task->num_bos = num_bos; task->vm = lima_vm_get(vm); + + xa_init_flags(&task->deps, XA_FLAGS_ALLOC); + return 0; } void lima_sched_task_fini(struct lima_sched_task *task) { + struct dma_fence *fence; + unsigned long index; int i; drm_sched_job_cleanup(&task->base); - for (i = 0; i < task->num_dep; i++) - dma_fence_put(task->dep[i]); - - kfree(task->dep); + xa_for_each(&task->deps, index, fence) { + dma_fence_put(fence); + } + xa_destroy(&task->deps); if (task->bos) { for (i = 0; i < task->num_bos; i++) @@ -149,42 +155,6 @@ void lima_sched_task_fini(struct lima_sched_task *task) lima_vm_put(task->vm); } -int lima_sched_task_add_dep(struct lima_sched_task *task, struct dma_fence *fence) -{ - int i, new_dep = 4; - - /* same context's fence is definitly earlier then this task */ - if (fence->context == task->base.s_fence->finished.context) { - dma_fence_put(fence); - return 0; - } - - if (task->dep && task->num_dep == task->max_dep) - new_dep = task->max_dep * 2; - - if (task->max_dep < new_dep) { - void *dep = krealloc(task->dep, sizeof(*task->dep) * new_dep, GFP_KERNEL); - - if (!dep) - return -ENOMEM; - - task->max_dep = new_dep; - task->dep = dep; - } - - for (i = 0; i < task->num_dep; i++) { - if (task->dep[i]->context == fence->context && - dma_fence_is_later(fence, task->dep[i])) { - dma_fence_put(task->dep[i]); - task->dep[i] = fence; - return 0; - } - } - - task->dep[task->num_dep++] = fence; - return 0; -} - int lima_sched_context_init(struct lima_sched_pipe *pipe, struct lima_sched_context *context, atomic_t *guilty) @@ -213,21 +183,9 @@ static struct dma_fence *lima_sched_dependency(struct drm_sched_job *job, struct drm_sched_entity *entity) { struct lima_sched_task *task = to_lima_task(job); - int i; - - for (i = 0; i < task->num_dep; i++) { - struct dma_fence *fence = task->dep[i]; - - if (!task->dep[i]) - continue; - - task->dep[i] = NULL; - if (!dma_fence_is_signaled(fence)) - return fence; - - dma_fence_put(fence); - } + if (!xa_empty(&task->deps)) + return xa_erase(&task->deps, task->last_dep++); return NULL; } diff --git a/drivers/gpu/drm/lima/lima_sched.h b/drivers/gpu/drm/lima/lima_sched.h index b017cfa7e327..928af91c1118 100644 --- a/drivers/gpu/drm/lima/lima_sched.h +++ b/drivers/gpu/drm/lima/lima_sched.h @@ -14,9 +14,8 @@ struct lima_sched_task { struct lima_vm *vm; void *frame; - struct dma_fence **dep; - int num_dep; - int max_dep; + struct xarray deps; + unsigned long last_dep; struct lima_bo **bos; int num_bos; @@ -78,7 +77,6 @@ int lima_sched_task_init(struct lima_sched_task *task, struct lima_bo **bos, int num_bos, struct lima_vm *vm); void lima_sched_task_fini(struct lima_sched_task *task); -int lima_sched_task_add_dep(struct lima_sched_task *task, struct dma_fence *fence); int lima_sched_context_init(struct lima_sched_pipe *pipe, struct lima_sched_context *context, -- 2.20.1