Gerd Hoffmann
2019-Jun-20 06:07 UTC
[PATCH v4 02/12] drm/virtio: switch virtio_gpu_wait_ioctl() to gem helper.
Use drm_gem_reservation_object_wait() in virtio_gpu_wait_ioctl(). This also makes the ioctl run lockless. v2: use reservation_object_test_signaled_rcu for VIRTGPU_WAIT_NOWAIT. Signed-off-by: Gerd Hoffmann <kraxel at redhat.com> Reviewed-by: Daniel Vetter <daniel.vetter at ffwll.ch> --- drivers/gpu/drm/virtio/virtgpu_ioctl.c | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/drivers/gpu/drm/virtio/virtgpu_ioctl.c b/drivers/gpu/drm/virtio/virtgpu_ioctl.c index ac60be9b5c19..313c770ea2c5 100644 --- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c +++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c @@ -464,23 +464,19 @@ static int virtio_gpu_wait_ioctl(struct drm_device *dev, void *data, struct drm_file *file) { struct drm_virtgpu_3d_wait *args = data; - struct drm_gem_object *gobj = NULL; - struct virtio_gpu_object *qobj = NULL; + struct drm_gem_object *obj; + long timeout = 15 * HZ; int ret; - bool nowait = false; - gobj = drm_gem_object_lookup(file, args->handle); - if (gobj == NULL) - return -ENOENT; + if (args->flags & VIRTGPU_WAIT_NOWAIT) { + obj = drm_gem_object_lookup(file, args->handle); + ret = reservation_object_test_signaled_rcu(obj->resv, true); + drm_gem_object_put_unlocked(obj); + return ret ? 0 : -EBUSY; + } - qobj = gem_to_virtio_gpu_obj(gobj); - - if (args->flags & VIRTGPU_WAIT_NOWAIT) - nowait = true; - ret = virtio_gpu_object_wait(qobj, nowait); - - drm_gem_object_put_unlocked(gobj); - return ret; + return drm_gem_reservation_object_wait(file, args->handle, + true, timeout); } static int virtio_gpu_get_caps_ioctl(struct drm_device *dev, -- 2.18.1
Chia-I Wu
2019-Jun-26 23:55 UTC
[PATCH v4 02/12] drm/virtio: switch virtio_gpu_wait_ioctl() to gem helper.
On Wed, Jun 19, 2019 at 11:07 PM Gerd Hoffmann <kraxel at redhat.com> wrote:> > Use drm_gem_reservation_object_wait() in virtio_gpu_wait_ioctl(). > This also makes the ioctl run lockless.The userspace has a BO cache to avoid freeing BOs immediately but to reuse them on next allocations. The BO cache checks if a BO is busy before reuse, and I am seeing a big negative perf impact because of slow virtio_gpu_wait_ioctl. I wonder if this helps.> > v2: use reservation_object_test_signaled_rcu for VIRTGPU_WAIT_NOWAIT. > > Signed-off-by: Gerd Hoffmann <kraxel at redhat.com> > Reviewed-by: Daniel Vetter <daniel.vetter at ffwll.ch> > --- > drivers/gpu/drm/virtio/virtgpu_ioctl.c | 24 ++++++++++-------------- > 1 file changed, 10 insertions(+), 14 deletions(-) > > diff --git a/drivers/gpu/drm/virtio/virtgpu_ioctl.c b/drivers/gpu/drm/virtio/virtgpu_ioctl.c > index ac60be9b5c19..313c770ea2c5 100644 > --- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c > +++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c > @@ -464,23 +464,19 @@ static int virtio_gpu_wait_ioctl(struct drm_device *dev, void *data, > struct drm_file *file) > { > struct drm_virtgpu_3d_wait *args = data; > - struct drm_gem_object *gobj = NULL; > - struct virtio_gpu_object *qobj = NULL; > + struct drm_gem_object *obj; > + long timeout = 15 * HZ; > int ret; > - bool nowait = false; > > - gobj = drm_gem_object_lookup(file, args->handle); > - if (gobj == NULL) > - return -ENOENT; > + if (args->flags & VIRTGPU_WAIT_NOWAIT) { > + obj = drm_gem_object_lookup(file, args->handle);Don't we need a NULL check here?> + ret = reservation_object_test_signaled_rcu(obj->resv, true); > + drm_gem_object_put_unlocked(obj); > + return ret ? 0 : -EBUSY; > + } > > - qobj = gem_to_virtio_gpu_obj(gobj); > - > - if (args->flags & VIRTGPU_WAIT_NOWAIT) > - nowait = true; > - ret = virtio_gpu_object_wait(qobj, nowait); > - > - drm_gem_object_put_unlocked(gobj); > - return ret; > + return drm_gem_reservation_object_wait(file, args->handle, > + true, timeout); > } > > static int virtio_gpu_get_caps_ioctl(struct drm_device *dev, > -- > 2.18.1 > > _______________________________________________ > dri-devel mailing list > dri-devel at lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel
Gerd Hoffmann
2019-Jun-28 10:05 UTC
[PATCH v4 02/12] drm/virtio: switch virtio_gpu_wait_ioctl() to gem helper.
On Wed, Jun 26, 2019 at 04:55:20PM -0700, Chia-I Wu wrote:> On Wed, Jun 19, 2019 at 11:07 PM Gerd Hoffmann <kraxel at redhat.com> wrote: > > > > Use drm_gem_reservation_object_wait() in virtio_gpu_wait_ioctl(). > > This also makes the ioctl run lockless. > The userspace has a BO cache to avoid freeing BOs immediately but to > reuse them on next allocations. The BO cache checks if a BO is busy > before reuse, and I am seeing a big negative perf impact because of > slow virtio_gpu_wait_ioctl. I wonder if this helps.Could help indeed (assuming it checks with NOWAIT). How many objects does userspace check in one go typically? Maybe it makes sense to add an ioctl which checks a list, to reduce the system call overhead.> > + if (args->flags & VIRTGPU_WAIT_NOWAIT) { > > + obj = drm_gem_object_lookup(file, args->handle); > Don't we need a NULL check here?Yes, we do. Will fix. thanks, Gerd