Received: by 2002:a25:ab43:0:0:0:0:0 with SMTP id u61csp1543994ybi; Wed, 19 Jun 2019 23:08:37 -0700 (PDT) X-Google-Smtp-Source: APXvYqy0rkfNwpeZHCZ8m7C3i73R506kCl2woObTe6RepQ0m/LCW3nbtBAutemDeNpBpEM2LDeRh X-Received: by 2002:aa7:91c5:: with SMTP id z5mr37028629pfa.34.1561010917356; Wed, 19 Jun 2019 23:08:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1561010917; cv=none; d=google.com; s=arc-20160816; b=xtmqDC3IrNPbCb3MRS/UPimNPdtXKzBI6hwPLmvGO65CsgFgBKuu3hdMFZDg3Ml+eK OeMAroseQU7chP+NWuCFfrrw+vA7sp8NtUeetrTaCdxspKs7+igAf9vTJJli6lEjvwOg eEGI0gr0Irczm9wD74tGbrCLXRL5iAACTqzBaI/UfDNav2f2kh/zZT6balo6IcX3++3+ s4/JfjqJsAnBBDIM6ZYyAFA0qO0oAlGIYv78jcP4iMm/X1bhWSw+9FLUOw0DTusHAlOc b9fivUQGTPkEa9ylHOZa5VyxWLn/e6vXkfvKJ8sDsRfYSbTZ/Ii4BHLNdLVlA+WGw2wz 2Wng== 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=fK260mR2pI0CBm9ttXFK/PHh/z1n5bwvcsmcEku0GJA=; b=mihmH+CjX/WZM+AEUW/7OBcga8dBSqClSyhp8HpmQRRgL63pUeKwOjHtw1m8m/hHzY XuNKTJs5DSh0ZNqx4jp4LBlhG/jvDgw/wjV9+zFUHWeUQewXQVV+B5MTyZU+PLYwCy9L 9uWbLlZItSpKVWjmmt3ZXdbbLl/TKYcH8gAOnyHlen5Z2QCHw1CVDYDIydekVu+4a0vM haG24y0FM9inmpqg5RuNbX/VkTLzPsYBOu8FNsl0Ha9z/js7kki9NN3Y7t07IXJyZqag j9fM5+CDURF26SdXI+siAwjWlBrb3kdTtXe3Zfz/0DbBbADbL5U7eixG+p6Q3dJ2Ywrq pINg== 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=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h7si17580132plr.5.2019.06.19.23.08.21; Wed, 19 Jun 2019 23:08:37 -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=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730605AbfFTGH5 (ORCPT + 99 others); Thu, 20 Jun 2019 02:07:57 -0400 Received: from mx1.redhat.com ([209.132.183.28]:46922 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726442AbfFTGHi (ORCPT ); Thu, 20 Jun 2019 02:07:38 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 48EB37F746; Thu, 20 Jun 2019 06:07:32 +0000 (UTC) Received: from sirius.home.kraxel.org (ovpn-116-212.ams2.redhat.com [10.36.116.212]) by smtp.corp.redhat.com (Postfix) with ESMTP id BE0D260477; Thu, 20 Jun 2019 06:07:30 +0000 (UTC) Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id 5AF241753C; Thu, 20 Jun 2019 08:07:27 +0200 (CEST) From: Gerd Hoffmann To: dri-devel@lists.freedesktop.org Cc: Gerd Hoffmann , David Airlie , Daniel Vetter , virtualization@lists.linux-foundation.org (open list:VIRTIO GPU DRIVER), linux-kernel@vger.kernel.org (open list) Subject: [PATCH v4 09/12] drm/virtio: rework virtio_gpu_object_create fencing Date: Thu, 20 Jun 2019 08:07:23 +0200 Message-Id: <20190620060726.926-10-kraxel@redhat.com> In-Reply-To: <20190620060726.926-1-kraxel@redhat.com> References: <20190620060726.926-1-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Thu, 20 Jun 2019 06:07:37 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Use gem reservation helpers and direct reservation_object_* calls instead of ttm. v3: Due to using the gem reservation object it is initialized and ready for use before calling ttm_bo_init, so we can also drop the tricky fence logic which checks whenever the command is in flight still. We can simply fence our object before submitting the virtio command and be done with it. Signed-off-by: Gerd Hoffmann Acked-by: Daniel Vetter --- drivers/gpu/drm/virtio/virtgpu_drv.h | 6 ++- drivers/gpu/drm/virtio/virtgpu_object.c | 54 +++++++++---------------- drivers/gpu/drm/virtio/virtgpu_vq.c | 8 +++- 3 files changed, 30 insertions(+), 38 deletions(-) diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h index 65f5ce41c341..5213d7f499eb 100644 --- a/drivers/gpu/drm/virtio/virtgpu_drv.h +++ b/drivers/gpu/drm/virtio/virtgpu_drv.h @@ -267,7 +267,8 @@ void virtio_gpu_free_vbufs(struct virtio_gpu_device *vgdev); void virtio_gpu_cmd_create_resource(struct virtio_gpu_device *vgdev, struct virtio_gpu_object *bo, struct virtio_gpu_object_params *params, - struct virtio_gpu_fence *fence); + struct virtio_gpu_fence *fence, + struct virtio_gpu_object_array *objs); void virtio_gpu_cmd_unref_resource(struct virtio_gpu_device *vgdev, uint32_t resource_id); void virtio_gpu_cmd_transfer_to_host_2d(struct virtio_gpu_device *vgdev, @@ -328,7 +329,8 @@ void virtio_gpu_cmd_resource_create_3d(struct virtio_gpu_device *vgdev, struct virtio_gpu_object *bo, struct virtio_gpu_object_params *params, - struct virtio_gpu_fence *fence); + struct virtio_gpu_fence *fence, + struct virtio_gpu_object_array *objs); void virtio_gpu_ctrl_ack(struct virtqueue *vq); void virtio_gpu_cursor_ack(struct virtqueue *vq); void virtio_gpu_fence_ack(struct virtqueue *vq); diff --git a/drivers/gpu/drm/virtio/virtgpu_object.c b/drivers/gpu/drm/virtio/virtgpu_object.c index 82bfbf983fd2..90642907aa5c 100644 --- a/drivers/gpu/drm/virtio/virtgpu_object.c +++ b/drivers/gpu/drm/virtio/virtgpu_object.c @@ -97,6 +97,7 @@ int virtio_gpu_object_create(struct virtio_gpu_device *vgdev, struct virtio_gpu_object **bo_ptr, struct virtio_gpu_fence *fence) { + struct virtio_gpu_object_array *objs = NULL; struct virtio_gpu_object *bo; size_t acc_size; int ret; @@ -123,10 +124,27 @@ int virtio_gpu_object_create(struct virtio_gpu_device *vgdev, } bo->dumb = params->dumb; + if (fence) { + struct ww_acquire_ctx ticket; + + objs = virtio_gpu_array_alloc(1); + objs->objs[0] = &bo->gem_base; + drm_gem_object_get(objs->objs[0]); + + ret = drm_gem_lock_reservations(objs->objs, objs->nents, + &ticket); + if (ret == 0) + reservation_object_add_excl_fence(objs->objs[0]->resv, + &fence->f); + drm_gem_unlock_reservations(objs->objs, objs->nents, &ticket); + } + if (params->virgl) { - virtio_gpu_cmd_resource_create_3d(vgdev, bo, params, fence); + virtio_gpu_cmd_resource_create_3d(vgdev, bo, params, + fence, objs); } else { - virtio_gpu_cmd_create_resource(vgdev, bo, params, fence); + virtio_gpu_cmd_create_resource(vgdev, bo, params, + fence, objs); } virtio_gpu_init_ttm_placement(bo); @@ -139,38 +157,6 @@ int virtio_gpu_object_create(struct virtio_gpu_device *vgdev, if (ret != 0) return ret; - if (fence) { - struct virtio_gpu_fence_driver *drv = &vgdev->fence_drv; - struct list_head validate_list; - struct ttm_validate_buffer mainbuf; - struct ww_acquire_ctx ticket; - unsigned long irq_flags; - bool signaled; - - INIT_LIST_HEAD(&validate_list); - memset(&mainbuf, 0, sizeof(struct ttm_validate_buffer)); - - /* use a gem reference since unref list undoes them */ - drm_gem_object_get(&bo->gem_base); - mainbuf.bo = &bo->tbo; - list_add(&mainbuf.head, &validate_list); - - ret = virtio_gpu_object_list_validate(&ticket, &validate_list); - if (ret == 0) { - spin_lock_irqsave(&drv->lock, irq_flags); - signaled = virtio_fence_signaled(&fence->f); - if (!signaled) - /* virtio create command still in flight */ - ttm_eu_fence_buffer_objects(&ticket, &validate_list, - &fence->f); - spin_unlock_irqrestore(&drv->lock, irq_flags); - if (signaled) - /* virtio create command finished */ - ttm_eu_backoff_reservation(&ticket, &validate_list); - } - virtio_gpu_unref_list(&validate_list); - } - *bo_ptr = bo; return 0; } diff --git a/drivers/gpu/drm/virtio/virtgpu_vq.c b/drivers/gpu/drm/virtio/virtgpu_vq.c index dc2c2c003200..6e2b287a7e4b 100644 --- a/drivers/gpu/drm/virtio/virtgpu_vq.c +++ b/drivers/gpu/drm/virtio/virtgpu_vq.c @@ -391,13 +391,15 @@ static int virtio_gpu_queue_cursor(struct virtio_gpu_device *vgdev, void virtio_gpu_cmd_create_resource(struct virtio_gpu_device *vgdev, struct virtio_gpu_object *bo, struct virtio_gpu_object_params *params, - struct virtio_gpu_fence *fence) + struct virtio_gpu_fence *fence, + struct virtio_gpu_object_array *objs) { struct virtio_gpu_resource_create_2d *cmd_p; struct virtio_gpu_vbuffer *vbuf; cmd_p = virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p)); memset(cmd_p, 0, sizeof(*cmd_p)); + vbuf->objs = objs; cmd_p->hdr.type = cpu_to_le32(VIRTIO_GPU_CMD_RESOURCE_CREATE_2D); cmd_p->resource_id = cpu_to_le32(bo->hw_res_handle); @@ -864,13 +866,15 @@ void virtio_gpu_cmd_resource_create_3d(struct virtio_gpu_device *vgdev, struct virtio_gpu_object *bo, struct virtio_gpu_object_params *params, - struct virtio_gpu_fence *fence) + struct virtio_gpu_fence *fence, + struct virtio_gpu_object_array *objs) { struct virtio_gpu_resource_create_3d *cmd_p; struct virtio_gpu_vbuffer *vbuf; cmd_p = virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p)); memset(cmd_p, 0, sizeof(*cmd_p)); + vbuf->objs = objs; cmd_p->hdr.type = cpu_to_le32(VIRTIO_GPU_CMD_RESOURCE_CREATE_3D); cmd_p->resource_id = cpu_to_le32(bo->hw_res_handle); -- 2.18.1