Received: by 2002:ac0:aa62:0:0:0:0:0 with SMTP id w31-v6csp2233770ima; Thu, 25 Oct 2018 11:38:35 -0700 (PDT) X-Google-Smtp-Source: AJdET5eZdDIebMrlCdZ1n7zpee/4aB3wSNELMXAumrjLVUrU9bl9fXxGp+HYLNUWwwm1xF6l85XB X-Received: by 2002:a62:b90f:: with SMTP id z15-v6mr323759pfe.171.1540492715932; Thu, 25 Oct 2018 11:38:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1540492715; cv=none; d=google.com; s=arc-20160816; b=UI2j3RCsFipD8uDxjTDo50hQ++34Ms3kwmcxHXB2u3LuBGCNpaHjBTsvgtDG3X2Vc3 IJGZOlENRYZ8zsIt5mNMtYEldfLnPTqAs9yVZQ3vZkFZZbY64AEsp2QV/dBDyp8HSHso JqA0HqJkS3lY/fj3D7Gb19KZyhevNV7lzolHMXnA70SrG4azTkKJZ9K5KkWUJcVA5OdH u93bzympT6xpBaKXKoXan01bi0o8RV5rlI9WLj2mYwt5kT3VWu8p5CXJd+R6XPSZWCzG XZkLzG8+yIUGlFeIBwj9p9y3vFE3Qg2URiy5pG0plH5g8B6vsdC1eu6n77WdUgCbsxrh g99w== 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=j9tlx2NVySqIlI5nBQIOPbSPPwVb6QC/oEA7w8onOJc=; b=aSZaBdUg21Lq9WLiY0Fx15ArsdY5XkLrqgCEhLx71eqXmPold+YQ+VrJVTNRTcChNr uaxl9GkdM7T5sDatDA+CSH49vRcPxGLYI4GcC5kbPkCv6WMbK6qHr7SBetF7V83UrOUy 00JmAlap8zdDxDjqnrH121vX6u4rhGWGQy2JoRL+dAUqGq8j9g4Ni/YMc3BG0o8mHVkm zu1ePyJgUfWwOgErrvAGAgJ/fDh8vOu9wlWxeZEp1itQNRW8957S4Qyz8RF4ezsVKSaR 68KH/VHKFJUkyef13XfDLqeYgmel/r+TswqwZc9yz/F4fLBzIJKL4XTh/xhdpVSF5oXk YPfw== 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 i66-v6si9036897pfc.173.2018.10.25.11.38.19; Thu, 25 Oct 2018 11:38:35 -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 S1727696AbeJZDLo (ORCPT + 99 others); Thu, 25 Oct 2018 23:11:44 -0400 Received: from bhuna.collabora.co.uk ([46.235.227.227]:43632 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727615AbeJZDLm (ORCPT ); Thu, 25 Oct 2018 23:11:42 -0400 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: robertfoss) with ESMTPSA id 9B3BF27A4BE 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 4/5] drm/virtio: add out-fences support for explicit synchronization Date: Thu, 25 Oct 2018 20:37:38 +0200 Message-Id: <20181025183739.9375-5-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 On the out-fence side we get fence returned by the submitted draw call and attach it to a sync_file and send the sync_file fd to userspace. On error -1 is returned to userspace. Signed-off-by: Gustavo Padovan Signed-off-by: Robert Foss Suggested-by: Rob Herring --- drivers/gpu/drm/virtio/virtgpu_ioctl.c | 50 +++++++++++++++++++------- 1 file changed, 38 insertions(+), 12 deletions(-) diff --git a/drivers/gpu/drm/virtio/virtgpu_ioctl.c b/drivers/gpu/drm/virtio/virtgpu_ioctl.c index 0368195966aa..32e714a1c753 100644 --- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c +++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c @@ -106,7 +106,7 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data, struct virtio_gpu_device *vgdev = dev->dev_private; struct virtio_gpu_fpriv *vfpriv = drm_file->driver_priv; struct drm_gem_object *gobj; - struct virtio_gpu_fence *fence; + struct virtio_gpu_fence *out_fence; struct virtio_gpu_object *qobj; int ret; uint32_t *bo_handles = NULL; @@ -116,7 +116,9 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data, int i; struct ww_acquire_ctx ticket; struct dma_fence *in_fence = NULL; + struct sync_file *sync_file; int in_fence_fd = exbuf->fence_fd; + int out_fence_fd = -1; void *buf; exbuf->fence_fd = -1; @@ -143,6 +145,14 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data, } } + if (exbuf->flags & VIRTGPU_EXECBUF_FENCE_FD_OUT) { + out_fence_fd = get_unused_fd_flags(O_CLOEXEC); + if (out_fence_fd < 0) { + ret = out_fence_fd; + goto out_in_fence; + } + } + INIT_LIST_HEAD(&validate_list); if (exbuf->num_bo_handles) { @@ -153,21 +163,21 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data, GFP_KERNEL | __GFP_ZERO); if (!bo_handles || !buflist) { ret = -ENOMEM; - goto out_in_fence; + goto out_unused_fd; } 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; - goto out_in_fence; + goto out_unused_fd; } for (i = 0; i < exbuf->num_bo_handles; i++) { gobj = drm_gem_object_lookup(drm_file, bo_handles[i]); if (!gobj) { ret = -ENOENT; - goto out_in_fence; + goto out_unused_fd; } qobj = gem_to_virtio_gpu_obj(gobj); @@ -190,11 +200,22 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data, goto out_unresv; } - fence = virtio_gpu_fence_alloc(vgdev); - if (!fence) { - kfree(buf); + out_fence = virtio_gpu_fence_alloc(vgdev); + if(!out_fence) { ret = -ENOMEM; - goto out_unresv; + goto out_memdup; + } + + if (out_fence_fd >= 0) { + sync_file = sync_file_create(&out_fence->f); + if (!sync_file) { + dma_fence_put(&out_fence->f); + ret = -ENOMEM; + goto out_memdup; + } + + exbuf->fence_fd = out_fence_fd; + fd_install(out_fence_fd, sync_file->file); } if (in_fence) { @@ -203,23 +224,28 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data, } virtio_gpu_cmd_submit(vgdev, buf, exbuf->size, - vfpriv->ctx_id, fence); + vfpriv->ctx_id, out_fence); - ttm_eu_fence_buffer_objects(&ticket, &validate_list, &fence->f); + ttm_eu_fence_buffer_objects(&ticket, &validate_list, &out_fence->f); /* fence the command bo */ virtio_gpu_unref_list(&validate_list); kvfree(buflist); - dma_fence_put(&fence->f); return 0; +out_memdup: + kfree(buf); out_unresv: ttm_eu_backoff_reservation(&ticket, &validate_list); out_free: virtio_gpu_unref_list(&validate_list); -out_in_fence: +out_unused_fd: kvfree(bo_handles); kvfree(buflist); + + if (out_fence_fd >= 0) + put_unused_fd(out_fence_fd); +out_in_fence: dma_fence_put(in_fence); return ret; } -- 2.17.1