Received: by 2002:ac0:aa62:0:0:0:0:0 with SMTP id w31-v6csp2235885ima; Thu, 25 Oct 2018 11:41:00 -0700 (PDT) X-Google-Smtp-Source: AJdET5cFhK6cfFkms7eAwNOVLJdmmjg1zK+wcyTAxOfvorqHAYVXCFgKoiCOBY4G+DxZN1qVwICh X-Received: by 2002:a63:7418:: with SMTP id p24mr329482pgc.196.1540492860195; Thu, 25 Oct 2018 11:41:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1540492860; cv=none; d=google.com; s=arc-20160816; b=sOaTmXtTsXWGxEhFWTq4YWbpCIEt67/L/QHgbttB3wSEue3Ab+v+7t5d+O3JePrh5p oxxjxTG93CzxmCp02L+8CungFg7Ap1amhZ+egKfLtzbiSabsc+BfjiXepJt9uCx3Fu9x 6X0LHbaJ8oK9keXO/1pXgyssc917pxf2huT/CPiG28h71VscfqxLyD+6kuKmEjAXlN0B X18qygVlYyZ1LFtQTI2knJKRZOWEZgcEoO0hz58Ic92OfcdRQpiTpLXwSuvJmiAbQBdh ZwY1wCoUmDJnqPpqbJC1+KhpNg5gWc4b60kuBpE4p9qTvUWk0hk8XM2mwZTIm6haXjqi Mi3A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=lq/xri9iNXrd+ukCJUwWehWuPJ0O38+zpfrp1asI65g=; b=xsNscIQUT4dF/OZjHrNSjC+/4adDWeeslfg4BZl15kTm11GKMmCEgkk4JNssNCdPO6 2Vw7QtUBpPvgptkcTAbAoXFtbIdFV7zkwSH4595vKfNW4iQuwmCalzkNGEDhREslMGgL vdDyv3fLw62QpjUzGG0oqRmsKwW1bwJ7FeoXlCBX0fHM+JTNzT2Hwf7LsM0gv4XSeFXK 0awTmk4dnrJIZ+dLjgqMQ2ienB1FZ9DysC+sxsMwjllN8kpMtmYgqgporePNyoEnzUXy O0DPN+HMnUzpouu7TGKvci8ZyFrAF0faXDUe0+1WItOk61CBUZSnWuqKRHezbYxP1hW6 jDpw== 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=collabora.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 31-v6si8352899plk.329.2018.10.25.11.40.44; Thu, 25 Oct 2018 11:41:00 -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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=collabora.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727606AbeJZDMD (ORCPT + 99 others); Thu, 25 Oct 2018 23:12:03 -0400 Received: from bhuna.collabora.co.uk ([46.235.227.227]:43620 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727465AbeJZDLl (ORCPT ); Thu, 25 Oct 2018 23:11:41 -0400 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: robertfoss) with ESMTPSA id 2685A279673 From: Robert Foss To: airlied@linux.ie, kraxel@redhat.com, dri-devel@lists.freedesktop.org, virtualization@lists.linux-foundation.org, linux-kernel@vger.kernel.org, Rob Herring , Gustavo Padovan , Emil Velikov Cc: Robert Foss Subject: [PATCH 3/5] drm/virtio: add in-fences support for explicit synchronization Date: Thu, 25 Oct 2018 20:37:37 +0200 Message-Id: <20181025183739.9375-4-robert.foss@collabora.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181025183739.9375-1-robert.foss@collabora.com> References: <20181025183739.9375-1-robert.foss@collabora.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Gustavo Padovan When the execbuf call receives an in-fence it will get the dma_fence related to that fence fd and wait on it before submitting the draw call. Signed-off-by: Gustavo Padovan Signed-off-by: Robert Foss Suggested-by: Rob Herring --- drivers/gpu/drm/virtio/virtgpu_ioctl.c | 43 ++++++++++++++++++++------ 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/virtio/virtgpu_ioctl.c b/drivers/gpu/drm/virtio/virtgpu_ioctl.c index 1af289b28fc4..0368195966aa 100644 --- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c +++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c @@ -28,6 +28,7 @@ #include #include #include +#include #include "virtgpu_drv.h" @@ -114,6 +115,8 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data, struct ttm_validate_buffer *buflist = NULL; int i; struct ww_acquire_ctx ticket; + struct dma_fence *in_fence = NULL; + int in_fence_fd = exbuf->fence_fd; void *buf; exbuf->fence_fd = -1; @@ -124,6 +127,22 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data, if ((exbuf->flags & ~VIRTGPU_EXECBUF_FLAGS)) return -EINVAL; + if (exbuf->flags & VIRTGPU_EXECBUF_FENCE_FD_IN) { + in_fence = sync_file_get_fence(in_fence_fd); + if (!in_fence) + return -EINVAL; + + /* + * Wait if the fence is from a foreign context, or if the fence + * array contains any fence from a foreign context. + */ + if (!dma_fence_match_context(in_fence, vgdev->fence_drv.context)) { + ret = dma_fence_wait(in_fence, true); + if (ret) + return ret; + } + } + INIT_LIST_HEAD(&validate_list); if (exbuf->num_bo_handles) { @@ -133,26 +152,22 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data, sizeof(struct ttm_validate_buffer), GFP_KERNEL | __GFP_ZERO); if (!bo_handles || !buflist) { - kvfree(bo_handles); - kvfree(buflist); - return -ENOMEM; + ret = -ENOMEM; + goto out_in_fence; } user_bo_handles = (void __user *)(uintptr_t)exbuf->bo_handles; if (copy_from_user(bo_handles, user_bo_handles, exbuf->num_bo_handles * sizeof(uint32_t))) { ret = -EFAULT; - kvfree(bo_handles); - kvfree(buflist); - return ret; + goto out_in_fence; } for (i = 0; i < exbuf->num_bo_handles; i++) { gobj = drm_gem_object_lookup(drm_file, bo_handles[i]); if (!gobj) { - kvfree(bo_handles); - kvfree(buflist); - return -ENOENT; + ret = -ENOENT; + goto out_in_fence; } qobj = gem_to_virtio_gpu_obj(gobj); @@ -161,6 +176,7 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data, list_add(&buflist[i].head, &validate_list); } kvfree(bo_handles); + bo_handles = NULL; } ret = virtio_gpu_object_list_validate(&ticket, &validate_list); @@ -180,6 +196,12 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data, ret = -ENOMEM; goto out_unresv; } + + if (in_fence) { + dma_fence_put(in_fence); + in_fence = NULL; + } + virtio_gpu_cmd_submit(vgdev, buf, exbuf->size, vfpriv->ctx_id, fence); @@ -195,7 +217,10 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data, ttm_eu_backoff_reservation(&ticket, &validate_list); out_free: virtio_gpu_unref_list(&validate_list); +out_in_fence: + kvfree(bo_handles); kvfree(buflist); + dma_fence_put(in_fence); return ret; } -- 2.17.1