From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6F71FC48BDF for ; Tue, 22 Jun 2021 16:55:27 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 5B8CE611CA for ; Tue, 22 Jun 2021 16:55:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231560AbhFVQ5m (ORCPT ); Tue, 22 Jun 2021 12:57:42 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51520 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230338AbhFVQ5l (ORCPT ); Tue, 22 Jun 2021 12:57:41 -0400 Received: from mail-wm1-x334.google.com (mail-wm1-x334.google.com [IPv6:2a00:1450:4864:20::334]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8555CC061574 for ; Tue, 22 Jun 2021 09:55:24 -0700 (PDT) Received: by mail-wm1-x334.google.com with SMTP id j11-20020a05600c1c0bb02901e23d4c0977so1599473wms.0 for ; Tue, 22 Jun 2021 09:55:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ffwll.ch; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=rzlrXCcEGb+HbsY6rQlzlR2DNoLWI/Ix70rWUJ+pXLw=; b=HrZXzj0ChHZ2FPuKHgGp1y+ikPP7o4UiPL+zjBi+qMWLFE3ZjOsU2N2zZOfS2TcM/I SfLq409V0moyZjsOBSAD8F/9rvYHW+rfaGNM/YPcxEIEN6r+MfRyVGBDkRXl4DiaWAVk YG/ChRwhLQW5CcPGzMAqAVYniXok+NjX4/lPA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=rzlrXCcEGb+HbsY6rQlzlR2DNoLWI/Ix70rWUJ+pXLw=; b=AMESqw4poHT2wn18Q8chAkbp1xwus4K3vKwlBOiIv/Dru7oriSejTCHJWV6/KGwu0V 1NLetk7Offqp99XiwEL53jG/bR5RS35BI9TLeK5YazKhEM01YwnD0zbDK6Io9MhqwCKt ZNwXswGFeGskxJlaGGefgdJ5bITUMfaTin3ArQBFISaraYBvd7ExV5y+ci7mXiQ65jao CF5EBO45iHdwfXeS2xXc3s32sd9nHhRCHHBObiR0G5EOSS2vfAYqx0CSq+5SNpzyPgtd +NsJANiun1R2ZIxD7pyCRVhba7g7V9qdts05kbJxwPQR0zEQXfjV+m0/+x6DDSqhGD8k fU+A== X-Gm-Message-State: AOAM530AZ+/UgBySEKnKDhaPJwyy47f4a5d2OdyizywsfGypKZFGRsWF MIGiQh6Cp+E8DVxmBm5zMzU/8w== X-Google-Smtp-Source: ABdhPJx1H4aHmftTCUui4jOyg6vFzbQSgGEI/SHgeAbQvMHIjZUERgp3Te66IUZSbZgmObuyzLjmTA== X-Received: by 2002:a1c:f206:: with SMTP id s6mr5378809wmc.102.1624380923065; Tue, 22 Jun 2021 09:55:23 -0700 (PDT) Received: from phenom.ffwll.local ([2a02:168:57f4:0:efd0:b9e5:5ae6:c2fa]) by smtp.gmail.com with ESMTPSA id l23sm3632342wmc.5.2021.06.22.09.55.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 22 Jun 2021 09:55:22 -0700 (PDT) From: Daniel Vetter To: DRI Development Cc: Intel Graphics Development , Daniel Vetter , Lucas Stach , =?UTF-8?q?Christian=20K=C3=B6nig?= , Luben Tuikov , Alex Deucher , Lee Jones , Steven Price , Rob Herring , Tomeu Vizoso , Alyssa Rosenzweig , Sumit Semwal , linux-media@vger.kernel.org, linaro-mm-sig@lists.linaro.org, Daniel Vetter Subject: [PATCH 05/15] drm/panfrost: Use xarray and helpers for depedency tracking Date: Tue, 22 Jun 2021 18:55:01 +0200 Message-Id: <20210622165511.3169559-6-daniel.vetter@ffwll.ch> X-Mailer: git-send-email 2.32.0.rc2 In-Reply-To: <20210622165511.3169559-1-daniel.vetter@ffwll.ch> References: <20210622165511.3169559-1-daniel.vetter@ffwll.ch> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org More consistency and prep work for the next patch. Aside: I wonder whether we shouldn't just move this entire xarray business into the scheduler so that not everyone has to reinvent the same wheels. Cc'ing some scheduler people for this too. v2: Correctly handle sched_lock since Lucas pointed out it's needed. v3: Rebase, dma_resv_get_excl_unlocked got renamed v4: Don't leak job references on failure (Steven). Cc: Lucas Stach Cc: "Christian König" Cc: Luben Tuikov Cc: Alex Deucher Cc: Lee Jones Cc: Steven Price Cc: Rob Herring Cc: Tomeu Vizoso Cc: Alyssa Rosenzweig Cc: Sumit Semwal Cc: linux-media@vger.kernel.org Cc: linaro-mm-sig@lists.linaro.org Signed-off-by: Daniel Vetter --- drivers/gpu/drm/panfrost/panfrost_drv.c | 41 +++++++--------- drivers/gpu/drm/panfrost/panfrost_job.c | 65 +++++++++++-------------- drivers/gpu/drm/panfrost/panfrost_job.h | 8 ++- 3 files changed, 49 insertions(+), 65 deletions(-) diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c b/drivers/gpu/drm/panfrost/panfrost_drv.c index 075ec0ef746c..3ee828f1e7a5 100644 --- a/drivers/gpu/drm/panfrost/panfrost_drv.c +++ b/drivers/gpu/drm/panfrost/panfrost_drv.c @@ -138,12 +138,6 @@ panfrost_lookup_bos(struct drm_device *dev, if (!job->bo_count) return 0; - job->implicit_fences = kvmalloc_array(job->bo_count, - sizeof(struct dma_fence *), - GFP_KERNEL | __GFP_ZERO); - if (!job->implicit_fences) - return -ENOMEM; - ret = drm_gem_objects_lookup(file_priv, (void __user *)(uintptr_t)args->bo_handles, job->bo_count, &job->bos); @@ -174,7 +168,7 @@ panfrost_lookup_bos(struct drm_device *dev, } /** - * panfrost_copy_in_sync() - Sets up job->in_fences[] with the sync objects + * panfrost_copy_in_sync() - Sets up job->deps with the sync objects * referenced by the job. * @dev: DRM device * @file_priv: DRM file for this fd @@ -194,22 +188,14 @@ panfrost_copy_in_sync(struct drm_device *dev, { u32 *handles; int ret = 0; - int i; + int i, in_fence_count; - job->in_fence_count = args->in_sync_count; + in_fence_count = args->in_sync_count; - if (!job->in_fence_count) + if (!in_fence_count) return 0; - job->in_fences = kvmalloc_array(job->in_fence_count, - sizeof(struct dma_fence *), - GFP_KERNEL | __GFP_ZERO); - if (!job->in_fences) { - DRM_DEBUG("Failed to allocate job in fences\n"); - return -ENOMEM; - } - - handles = kvmalloc_array(job->in_fence_count, sizeof(u32), GFP_KERNEL); + handles = kvmalloc_array(in_fence_count, sizeof(u32), GFP_KERNEL); if (!handles) { ret = -ENOMEM; DRM_DEBUG("Failed to allocate incoming syncobj handles\n"); @@ -218,16 +204,23 @@ panfrost_copy_in_sync(struct drm_device *dev, if (copy_from_user(handles, (void __user *)(uintptr_t)args->in_syncs, - job->in_fence_count * sizeof(u32))) { + in_fence_count * sizeof(u32))) { ret = -EFAULT; DRM_DEBUG("Failed to copy in syncobj handles\n"); goto fail; } - for (i = 0; i < job->in_fence_count; i++) { + for (i = 0; i < in_fence_count; i++) { + struct dma_fence *fence; + ret = drm_syncobj_find_fence(file_priv, handles[i], 0, 0, - &job->in_fences[i]); - if (ret == -EINVAL) + &fence); + if (ret) + goto fail; + + ret = drm_gem_fence_array_add(&job->deps, fence); + + if (ret) goto fail; } @@ -265,6 +258,8 @@ static int panfrost_ioctl_submit(struct drm_device *dev, void *data, kref_init(&job->refcount); + xa_init_flags(&job->deps, XA_FLAGS_ALLOC); + job->pfdev = pfdev; job->jc = args->jc; job->requirements = args->requirements; diff --git a/drivers/gpu/drm/panfrost/panfrost_job.c b/drivers/gpu/drm/panfrost/panfrost_job.c index 38f8580c19f1..71cd43fa1b36 100644 --- a/drivers/gpu/drm/panfrost/panfrost_job.c +++ b/drivers/gpu/drm/panfrost/panfrost_job.c @@ -196,14 +196,21 @@ static void panfrost_job_hw_submit(struct panfrost_job *job, int js) job_write(pfdev, JS_COMMAND_NEXT(js), JS_COMMAND_START); } -static void panfrost_acquire_object_fences(struct drm_gem_object **bos, - int bo_count, - struct dma_fence **implicit_fences) +static int panfrost_acquire_object_fences(struct drm_gem_object **bos, + int bo_count, + struct xarray *deps) { - int i; + int i, ret; - for (i = 0; i < bo_count; i++) - implicit_fences[i] = dma_resv_get_excl_unlocked(bos[i]->resv); + for (i = 0; i < bo_count; i++) { + struct dma_fence *fence = dma_resv_get_excl_unlocked(bos[i]->resv); + + ret = drm_gem_fence_array_add(deps, fence); + if (ret) + return ret; + } + + return 0; } static void panfrost_attach_object_fences(struct drm_gem_object **bos, @@ -240,10 +247,14 @@ int panfrost_job_push(struct panfrost_job *job) job->render_done_fence = dma_fence_get(&job->base.s_fence->finished); - kref_get(&job->refcount); /* put by scheduler job completion */ + ret = panfrost_acquire_object_fences(job->bos, job->bo_count, + &job->deps); + if (ret) { + mutex_unlock(&pfdev->sched_lock); + goto unlock; + } - panfrost_acquire_object_fences(job->bos, job->bo_count, - job->implicit_fences); + kref_get(&job->refcount); /* put by scheduler job completion */ drm_sched_entity_push_job(&job->base, entity); @@ -262,18 +273,15 @@ static void panfrost_job_cleanup(struct kref *ref) { struct panfrost_job *job = container_of(ref, struct panfrost_job, refcount); + struct dma_fence *fence; + unsigned long index; unsigned int i; - if (job->in_fences) { - for (i = 0; i < job->in_fence_count; i++) - dma_fence_put(job->in_fences[i]); - kvfree(job->in_fences); - } - if (job->implicit_fences) { - for (i = 0; i < job->bo_count; i++) - dma_fence_put(job->implicit_fences[i]); - kvfree(job->implicit_fences); + xa_for_each(&job->deps, index, fence) { + dma_fence_put(fence); } + xa_destroy(&job->deps); + dma_fence_put(job->done_fence); dma_fence_put(job->render_done_fence); @@ -316,26 +324,9 @@ static struct dma_fence *panfrost_job_dependency(struct drm_sched_job *sched_job struct drm_sched_entity *s_entity) { struct panfrost_job *job = to_panfrost_job(sched_job); - struct dma_fence *fence; - unsigned int i; - - /* Explicit fences */ - for (i = 0; i < job->in_fence_count; i++) { - if (job->in_fences[i]) { - fence = job->in_fences[i]; - job->in_fences[i] = NULL; - return fence; - } - } - /* Implicit fences, max. one per BO */ - for (i = 0; i < job->bo_count; i++) { - if (job->implicit_fences[i]) { - fence = job->implicit_fences[i]; - job->implicit_fences[i] = NULL; - return fence; - } - } + if (!xa_empty(&job->deps)) + return xa_erase(&job->deps, job->last_dep++); return NULL; } diff --git a/drivers/gpu/drm/panfrost/panfrost_job.h b/drivers/gpu/drm/panfrost/panfrost_job.h index bbd3ba97ff67..82306a03b57e 100644 --- a/drivers/gpu/drm/panfrost/panfrost_job.h +++ b/drivers/gpu/drm/panfrost/panfrost_job.h @@ -19,9 +19,9 @@ struct panfrost_job { struct panfrost_device *pfdev; struct panfrost_file_priv *file_priv; - /* Optional fences userspace can pass in for the job to depend on. */ - struct dma_fence **in_fences; - u32 in_fence_count; + /* Contains both explicit and implicit fences */ + struct xarray deps; + unsigned long last_dep; /* Fence to be signaled by IRQ handler when the job is complete. */ struct dma_fence *done_fence; @@ -30,8 +30,6 @@ struct panfrost_job { __u32 requirements; __u32 flush_id; - /* Exclusive fences we have taken from the BOs to wait for */ - struct dma_fence **implicit_fences; struct panfrost_gem_mapping **mappings; struct drm_gem_object **bos; u32 bo_count; -- 2.32.0.rc2 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.5 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 301B7C2B9F4 for ; Tue, 22 Jun 2021 16:55:42 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 01AF46102A for ; Tue, 22 Jun 2021 16:55:41 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 01AF46102A Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=ffwll.ch Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 3C8626E808; Tue, 22 Jun 2021 16:55:28 +0000 (UTC) Received: from mail-wm1-x32e.google.com (mail-wm1-x32e.google.com [IPv6:2a00:1450:4864:20::32e]) by gabe.freedesktop.org (Postfix) with ESMTPS id 7AE846E7E2 for ; Tue, 22 Jun 2021 16:55:24 +0000 (UTC) Received: by mail-wm1-x32e.google.com with SMTP id c84so13233537wme.5 for ; Tue, 22 Jun 2021 09:55:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ffwll.ch; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=rzlrXCcEGb+HbsY6rQlzlR2DNoLWI/Ix70rWUJ+pXLw=; b=HrZXzj0ChHZ2FPuKHgGp1y+ikPP7o4UiPL+zjBi+qMWLFE3ZjOsU2N2zZOfS2TcM/I SfLq409V0moyZjsOBSAD8F/9rvYHW+rfaGNM/YPcxEIEN6r+MfRyVGBDkRXl4DiaWAVk YG/ChRwhLQW5CcPGzMAqAVYniXok+NjX4/lPA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=rzlrXCcEGb+HbsY6rQlzlR2DNoLWI/Ix70rWUJ+pXLw=; b=ibAKqqJIb3eN3bX1ZLdjxDjifM4STIiTa2UQ/HRExosXEUrycFMIbVKx5da+8z6GGI zGNFvtkCRaoKalgX3eLxFeQropWWs5aj4BmFEPkEZhSXyRLXT7PIBy2SRzMwwqaK3IF3 dXB6DMmV4Os4Bc1OuC23WabJUoMMN6wNnTHXFcSoTQLz77yxiKyELF+RrfiqrITz6SLi jvncR6NS4TafnfskMopDXAlHUyRsbxXktf42aX8IWWjkEKuBVjgfz128Sn1IaLfyY8op 3VoyddqFPrbe26o6lZOcjxBYI3/pCQJ8xfSxMDX+zxtVbSWGDhZ/nSiPTPJhuNwuB/+u bgmw== X-Gm-Message-State: AOAM532qua+twCkAv8ddbyH7peWFdcOpTlV8K0N0RXCg/hotIIyoURU6 IJbc2nLikk8NDRnXInUZW9WrJRVX9ezPoA== X-Google-Smtp-Source: ABdhPJx1H4aHmftTCUui4jOyg6vFzbQSgGEI/SHgeAbQvMHIjZUERgp3Te66IUZSbZgmObuyzLjmTA== X-Received: by 2002:a1c:f206:: with SMTP id s6mr5378809wmc.102.1624380923065; Tue, 22 Jun 2021 09:55:23 -0700 (PDT) Received: from phenom.ffwll.local ([2a02:168:57f4:0:efd0:b9e5:5ae6:c2fa]) by smtp.gmail.com with ESMTPSA id l23sm3632342wmc.5.2021.06.22.09.55.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 22 Jun 2021 09:55:22 -0700 (PDT) From: Daniel Vetter To: DRI Development Subject: [PATCH 05/15] drm/panfrost: Use xarray and helpers for depedency tracking Date: Tue, 22 Jun 2021 18:55:01 +0200 Message-Id: <20210622165511.3169559-6-daniel.vetter@ffwll.ch> X-Mailer: git-send-email 2.32.0.rc2 In-Reply-To: <20210622165511.3169559-1-daniel.vetter@ffwll.ch> References: <20210622165511.3169559-1-daniel.vetter@ffwll.ch> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Tomeu Vizoso , Daniel Vetter , Intel Graphics Development , Steven Price , linaro-mm-sig@lists.linaro.org, Luben Tuikov , Alyssa Rosenzweig , Alex Deucher , Daniel Vetter , linux-media@vger.kernel.org, Lee Jones , =?UTF-8?q?Christian=20K=C3=B6nig?= Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" More consistency and prep work for the next patch. Aside: I wonder whether we shouldn't just move this entire xarray business into the scheduler so that not everyone has to reinvent the same wheels. Cc'ing some scheduler people for this too. v2: Correctly handle sched_lock since Lucas pointed out it's needed. v3: Rebase, dma_resv_get_excl_unlocked got renamed v4: Don't leak job references on failure (Steven). Cc: Lucas Stach Cc: "Christian König" Cc: Luben Tuikov Cc: Alex Deucher Cc: Lee Jones Cc: Steven Price Cc: Rob Herring Cc: Tomeu Vizoso Cc: Alyssa Rosenzweig Cc: Sumit Semwal Cc: linux-media@vger.kernel.org Cc: linaro-mm-sig@lists.linaro.org Signed-off-by: Daniel Vetter --- drivers/gpu/drm/panfrost/panfrost_drv.c | 41 +++++++--------- drivers/gpu/drm/panfrost/panfrost_job.c | 65 +++++++++++-------------- drivers/gpu/drm/panfrost/panfrost_job.h | 8 ++- 3 files changed, 49 insertions(+), 65 deletions(-) diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c b/drivers/gpu/drm/panfrost/panfrost_drv.c index 075ec0ef746c..3ee828f1e7a5 100644 --- a/drivers/gpu/drm/panfrost/panfrost_drv.c +++ b/drivers/gpu/drm/panfrost/panfrost_drv.c @@ -138,12 +138,6 @@ panfrost_lookup_bos(struct drm_device *dev, if (!job->bo_count) return 0; - job->implicit_fences = kvmalloc_array(job->bo_count, - sizeof(struct dma_fence *), - GFP_KERNEL | __GFP_ZERO); - if (!job->implicit_fences) - return -ENOMEM; - ret = drm_gem_objects_lookup(file_priv, (void __user *)(uintptr_t)args->bo_handles, job->bo_count, &job->bos); @@ -174,7 +168,7 @@ panfrost_lookup_bos(struct drm_device *dev, } /** - * panfrost_copy_in_sync() - Sets up job->in_fences[] with the sync objects + * panfrost_copy_in_sync() - Sets up job->deps with the sync objects * referenced by the job. * @dev: DRM device * @file_priv: DRM file for this fd @@ -194,22 +188,14 @@ panfrost_copy_in_sync(struct drm_device *dev, { u32 *handles; int ret = 0; - int i; + int i, in_fence_count; - job->in_fence_count = args->in_sync_count; + in_fence_count = args->in_sync_count; - if (!job->in_fence_count) + if (!in_fence_count) return 0; - job->in_fences = kvmalloc_array(job->in_fence_count, - sizeof(struct dma_fence *), - GFP_KERNEL | __GFP_ZERO); - if (!job->in_fences) { - DRM_DEBUG("Failed to allocate job in fences\n"); - return -ENOMEM; - } - - handles = kvmalloc_array(job->in_fence_count, sizeof(u32), GFP_KERNEL); + handles = kvmalloc_array(in_fence_count, sizeof(u32), GFP_KERNEL); if (!handles) { ret = -ENOMEM; DRM_DEBUG("Failed to allocate incoming syncobj handles\n"); @@ -218,16 +204,23 @@ panfrost_copy_in_sync(struct drm_device *dev, if (copy_from_user(handles, (void __user *)(uintptr_t)args->in_syncs, - job->in_fence_count * sizeof(u32))) { + in_fence_count * sizeof(u32))) { ret = -EFAULT; DRM_DEBUG("Failed to copy in syncobj handles\n"); goto fail; } - for (i = 0; i < job->in_fence_count; i++) { + for (i = 0; i < in_fence_count; i++) { + struct dma_fence *fence; + ret = drm_syncobj_find_fence(file_priv, handles[i], 0, 0, - &job->in_fences[i]); - if (ret == -EINVAL) + &fence); + if (ret) + goto fail; + + ret = drm_gem_fence_array_add(&job->deps, fence); + + if (ret) goto fail; } @@ -265,6 +258,8 @@ static int panfrost_ioctl_submit(struct drm_device *dev, void *data, kref_init(&job->refcount); + xa_init_flags(&job->deps, XA_FLAGS_ALLOC); + job->pfdev = pfdev; job->jc = args->jc; job->requirements = args->requirements; diff --git a/drivers/gpu/drm/panfrost/panfrost_job.c b/drivers/gpu/drm/panfrost/panfrost_job.c index 38f8580c19f1..71cd43fa1b36 100644 --- a/drivers/gpu/drm/panfrost/panfrost_job.c +++ b/drivers/gpu/drm/panfrost/panfrost_job.c @@ -196,14 +196,21 @@ static void panfrost_job_hw_submit(struct panfrost_job *job, int js) job_write(pfdev, JS_COMMAND_NEXT(js), JS_COMMAND_START); } -static void panfrost_acquire_object_fences(struct drm_gem_object **bos, - int bo_count, - struct dma_fence **implicit_fences) +static int panfrost_acquire_object_fences(struct drm_gem_object **bos, + int bo_count, + struct xarray *deps) { - int i; + int i, ret; - for (i = 0; i < bo_count; i++) - implicit_fences[i] = dma_resv_get_excl_unlocked(bos[i]->resv); + for (i = 0; i < bo_count; i++) { + struct dma_fence *fence = dma_resv_get_excl_unlocked(bos[i]->resv); + + ret = drm_gem_fence_array_add(deps, fence); + if (ret) + return ret; + } + + return 0; } static void panfrost_attach_object_fences(struct drm_gem_object **bos, @@ -240,10 +247,14 @@ int panfrost_job_push(struct panfrost_job *job) job->render_done_fence = dma_fence_get(&job->base.s_fence->finished); - kref_get(&job->refcount); /* put by scheduler job completion */ + ret = panfrost_acquire_object_fences(job->bos, job->bo_count, + &job->deps); + if (ret) { + mutex_unlock(&pfdev->sched_lock); + goto unlock; + } - panfrost_acquire_object_fences(job->bos, job->bo_count, - job->implicit_fences); + kref_get(&job->refcount); /* put by scheduler job completion */ drm_sched_entity_push_job(&job->base, entity); @@ -262,18 +273,15 @@ static void panfrost_job_cleanup(struct kref *ref) { struct panfrost_job *job = container_of(ref, struct panfrost_job, refcount); + struct dma_fence *fence; + unsigned long index; unsigned int i; - if (job->in_fences) { - for (i = 0; i < job->in_fence_count; i++) - dma_fence_put(job->in_fences[i]); - kvfree(job->in_fences); - } - if (job->implicit_fences) { - for (i = 0; i < job->bo_count; i++) - dma_fence_put(job->implicit_fences[i]); - kvfree(job->implicit_fences); + xa_for_each(&job->deps, index, fence) { + dma_fence_put(fence); } + xa_destroy(&job->deps); + dma_fence_put(job->done_fence); dma_fence_put(job->render_done_fence); @@ -316,26 +324,9 @@ static struct dma_fence *panfrost_job_dependency(struct drm_sched_job *sched_job struct drm_sched_entity *s_entity) { struct panfrost_job *job = to_panfrost_job(sched_job); - struct dma_fence *fence; - unsigned int i; - - /* Explicit fences */ - for (i = 0; i < job->in_fence_count; i++) { - if (job->in_fences[i]) { - fence = job->in_fences[i]; - job->in_fences[i] = NULL; - return fence; - } - } - /* Implicit fences, max. one per BO */ - for (i = 0; i < job->bo_count; i++) { - if (job->implicit_fences[i]) { - fence = job->implicit_fences[i]; - job->implicit_fences[i] = NULL; - return fence; - } - } + if (!xa_empty(&job->deps)) + return xa_erase(&job->deps, job->last_dep++); return NULL; } diff --git a/drivers/gpu/drm/panfrost/panfrost_job.h b/drivers/gpu/drm/panfrost/panfrost_job.h index bbd3ba97ff67..82306a03b57e 100644 --- a/drivers/gpu/drm/panfrost/panfrost_job.h +++ b/drivers/gpu/drm/panfrost/panfrost_job.h @@ -19,9 +19,9 @@ struct panfrost_job { struct panfrost_device *pfdev; struct panfrost_file_priv *file_priv; - /* Optional fences userspace can pass in for the job to depend on. */ - struct dma_fence **in_fences; - u32 in_fence_count; + /* Contains both explicit and implicit fences */ + struct xarray deps; + unsigned long last_dep; /* Fence to be signaled by IRQ handler when the job is complete. */ struct dma_fence *done_fence; @@ -30,8 +30,6 @@ struct panfrost_job { __u32 requirements; __u32 flush_id; - /* Exclusive fences we have taken from the BOs to wait for */ - struct dma_fence **implicit_fences; struct panfrost_gem_mapping **mappings; struct drm_gem_object **bos; u32 bo_count; -- 2.32.0.rc2 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.5 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A253BC48BE5 for ; Tue, 22 Jun 2021 16:55:38 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 7369C6102A for ; Tue, 22 Jun 2021 16:55:38 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 7369C6102A Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=ffwll.ch Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 7D96C6E804; Tue, 22 Jun 2021 16:55:25 +0000 (UTC) Received: from mail-wm1-x32e.google.com (mail-wm1-x32e.google.com [IPv6:2a00:1450:4864:20::32e]) by gabe.freedesktop.org (Postfix) with ESMTPS id 7AEA96E7EA for ; Tue, 22 Jun 2021 16:55:24 +0000 (UTC) Received: by mail-wm1-x32e.google.com with SMTP id p10-20020a05600c430ab02901df57d735f7so2214630wme.3 for ; Tue, 22 Jun 2021 09:55:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ffwll.ch; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=rzlrXCcEGb+HbsY6rQlzlR2DNoLWI/Ix70rWUJ+pXLw=; b=HrZXzj0ChHZ2FPuKHgGp1y+ikPP7o4UiPL+zjBi+qMWLFE3ZjOsU2N2zZOfS2TcM/I SfLq409V0moyZjsOBSAD8F/9rvYHW+rfaGNM/YPcxEIEN6r+MfRyVGBDkRXl4DiaWAVk YG/ChRwhLQW5CcPGzMAqAVYniXok+NjX4/lPA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=rzlrXCcEGb+HbsY6rQlzlR2DNoLWI/Ix70rWUJ+pXLw=; b=Md8DjFW5MmcM5yfTOsBdBl0dZvqUhTDhMMdGOZqLZBZYSo36baLtbyRxOTck4OPIg/ qZrDqWR0C9zOzgGN8b0PjK3/jMnmvPM7sunDLNiJvFVymWT581NiTnWgoxaCmLZXcuHa 4zDZi7yMS5U7abSOun7N/1CBh1xtdgS+K1X94WhyXxyQ6qCB5HpJz5IorMJWaPpW7rum alsOUEtra/B0ljvLgHCD27mfj9i0T0HaclFg2w+wCjLnhJaPyfEwIUvg+yxr4Q9rEGDA fG+fb0DG9ncOi2s5ZZBd307igyMc+ub0WvPDWuxTcL38LgCx+tbho1fjRU7So21L6bZZ cYLg== X-Gm-Message-State: AOAM530fzJzzY9LH0hKryAQlyo1MDrrGC5eB3a4s2kFlBRWaa4dh84eQ 4rFkA2KiXfVLpsiNf50s1r+Gyw== X-Google-Smtp-Source: ABdhPJx1H4aHmftTCUui4jOyg6vFzbQSgGEI/SHgeAbQvMHIjZUERgp3Te66IUZSbZgmObuyzLjmTA== X-Received: by 2002:a1c:f206:: with SMTP id s6mr5378809wmc.102.1624380923065; Tue, 22 Jun 2021 09:55:23 -0700 (PDT) Received: from phenom.ffwll.local ([2a02:168:57f4:0:efd0:b9e5:5ae6:c2fa]) by smtp.gmail.com with ESMTPSA id l23sm3632342wmc.5.2021.06.22.09.55.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 22 Jun 2021 09:55:22 -0700 (PDT) From: Daniel Vetter To: DRI Development Date: Tue, 22 Jun 2021 18:55:01 +0200 Message-Id: <20210622165511.3169559-6-daniel.vetter@ffwll.ch> X-Mailer: git-send-email 2.32.0.rc2 In-Reply-To: <20210622165511.3169559-1-daniel.vetter@ffwll.ch> References: <20210622165511.3169559-1-daniel.vetter@ffwll.ch> MIME-Version: 1.0 Subject: [Intel-gfx] [PATCH 05/15] drm/panfrost: Use xarray and helpers for depedency tracking X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Sumit Semwal , Rob Herring , Tomeu Vizoso , Daniel Vetter , Intel Graphics Development , Steven Price , linaro-mm-sig@lists.linaro.org, Luben Tuikov , Alyssa Rosenzweig , Alex Deucher , Daniel Vetter , linux-media@vger.kernel.org, Lee Jones , =?UTF-8?q?Christian=20K=C3=B6nig?= , Lucas Stach Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" TW9yZSBjb25zaXN0ZW5jeSBhbmQgcHJlcCB3b3JrIGZvciB0aGUgbmV4dCBwYXRjaC4KCkFzaWRl OiBJIHdvbmRlciB3aGV0aGVyIHdlIHNob3VsZG4ndCBqdXN0IG1vdmUgdGhpcyBlbnRpcmUgeGFy cmF5CmJ1c2luZXNzIGludG8gdGhlIHNjaGVkdWxlciBzbyB0aGF0IG5vdCBldmVyeW9uZSBoYXMg dG8gcmVpbnZlbnQgdGhlCnNhbWUgd2hlZWxzLiBDYydpbmcgc29tZSBzY2hlZHVsZXIgcGVvcGxl IGZvciB0aGlzIHRvby4KCnYyOiBDb3JyZWN0bHkgaGFuZGxlIHNjaGVkX2xvY2sgc2luY2UgTHVj YXMgcG9pbnRlZCBvdXQgaXQncyBuZWVkZWQuCgp2MzogUmViYXNlLCBkbWFfcmVzdl9nZXRfZXhj bF91bmxvY2tlZCBnb3QgcmVuYW1lZAoKdjQ6IERvbid0IGxlYWsgam9iIHJlZmVyZW5jZXMgb24g ZmFpbHVyZSAoU3RldmVuKS4KCkNjOiBMdWNhcyBTdGFjaCA8bC5zdGFjaEBwZW5ndXRyb25peC5k ZT4KQ2M6ICJDaHJpc3RpYW4gS8O2bmlnIiA8Y2hyaXN0aWFuLmtvZW5pZ0BhbWQuY29tPgpDYzog THViZW4gVHVpa292IDxsdWJlbi50dWlrb3ZAYW1kLmNvbT4KQ2M6IEFsZXggRGV1Y2hlciA8YWxl eGFuZGVyLmRldWNoZXJAYW1kLmNvbT4KQ2M6IExlZSBKb25lcyA8bGVlLmpvbmVzQGxpbmFyby5v cmc+CkNjOiBTdGV2ZW4gUHJpY2UgPHN0ZXZlbi5wcmljZUBhcm0uY29tPgpDYzogUm9iIEhlcnJp bmcgPHJvYmhAa2VybmVsLm9yZz4KQ2M6IFRvbWV1IFZpem9zbyA8dG9tZXUudml6b3NvQGNvbGxh Ym9yYS5jb20+CkNjOiBBbHlzc2EgUm9zZW56d2VpZyA8YWx5c3NhLnJvc2VuendlaWdAY29sbGFi b3JhLmNvbT4KQ2M6IFN1bWl0IFNlbXdhbCA8c3VtaXQuc2Vtd2FsQGxpbmFyby5vcmc+CkNjOiBs aW51eC1tZWRpYUB2Z2VyLmtlcm5lbC5vcmcKQ2M6IGxpbmFyby1tbS1zaWdAbGlzdHMubGluYXJv Lm9yZwpTaWduZWQtb2ZmLWJ5OiBEYW5pZWwgVmV0dGVyIDxkYW5pZWwudmV0dGVyQGludGVsLmNv bT4KLS0tCiBkcml2ZXJzL2dwdS9kcm0vcGFuZnJvc3QvcGFuZnJvc3RfZHJ2LmMgfCA0MSArKysr KysrLS0tLS0tLS0tCiBkcml2ZXJzL2dwdS9kcm0vcGFuZnJvc3QvcGFuZnJvc3Rfam9iLmMgfCA2 NSArKysrKysrKysrKy0tLS0tLS0tLS0tLS0tCiBkcml2ZXJzL2dwdS9kcm0vcGFuZnJvc3QvcGFu ZnJvc3Rfam9iLmggfCAgOCArKy0KIDMgZmlsZXMgY2hhbmdlZCwgNDkgaW5zZXJ0aW9ucygrKSwg NjUgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3BhbmZyb3N0L3Bh bmZyb3N0X2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL3BhbmZyb3N0L3BhbmZyb3N0X2Rydi5jCmlu ZGV4IDA3NWVjMGVmNzQ2Yy4uM2VlODI4ZjFlN2E1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9k cm0vcGFuZnJvc3QvcGFuZnJvc3RfZHJ2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3BhbmZyb3N0 L3BhbmZyb3N0X2Rydi5jCkBAIC0xMzgsMTIgKzEzOCw2IEBAIHBhbmZyb3N0X2xvb2t1cF9ib3Mo c3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAlpZiAoIWpvYi0+Ym9fY291bnQpCiAJCXJldHVybiAw OwogCi0Jam9iLT5pbXBsaWNpdF9mZW5jZXMgPSBrdm1hbGxvY19hcnJheShqb2ItPmJvX2NvdW50 LAotCQkJCSAgc2l6ZW9mKHN0cnVjdCBkbWFfZmVuY2UgKiksCi0JCQkJICBHRlBfS0VSTkVMIHwg X19HRlBfWkVSTyk7Ci0JaWYgKCFqb2ItPmltcGxpY2l0X2ZlbmNlcykKLQkJcmV0dXJuIC1FTk9N RU07Ci0KIAlyZXQgPSBkcm1fZ2VtX29iamVjdHNfbG9va3VwKGZpbGVfcHJpdiwKIAkJCQkgICAg ICh2b2lkIF9fdXNlciAqKSh1aW50cHRyX3QpYXJncy0+Ym9faGFuZGxlcywKIAkJCQkgICAgIGpv Yi0+Ym9fY291bnQsICZqb2ItPmJvcyk7CkBAIC0xNzQsNyArMTY4LDcgQEAgcGFuZnJvc3RfbG9v a3VwX2JvcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogfQogCiAvKioKLSAqIHBhbmZyb3N0X2Nv cHlfaW5fc3luYygpIC0gU2V0cyB1cCBqb2ItPmluX2ZlbmNlc1tdIHdpdGggdGhlIHN5bmMgb2Jq ZWN0cworICogcGFuZnJvc3RfY29weV9pbl9zeW5jKCkgLSBTZXRzIHVwIGpvYi0+ZGVwcyB3aXRo IHRoZSBzeW5jIG9iamVjdHMKICAqIHJlZmVyZW5jZWQgYnkgdGhlIGpvYi4KICAqIEBkZXY6IERS TSBkZXZpY2UKICAqIEBmaWxlX3ByaXY6IERSTSBmaWxlIGZvciB0aGlzIGZkCkBAIC0xOTQsMjIg KzE4OCwxNCBAQCBwYW5mcm9zdF9jb3B5X2luX3N5bmMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwK IHsKIAl1MzIgKmhhbmRsZXM7CiAJaW50IHJldCA9IDA7Ci0JaW50IGk7CisJaW50IGksIGluX2Zl bmNlX2NvdW50OwogCi0Jam9iLT5pbl9mZW5jZV9jb3VudCA9IGFyZ3MtPmluX3N5bmNfY291bnQ7 CisJaW5fZmVuY2VfY291bnQgPSBhcmdzLT5pbl9zeW5jX2NvdW50OwogCi0JaWYgKCFqb2ItPmlu X2ZlbmNlX2NvdW50KQorCWlmICghaW5fZmVuY2VfY291bnQpCiAJCXJldHVybiAwOwogCi0Jam9i LT5pbl9mZW5jZXMgPSBrdm1hbGxvY19hcnJheShqb2ItPmluX2ZlbmNlX2NvdW50LAotCQkJCQlz aXplb2Yoc3RydWN0IGRtYV9mZW5jZSAqKSwKLQkJCQkJR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8p OwotCWlmICgham9iLT5pbl9mZW5jZXMpIHsKLQkJRFJNX0RFQlVHKCJGYWlsZWQgdG8gYWxsb2Nh dGUgam9iIGluIGZlbmNlc1xuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWhhbmRsZXMg PSBrdm1hbGxvY19hcnJheShqb2ItPmluX2ZlbmNlX2NvdW50LCBzaXplb2YodTMyKSwgR0ZQX0tF Uk5FTCk7CisJaGFuZGxlcyA9IGt2bWFsbG9jX2FycmF5KGluX2ZlbmNlX2NvdW50LCBzaXplb2Yo dTMyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFoYW5kbGVzKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJ CURSTV9ERUJVRygiRmFpbGVkIHRvIGFsbG9jYXRlIGluY29taW5nIHN5bmNvYmogaGFuZGxlc1xu Iik7CkBAIC0yMTgsMTYgKzIwNCwyMyBAQCBwYW5mcm9zdF9jb3B5X2luX3N5bmMoc3RydWN0IGRy bV9kZXZpY2UgKmRldiwKIAogCWlmIChjb3B5X2Zyb21fdXNlcihoYW5kbGVzLAogCQkJICAgKHZv aWQgX191c2VyICopKHVpbnRwdHJfdClhcmdzLT5pbl9zeW5jcywKLQkJCSAgIGpvYi0+aW5fZmVu Y2VfY291bnQgKiBzaXplb2YodTMyKSkpIHsKKwkJCSAgIGluX2ZlbmNlX2NvdW50ICogc2l6ZW9m KHUzMikpKSB7CiAJCXJldCA9IC1FRkFVTFQ7CiAJCURSTV9ERUJVRygiRmFpbGVkIHRvIGNvcHkg aW4gc3luY29iaiBoYW5kbGVzXG4iKTsKIAkJZ290byBmYWlsOwogCX0KIAotCWZvciAoaSA9IDA7 IGkgPCBqb2ItPmluX2ZlbmNlX2NvdW50OyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgaW5fZmVu Y2VfY291bnQ7IGkrKykgeworCQlzdHJ1Y3QgZG1hX2ZlbmNlICpmZW5jZTsKKwogCQlyZXQgPSBk cm1fc3luY29ial9maW5kX2ZlbmNlKGZpbGVfcHJpdiwgaGFuZGxlc1tpXSwgMCwgMCwKLQkJCQkJ ICAgICAmam9iLT5pbl9mZW5jZXNbaV0pOwotCQlpZiAocmV0ID09IC1FSU5WQUwpCisJCQkJCSAg ICAgJmZlbmNlKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZmFpbDsKKworCQlyZXQgPSBkcm1fZ2Vt X2ZlbmNlX2FycmF5X2FkZCgmam9iLT5kZXBzLCBmZW5jZSk7CisKKwkJaWYgKHJldCkKIAkJCWdv dG8gZmFpbDsKIAl9CiAKQEAgLTI2NSw2ICsyNTgsOCBAQCBzdGF0aWMgaW50IHBhbmZyb3N0X2lv Y3RsX3N1Ym1pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAogCiAJa3JlZl9p bml0KCZqb2ItPnJlZmNvdW50KTsKIAorCXhhX2luaXRfZmxhZ3MoJmpvYi0+ZGVwcywgWEFfRkxB R1NfQUxMT0MpOworCiAJam9iLT5wZmRldiA9IHBmZGV2OwogCWpvYi0+amMgPSBhcmdzLT5qYzsK IAlqb2ItPnJlcXVpcmVtZW50cyA9IGFyZ3MtPnJlcXVpcmVtZW50czsKZGlmZiAtLWdpdCBhL2Ry aXZlcnMvZ3B1L2RybS9wYW5mcm9zdC9wYW5mcm9zdF9qb2IuYyBiL2RyaXZlcnMvZ3B1L2RybS9w YW5mcm9zdC9wYW5mcm9zdF9qb2IuYwppbmRleCAzOGY4NTgwYzE5ZjEuLjcxY2Q0M2ZhMWIzNiAx MDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3BhbmZyb3N0L3BhbmZyb3N0X2pvYi5jCisrKyBi L2RyaXZlcnMvZ3B1L2RybS9wYW5mcm9zdC9wYW5mcm9zdF9qb2IuYwpAQCAtMTk2LDE0ICsxOTYs MjEgQEAgc3RhdGljIHZvaWQgcGFuZnJvc3Rfam9iX2h3X3N1Ym1pdChzdHJ1Y3QgcGFuZnJvc3Rf am9iICpqb2IsIGludCBqcykKIAlqb2Jfd3JpdGUocGZkZXYsIEpTX0NPTU1BTkRfTkVYVChqcyks IEpTX0NPTU1BTkRfU1RBUlQpOwogfQogCi1zdGF0aWMgdm9pZCBwYW5mcm9zdF9hY3F1aXJlX29i amVjdF9mZW5jZXMoc3RydWN0IGRybV9nZW1fb2JqZWN0ICoqYm9zLAotCQkJCQkgICBpbnQgYm9f Y291bnQsCi0JCQkJCSAgIHN0cnVjdCBkbWFfZmVuY2UgKippbXBsaWNpdF9mZW5jZXMpCitzdGF0 aWMgaW50IHBhbmZyb3N0X2FjcXVpcmVfb2JqZWN0X2ZlbmNlcyhzdHJ1Y3QgZHJtX2dlbV9vYmpl Y3QgKipib3MsCisJCQkJCSAgaW50IGJvX2NvdW50LAorCQkJCQkgIHN0cnVjdCB4YXJyYXkgKmRl cHMpCiB7Ci0JaW50IGk7CisJaW50IGksIHJldDsKIAotCWZvciAoaSA9IDA7IGkgPCBib19jb3Vu dDsgaSsrKQotCQlpbXBsaWNpdF9mZW5jZXNbaV0gPSBkbWFfcmVzdl9nZXRfZXhjbF91bmxvY2tl ZChib3NbaV0tPnJlc3YpOworCWZvciAoaSA9IDA7IGkgPCBib19jb3VudDsgaSsrKSB7CisJCXN0 cnVjdCBkbWFfZmVuY2UgKmZlbmNlID0gZG1hX3Jlc3ZfZ2V0X2V4Y2xfdW5sb2NrZWQoYm9zW2ld LT5yZXN2KTsKKworCQlyZXQgPSBkcm1fZ2VtX2ZlbmNlX2FycmF5X2FkZChkZXBzLCBmZW5jZSk7 CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOwogfQogCiBzdGF0 aWMgdm9pZCBwYW5mcm9zdF9hdHRhY2hfb2JqZWN0X2ZlbmNlcyhzdHJ1Y3QgZHJtX2dlbV9vYmpl Y3QgKipib3MsCkBAIC0yNDAsMTAgKzI0NywxNCBAQCBpbnQgcGFuZnJvc3Rfam9iX3B1c2goc3Ry dWN0IHBhbmZyb3N0X2pvYiAqam9iKQogCiAJam9iLT5yZW5kZXJfZG9uZV9mZW5jZSA9IGRtYV9m ZW5jZV9nZXQoJmpvYi0+YmFzZS5zX2ZlbmNlLT5maW5pc2hlZCk7CiAKLQlrcmVmX2dldCgmam9i LT5yZWZjb3VudCk7IC8qIHB1dCBieSBzY2hlZHVsZXIgam9iIGNvbXBsZXRpb24gKi8KKwlyZXQg PSBwYW5mcm9zdF9hY3F1aXJlX29iamVjdF9mZW5jZXMoam9iLT5ib3MsIGpvYi0+Ym9fY291bnQs CisJCQkJCSAgICAgJmpvYi0+ZGVwcyk7CisJaWYgKHJldCkgeworCQltdXRleF91bmxvY2soJnBm ZGV2LT5zY2hlZF9sb2NrKTsKKwkJZ290byB1bmxvY2s7CisJfQogCi0JcGFuZnJvc3RfYWNxdWly ZV9vYmplY3RfZmVuY2VzKGpvYi0+Ym9zLCBqb2ItPmJvX2NvdW50LAotCQkJCSAgICAgICBqb2It PmltcGxpY2l0X2ZlbmNlcyk7CisJa3JlZl9nZXQoJmpvYi0+cmVmY291bnQpOyAvKiBwdXQgYnkg c2NoZWR1bGVyIGpvYiBjb21wbGV0aW9uICovCiAKIAlkcm1fc2NoZWRfZW50aXR5X3B1c2hfam9i KCZqb2ItPmJhc2UsIGVudGl0eSk7CiAKQEAgLTI2MiwxOCArMjczLDE1IEBAIHN0YXRpYyB2b2lk IHBhbmZyb3N0X2pvYl9jbGVhbnVwKHN0cnVjdCBrcmVmICpyZWYpCiB7CiAJc3RydWN0IHBhbmZy b3N0X2pvYiAqam9iID0gY29udGFpbmVyX29mKHJlZiwgc3RydWN0IHBhbmZyb3N0X2pvYiwKIAkJ CQkJCXJlZmNvdW50KTsKKwlzdHJ1Y3QgZG1hX2ZlbmNlICpmZW5jZTsKKwl1bnNpZ25lZCBsb25n IGluZGV4OwogCXVuc2lnbmVkIGludCBpOwogCi0JaWYgKGpvYi0+aW5fZmVuY2VzKSB7Ci0JCWZv ciAoaSA9IDA7IGkgPCBqb2ItPmluX2ZlbmNlX2NvdW50OyBpKyspCi0JCQlkbWFfZmVuY2VfcHV0 KGpvYi0+aW5fZmVuY2VzW2ldKTsKLQkJa3ZmcmVlKGpvYi0+aW5fZmVuY2VzKTsKLQl9Ci0JaWYg KGpvYi0+aW1wbGljaXRfZmVuY2VzKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBqb2ItPmJvX2NvdW50 OyBpKyspCi0JCQlkbWFfZmVuY2VfcHV0KGpvYi0+aW1wbGljaXRfZmVuY2VzW2ldKTsKLQkJa3Zm cmVlKGpvYi0+aW1wbGljaXRfZmVuY2VzKTsKKwl4YV9mb3JfZWFjaCgmam9iLT5kZXBzLCBpbmRl eCwgZmVuY2UpIHsKKwkJZG1hX2ZlbmNlX3B1dChmZW5jZSk7CiAJfQorCXhhX2Rlc3Ryb3koJmpv Yi0+ZGVwcyk7CisKIAlkbWFfZmVuY2VfcHV0KGpvYi0+ZG9uZV9mZW5jZSk7CiAJZG1hX2ZlbmNl X3B1dChqb2ItPnJlbmRlcl9kb25lX2ZlbmNlKTsKIApAQCAtMzE2LDI2ICszMjQsOSBAQCBzdGF0 aWMgc3RydWN0IGRtYV9mZW5jZSAqcGFuZnJvc3Rfam9iX2RlcGVuZGVuY3koc3RydWN0IGRybV9z Y2hlZF9qb2IgKnNjaGVkX2pvYgogCQkJCQkJIHN0cnVjdCBkcm1fc2NoZWRfZW50aXR5ICpzX2Vu dGl0eSkKIHsKIAlzdHJ1Y3QgcGFuZnJvc3Rfam9iICpqb2IgPSB0b19wYW5mcm9zdF9qb2Ioc2No ZWRfam9iKTsKLQlzdHJ1Y3QgZG1hX2ZlbmNlICpmZW5jZTsKLQl1bnNpZ25lZCBpbnQgaTsKLQot CS8qIEV4cGxpY2l0IGZlbmNlcyAqLwotCWZvciAoaSA9IDA7IGkgPCBqb2ItPmluX2ZlbmNlX2Nv dW50OyBpKyspIHsKLQkJaWYgKGpvYi0+aW5fZmVuY2VzW2ldKSB7Ci0JCQlmZW5jZSA9IGpvYi0+ aW5fZmVuY2VzW2ldOwotCQkJam9iLT5pbl9mZW5jZXNbaV0gPSBOVUxMOwotCQkJcmV0dXJuIGZl bmNlOwotCQl9Ci0JfQogCi0JLyogSW1wbGljaXQgZmVuY2VzLCBtYXguIG9uZSBwZXIgQk8gKi8K LQlmb3IgKGkgPSAwOyBpIDwgam9iLT5ib19jb3VudDsgaSsrKSB7Ci0JCWlmIChqb2ItPmltcGxp Y2l0X2ZlbmNlc1tpXSkgewotCQkJZmVuY2UgPSBqb2ItPmltcGxpY2l0X2ZlbmNlc1tpXTsKLQkJ CWpvYi0+aW1wbGljaXRfZmVuY2VzW2ldID0gTlVMTDsKLQkJCXJldHVybiBmZW5jZTsKLQkJfQot CX0KKwlpZiAoIXhhX2VtcHR5KCZqb2ItPmRlcHMpKQorCQlyZXR1cm4geGFfZXJhc2UoJmpvYi0+ ZGVwcywgam9iLT5sYXN0X2RlcCsrKTsKIAogCXJldHVybiBOVUxMOwogfQpkaWZmIC0tZ2l0IGEv ZHJpdmVycy9ncHUvZHJtL3BhbmZyb3N0L3BhbmZyb3N0X2pvYi5oIGIvZHJpdmVycy9ncHUvZHJt L3BhbmZyb3N0L3BhbmZyb3N0X2pvYi5oCmluZGV4IGJiZDNiYTk3ZmY2Ny4uODIzMDZhMDNiNTdl IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcGFuZnJvc3QvcGFuZnJvc3Rfam9iLmgKKysr IGIvZHJpdmVycy9ncHUvZHJtL3BhbmZyb3N0L3BhbmZyb3N0X2pvYi5oCkBAIC0xOSw5ICsxOSw5 IEBAIHN0cnVjdCBwYW5mcm9zdF9qb2IgewogCXN0cnVjdCBwYW5mcm9zdF9kZXZpY2UgKnBmZGV2 OwogCXN0cnVjdCBwYW5mcm9zdF9maWxlX3ByaXYgKmZpbGVfcHJpdjsKIAotCS8qIE9wdGlvbmFs IGZlbmNlcyB1c2Vyc3BhY2UgY2FuIHBhc3MgaW4gZm9yIHRoZSBqb2IgdG8gZGVwZW5kIG9uLiAq LwotCXN0cnVjdCBkbWFfZmVuY2UgKippbl9mZW5jZXM7Ci0JdTMyIGluX2ZlbmNlX2NvdW50Owor CS8qIENvbnRhaW5zIGJvdGggZXhwbGljaXQgYW5kIGltcGxpY2l0IGZlbmNlcyAqLworCXN0cnVj dCB4YXJyYXkgZGVwczsKKwl1bnNpZ25lZCBsb25nIGxhc3RfZGVwOwogCiAJLyogRmVuY2UgdG8g YmUgc2lnbmFsZWQgYnkgSVJRIGhhbmRsZXIgd2hlbiB0aGUgam9iIGlzIGNvbXBsZXRlLiAqLwog CXN0cnVjdCBkbWFfZmVuY2UgKmRvbmVfZmVuY2U7CkBAIC0zMCw4ICszMCw2IEBAIHN0cnVjdCBw YW5mcm9zdF9qb2IgewogCV9fdTMyIHJlcXVpcmVtZW50czsKIAlfX3UzMiBmbHVzaF9pZDsKIAot CS8qIEV4Y2x1c2l2ZSBmZW5jZXMgd2UgaGF2ZSB0YWtlbiBmcm9tIHRoZSBCT3MgdG8gd2FpdCBm b3IgKi8KLQlzdHJ1Y3QgZG1hX2ZlbmNlICoqaW1wbGljaXRfZmVuY2VzOwogCXN0cnVjdCBwYW5m cm9zdF9nZW1fbWFwcGluZyAqKm1hcHBpbmdzOwogCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqKmJv czsKIAl1MzIgYm9fY291bnQ7Ci0tIAoyLjMyLjAucmMyCgpfX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBsaXN0CkludGVsLWdm eEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFp bG1hbi9saXN0aW5mby9pbnRlbC1nZngK