Received: by 2002:a25:f815:0:0:0:0:0 with SMTP id u21csp1476358ybd; Wed, 26 Jun 2019 18:46:29 -0700 (PDT) X-Google-Smtp-Source: APXvYqx6fBXFAfWyT0cA7XGF1w7MuHYdsZpwMrlut35kS77qWrriD4/8xmg7P4Nsg78qpaMeLMm+ X-Received: by 2002:a17:902:d891:: with SMTP id b17mr1441352plz.48.1561599989401; Wed, 26 Jun 2019 18:46:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1561599989; cv=none; d=google.com; s=arc-20160816; b=iWKWdRfxzz6bO3gCmpsMFtbAlV4QiD8fmS8PXYvDC3bXC9SRIb9Ps7O2n7Ocpq/DDj M0+8DQNpXHRnJShhazSQbVD7wcXLN7WfRsUmHSJzYQHdRHoFk/BZswkSXXMmVxwz299i GF0X4jITK5NlS3Y4CAFlPaasn0Sz7F4hTcIzpXUWkKJZw5zQUWPW/OuPWf7lk9C4QCVQ CRVo0sfzUyoi8/xOmlA0uZYHB09e64b1yVFwzGeJChhz0ERa4VIhs3wAXXXSIMVYlthP aBaYmpUBLVuOwoI7n6Kh89lgCOz+W0S1udkW4pnOv8wmUtCG3vSJZXEwY9ZH26+yIFWs 1WdQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=IVLoUld7/lLKRDbgWpz0xiwtJpJGN7k4zpCN89qfViE=; b=PUW1XcD5VTImyAFWfbdKe7ZFYVBwSRVuOULbGF5M6TE9WyVPBv/XBCnv2Zd2sXN8gZ +Lc2MUjM0HA2oz6MEcMxkArWRrjyJYs5GEgI3fB8MQi4NNbNv7nTuEY1lDK68MyhCVtP Akrn0o+wwBq83vfocdMcYDeWIZjJb658CuKB37oaUSHloh9pw+rIZlB4W4jaBGg1YTs4 5gCZC7gPLsX3VsgwZlw03t4hOopqnH/DfQuNaupe20EWHjiABNrWwkXFf+N1shSAbRga wnGOGxc9toDgNGU9DMTpHk7l9LcIaRxiy0BHb8VkwyZ7lpv8FkBZmoT5M0eIdEbokBSJ xPvg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=byaCzKT3; 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=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id r12si3371041pjp.56.2019.06.26.18.46.13; Wed, 26 Jun 2019 18:46:29 -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; dkim=pass header.i=@gmail.com header.s=20161025 header.b=byaCzKT3; 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=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726835AbfF0BoT (ORCPT + 99 others); Wed, 26 Jun 2019 21:44:19 -0400 Received: from mail-io1-f68.google.com ([209.85.166.68]:43849 "EHLO mail-io1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726677AbfF0BoS (ORCPT ); Wed, 26 Jun 2019 21:44:18 -0400 Received: by mail-io1-f68.google.com with SMTP id k20so1093654ios.10 for ; Wed, 26 Jun 2019 18:44:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=IVLoUld7/lLKRDbgWpz0xiwtJpJGN7k4zpCN89qfViE=; b=byaCzKT3UVddOch9VFfpQbxefGQOoI6Z9Axaqzm7YnqZhjK98Tp70vnm+wE6BndkP1 poXW0TaHsRcTu2zhHnFXuo1H1/AyhtUhodfFc8CKHoSi05OmD/vHm5RLikKe1ju/zud7 tz6+N3lcXwYoVVJntjMHWfaFpbIkxT1LBETSuJdxbv3P0hGRuJB1k2Z3tHsElCT753pf au1kOlJehQvXzJO2EBWOkGvYeJIcC4YXBx8hZD5wvhn+TWd4b+lYu4MsM6qlBrWcxwvH Rzu+Q/NsFfltFQsTM+XKVxwZeUQ0w6tf4gaIqsZQBOhogdHBycCZ5ISJF7vLDm+jzXio kU+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=IVLoUld7/lLKRDbgWpz0xiwtJpJGN7k4zpCN89qfViE=; b=MX7KgNG+rdUvfYlkbh6wONlOfHFsKEJGf2jrTOxeH00T3EGSreOq8Mhkx4NfQIk312 IcqH4ocpUjn00lAgzhHNBX0CkEahzZTNaHQUh7jT7hjxpgBSvr69VZuw9CetiBs6Zv2W fEZ54AgybJqUC2nMP9yJvBGTjOkwhZ6CZbkhTuVcComMRqpddVtrcZx/eOLFsDl/FKsU b3/tE3iy/CM6C4LS9xrpQcmoT/wBuZbfLq2rgElqlwOdWgeFw6nbFA0SYMe8uYKgiSlZ yfeVcHWLMwMUcTztFC2vVVfvnkCC5PUhCgR0APQ3AqK8tkR8tvF98qcKdUDi4S9tz/3e Ee5A== X-Gm-Message-State: APjAAAVG2u0QY8IK+GzZB09dlLo6UzQEjMT6grQ4A+4opy9Minj61EoR 16bpxFl2t3L1e2fp1i+ffme9v19+kr6GdStfYnzkhsjL X-Received: by 2002:a5d:8e08:: with SMTP id e8mr1577465iod.139.1561599857443; Wed, 26 Jun 2019 18:44:17 -0700 (PDT) MIME-Version: 1.0 References: <20190620060726.926-1-kraxel@redhat.com> <20190620060726.926-10-kraxel@redhat.com> In-Reply-To: <20190620060726.926-10-kraxel@redhat.com> From: Chia-I Wu Date: Wed, 26 Jun 2019 18:44:06 -0700 Message-ID: Subject: Re: [PATCH v4 09/12] drm/virtio: rework virtio_gpu_object_create fencing To: Gerd Hoffmann Cc: ML dri-devel , David Airlie , open list , "open list:VIRTIO GPU DRIVER" Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Jun 19, 2019 at 11:07 PM Gerd Hoffmann wrote: > > 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); Move objs before fence? > 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); With only one object, we should be able to do a quick reservation_object_lock_interruptible. > + if (ret == 0) > + reservation_object_add_excl_fence(objs->objs[0]->resv, > + &fence->f); > + drm_gem_unlock_reservations(objs->objs, objs->nents, &ticket); These may need to be moved to after virtio_gpu_cmd_resource_create_3d. > + } > + > 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 > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel