drm/virtio: fix ring free check
authorGerd Hoffmann <kraxel@redhat.com>
Fri, 7 Feb 2020 06:46:53 +0000 (07:46 +0100)
committerGerd Hoffmann <kraxel@redhat.com>
Fri, 7 Feb 2020 08:33:55 +0000 (09:33 +0100)
If the virtio device supports indirect ring descriptors we need only one
ring entry for the whole command.  Take that into account when checking
whenever the virtqueue has enough free entries for our command.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Chia-I Wu <olvaffe@gmail.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20200207064653.14403-1-kraxel@redhat.com
drivers/gpu/drm/virtio/virtgpu_debugfs.c
drivers/gpu/drm/virtio/virtgpu_drv.h
drivers/gpu/drm/virtio/virtgpu_kms.c
drivers/gpu/drm/virtio/virtgpu_vq.c

index 5156e6b279db122c031a28ceef2b56a07a26b660..e27120d512b0614031a98eb3dc9ff03523ead7ee 100644 (file)
@@ -47,6 +47,7 @@ static int virtio_gpu_features(struct seq_file *m, void *data)
 
        virtio_add_bool(m, "virgl", vgdev->has_virgl_3d);
        virtio_add_bool(m, "edid", vgdev->has_edid);
+       virtio_add_bool(m, "indirect", vgdev->has_indirect);
        virtio_add_int(m, "cap sets", vgdev->num_capsets);
        virtio_add_int(m, "scanouts", vgdev->num_scanouts);
        return 0;
index 7e69c06e168eaa29f96fdf72da8a3131a556aab6..d278c8c50f3941ac9d9547872d9005d8f9e18c61 100644 (file)
@@ -193,6 +193,7 @@ struct virtio_gpu_device {
 
        bool has_virgl_3d;
        bool has_edid;
+       bool has_indirect;
 
        struct work_struct config_changed_work;
 
index 2f5773e43557c8ebefc319cad588da8db8adc06b..c1086df49816e57ab3b71cccef6bdae90fc00a2a 100644 (file)
@@ -159,6 +159,9 @@ int virtio_gpu_init(struct drm_device *dev)
        if (virtio_has_feature(vgdev->vdev, VIRTIO_GPU_F_EDID)) {
                vgdev->has_edid = true;
        }
+       if (virtio_has_feature(vgdev->vdev, VIRTIO_RING_F_INDIRECT_DESC)) {
+               vgdev->has_indirect = true;
+       }
 
        DRM_INFO("features: %cvirgl %cedid\n",
                 vgdev->has_virgl_3d ? '+' : '-',
index 41e475fbd67bf64bbdf8270513b3067397b4da46..cc02fc4bab2a53acd70c18b9cbc360ce873813f5 100644 (file)
@@ -330,6 +330,9 @@ static void virtio_gpu_queue_ctrl_sgs(struct virtio_gpu_device *vgdev,
        bool notify = false;
        int ret;
 
+       if (vgdev->has_indirect)
+               elemcnt = 1;
+
 again:
        spin_lock(&vgdev->ctrlq.qlock);