Received: by 2002:a25:ad19:0:0:0:0:0 with SMTP id y25csp1271572ybi; Sun, 30 Jun 2019 11:25:19 -0700 (PDT) X-Google-Smtp-Source: APXvYqwGRKOvf0soBwxKFKSdOmcUasDbZN4o0kTmO1jMQCSvfLDi5iT7XHjLw88Bj8CO1AHX9k2R X-Received: by 2002:a17:902:3a5:: with SMTP id d34mr24111302pld.239.1561919119702; Sun, 30 Jun 2019 11:25:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1561919119; cv=none; d=google.com; s=arc-20160816; b=JJC/e/MCRpWr0+8rm6vwhjmblX8eJJ1fQNhFw+0N6Y9Jf0cdPxdwtUb448JISHM6on 4YOaFPhG5GkN6rnw29De5REcdKkowkWHtokzRLU2e6Sj9AVaTib1i+CMsGtsEXDjje88 9vNs31PRe8dvoZT3LlwFLVsQnThR9D6prQgzgyXUii88itVylZFtKVWyOYy9oebZFXkq wmytAHRGFFgHLGtwyosWSm6HWZnKKHqix4M04fLD7tiVGzSBX8N4exAG7yABIJt6MdOC Rzxgry19tdl/J2HmjgQR2/xeuSNOtRYQu28BWEbChfJq1dHF+ZzujEgzt9c0elcFCdbh Lxvw== 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=thtzmkw13aDuZDygR3uiUylpyUs6othiMlPhmCe3nAU=; b=fA3WFLNeagJx6OsoRDiStoTeiX/QKGNpEzrZUUjq0w2DNXrqgBBfszruI1v/So5Ozp pIax/NvpW0Gdm6KFMl3AnxIhk1UxmNosCnCqXJkSM3x4mdu8ryknH6XjVH+7QKg6jGrR QlurYCD2x8xFVcLaE/XoMbYVigO3+68Wl7T0ubCHdrrCjQixUuDkWV2RA7Dz2fx29dqM rCDTHol4+FDAdKuec77OLzY3a/IwLQD1S9Hk8g9iHxQy0js6jsMDQfjXqNIEPk39UYyt MsRhqhCKSpHFv03n2AoA6tVawXPLn7ySUm4HdDRzE+PKu2vOtSoKF/Bj1XFQcokoo+Ju OKxg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=fCcbdXH9; 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 e18si8320487pjp.36.2019.06.30.11.25.03; Sun, 30 Jun 2019 11:25:19 -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=fCcbdXH9; 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 S1726793AbfF3SXC (ORCPT + 99 others); Sun, 30 Jun 2019 14:23:02 -0400 Received: from mail-io1-f65.google.com ([209.85.166.65]:40157 "EHLO mail-io1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726572AbfF3SXC (ORCPT ); Sun, 30 Jun 2019 14:23:02 -0400 Received: by mail-io1-f65.google.com with SMTP id n5so23565523ioc.7 for ; Sun, 30 Jun 2019 11:23:02 -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=thtzmkw13aDuZDygR3uiUylpyUs6othiMlPhmCe3nAU=; b=fCcbdXH9WO0fjnsX0cG4kMxd8kDGj9eP4YcIaQOOKv5Ozt5PxyEJ9hoY9qtJPyIvE0 aZjGB9sWgGskqozbUzllzSvwa4DUEZLCWfymAoZMXW2ouFATq/2lTaFbIw7kLnFhnpzk V9eRCBawjO47dljbxZq0vbv0t5s10P1Xhiw0f0HHRnE43pz0VKOxNMhuA8RpUF0SOI37 BjLZZcA99lc7C28BqRbFsGFeev9Rth5p3LfoH3pCa5upP52BFN7ysvpHqepK11WoY1TK IA6BA6Z6j+rjISDK5SQXLv9EQs/k7R6DulDG3DB+p39SUif2IV8lM6wvCOuJvO5PDl6x juhg== 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=thtzmkw13aDuZDygR3uiUylpyUs6othiMlPhmCe3nAU=; b=PUsulXkWTs+r/i0SSkvOimWTdE19R9wEHPVwRyO1eIA9vm8JVRZLXLGl+CI51G4EO9 mE3FngRK0QOso6bqwLGPkVLtlmB1c9rTGg5Kd+j8RA96oiPbZL/g+v9LyH45qBFLyDU5 BwxXWW9uST0cVFDrZeL+t+3NIdS0KxXe9D8+HmT2/GZc5VPfGp8p8eeqBvRnyc6g1ceS y8v9TD/8LCeuNrqkNY/zV3t9mhdIQkihABUKj66P8yFQ11FlGQXN8k3ENZw53VqKV/6c GxpEHC8OoqfMfOIy1AwazIwj7XwQ7rvWsokPwMtaJ1VB4+r2xY6bdnQ7JPX8/FilD1Dt 3plA== X-Gm-Message-State: APjAAAXJyoY+QhCqP5EsSgyqfhJd6bNkKOPQVv+H7NwzjWaku1JEPtAX 0xd99PPtHlu+a0o2hM1zhyMW5JRLdMenC0qUA2g= X-Received: by 2002:a5d:8e08:: with SMTP id e8mr23366852iod.139.1561918981319; Sun, 30 Jun 2019 11:23:01 -0700 (PDT) MIME-Version: 1.0 References: <20190628121338.24398-1-kraxel@redhat.com> <20190628121338.24398-10-kraxel@redhat.com> In-Reply-To: <20190628121338.24398-10-kraxel@redhat.com> From: Chia-I Wu Date: Sun, 30 Jun 2019 11:22:50 -0700 Message-ID: Subject: Re: [PATCH v5 09/12] drm/virtio: rework virtio_gpu_object_create fencing To: Gerd Hoffmann Cc: ML dri-devel , David Airlie , Daniel Vetter , "open list:VIRTIO GPU DRIVER" , open list 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 Fri, Jun 28, 2019 at 5:13 AM Gerd Hoffmann wrote: > > Use gem reservation helpers and direct reservation_object_* calls > instead of ttm. > > v5: fix fencing (Chia-I Wu). > 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 | 2 + > drivers/gpu/drm/virtio/virtgpu_object.c | 55 ++++++++++--------------- > drivers/gpu/drm/virtio/virtgpu_vq.c | 4 ++ > 3 files changed, 27 insertions(+), 34 deletions(-) > > diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h > index 356d27132388..c4b266b6f731 100644 > --- a/drivers/gpu/drm/virtio/virtgpu_drv.h > +++ b/drivers/gpu/drm/virtio/virtgpu_drv.h > @@ -267,6 +267,7 @@ 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_object_array *objs, > struct virtio_gpu_fence *fence); > void virtio_gpu_cmd_unref_resource(struct virtio_gpu_device *vgdev, > uint32_t resource_id); > @@ -329,6 +330,7 @@ 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_object_array *objs, > struct virtio_gpu_fence *fence); > void virtio_gpu_ctrl_ack(struct virtqueue *vq); > void virtio_gpu_cursor_ack(struct virtqueue *vq); > diff --git a/drivers/gpu/drm/virtio/virtgpu_object.c b/drivers/gpu/drm/virtio/virtgpu_object.c > index 82bfbf983fd2..fa0ea22c68b0 100644 > --- a/drivers/gpu/drm/virtio/virtgpu_object.c > +++ b/drivers/gpu/drm/virtio/virtgpu_object.c > @@ -97,7 +97,9 @@ 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; > + struct ww_acquire_ctx ticket; > size_t acc_size; > int ret; > > @@ -123,12 +125,29 @@ int virtio_gpu_object_create(struct virtio_gpu_device *vgdev, > } > bo->dumb = params->dumb; > > + if (fence) { > + 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); We can use virtio_gpu_object_reserve when there is only one object. > + if (ret == 0) > + reservation_object_add_excl_fence(objs->objs[0]->resv, > + &fence->f); Similar to in execbuffer, this might need to be moved to after virtio_gpu_cmd_resource_create_*. > + } > + > if (params->virgl) { > - virtio_gpu_cmd_resource_create_3d(vgdev, bo, params, fence); > + virtio_gpu_cmd_resource_create_3d(vgdev, bo, params, > + objs, fence); > } else { > - virtio_gpu_cmd_create_resource(vgdev, bo, params, fence); > + virtio_gpu_cmd_create_resource(vgdev, bo, params, > + objs, fence); > } > > + if (fence) > + drm_gem_unlock_reservations(objs->objs, objs->nents, &ticket); objs might have been freed. > + > virtio_gpu_init_ttm_placement(bo); > ret = ttm_bo_init(&vgdev->mman.bdev, &bo->tbo, params->size, > ttm_bo_type_device, &bo->placement, 0, > @@ -139,38 +158,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 0c87c3e086f8..0a735e51a803 100644 > --- a/drivers/gpu/drm/virtio/virtgpu_vq.c > +++ b/drivers/gpu/drm/virtio/virtgpu_vq.c > @@ -391,6 +391,7 @@ 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_object_array *objs, > struct virtio_gpu_fence *fence) > { > struct virtio_gpu_resource_create_2d *cmd_p; > @@ -398,6 +399,7 @@ void virtio_gpu_cmd_create_resource(struct virtio_gpu_device *vgdev, > > 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,6 +866,7 @@ 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_object_array *objs, > struct virtio_gpu_fence *fence) > { > struct virtio_gpu_resource_create_3d *cmd_p; > @@ -871,6 +874,7 @@ virtio_gpu_cmd_resource_create_3d(struct virtio_gpu_device *vgdev, > > 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 >