aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2015-06-16 01:42:13 -0400
committerGerd Hoffmann <kraxel@redhat.com>2015-06-16 05:22:41 -0400
commitd5084f1711c8917d48006e19099060b3b8387bb5 (patch)
tree6e494b46910e851ec881b554a16124c93aeabcb5
parent441012aff674c8d2d9b371e1a19320de38eecc84 (diff)
virtio-gpu: add locking for vbuf pool
Signed-off-by: Dave Airlie <airlied@redhat.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
-rw-r--r--drivers/gpu/drm/virtio/virtgpu_drv.h1
-rw-r--r--drivers/gpu/drm/virtio/virtgpu_vq.c7
2 files changed, 8 insertions, 0 deletions
diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
index ff8de3d6f0b2..6d4db2dba90b 100644
--- a/drivers/gpu/drm/virtio/virtgpu_drv.h
+++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
@@ -162,6 +162,7 @@ struct virtio_gpu_device {
162 struct virtio_gpu_queue ctrlq; 162 struct virtio_gpu_queue ctrlq;
163 struct virtio_gpu_queue cursorq; 163 struct virtio_gpu_queue cursorq;
164 struct list_head free_vbufs; 164 struct list_head free_vbufs;
165 spinlock_t free_vbufs_lock;
165 void *vbufs; 166 void *vbufs;
166 bool vqs_ready; 167 bool vqs_ready;
167 168
diff --git a/drivers/gpu/drm/virtio/virtgpu_vq.c b/drivers/gpu/drm/virtio/virtgpu_vq.c
index c5067926401f..1698669f4185 100644
--- a/drivers/gpu/drm/virtio/virtgpu_vq.c
+++ b/drivers/gpu/drm/virtio/virtgpu_vq.c
@@ -79,6 +79,7 @@ int virtio_gpu_alloc_vbufs(struct virtio_gpu_device *vgdev)
79 void *ptr; 79 void *ptr;
80 80
81 INIT_LIST_HEAD(&vgdev->free_vbufs); 81 INIT_LIST_HEAD(&vgdev->free_vbufs);
82 spin_lock_init(&vgdev->free_vbufs_lock);
82 count += virtqueue_get_vring_size(vgdev->ctrlq.vq); 83 count += virtqueue_get_vring_size(vgdev->ctrlq.vq);
83 count += virtqueue_get_vring_size(vgdev->cursorq.vq); 84 count += virtqueue_get_vring_size(vgdev->cursorq.vq);
84 size = count * VBUFFER_SIZE; 85 size = count * VBUFFER_SIZE;
@@ -106,6 +107,7 @@ void virtio_gpu_free_vbufs(struct virtio_gpu_device *vgdev)
106 count += virtqueue_get_vring_size(vgdev->ctrlq.vq); 107 count += virtqueue_get_vring_size(vgdev->ctrlq.vq);
107 count += virtqueue_get_vring_size(vgdev->cursorq.vq); 108 count += virtqueue_get_vring_size(vgdev->cursorq.vq);
108 109
110 spin_lock(&vgdev->free_vbufs_lock);
109 for (i = 0; i < count; i++) { 111 for (i = 0; i < count; i++) {
110 if (WARN_ON(list_empty(&vgdev->free_vbufs))) 112 if (WARN_ON(list_empty(&vgdev->free_vbufs)))
111 return; 113 return;
@@ -113,6 +115,7 @@ void virtio_gpu_free_vbufs(struct virtio_gpu_device *vgdev)
113 struct virtio_gpu_vbuffer, list); 115 struct virtio_gpu_vbuffer, list);
114 list_del(&vbuf->list); 116 list_del(&vbuf->list);
115 } 117 }
118 spin_unlock(&vgdev->free_vbufs_lock);
116 kfree(vgdev->vbufs); 119 kfree(vgdev->vbufs);
117} 120}
118 121
@@ -123,10 +126,12 @@ virtio_gpu_get_vbuf(struct virtio_gpu_device *vgdev,
123{ 126{
124 struct virtio_gpu_vbuffer *vbuf; 127 struct virtio_gpu_vbuffer *vbuf;
125 128
129 spin_lock(&vgdev->free_vbufs_lock);
126 BUG_ON(list_empty(&vgdev->free_vbufs)); 130 BUG_ON(list_empty(&vgdev->free_vbufs));
127 vbuf = list_first_entry(&vgdev->free_vbufs, 131 vbuf = list_first_entry(&vgdev->free_vbufs,
128 struct virtio_gpu_vbuffer, list); 132 struct virtio_gpu_vbuffer, list);
129 list_del(&vbuf->list); 133 list_del(&vbuf->list);
134 spin_unlock(&vgdev->free_vbufs_lock);
130 memset(vbuf, 0, VBUFFER_SIZE); 135 memset(vbuf, 0, VBUFFER_SIZE);
131 136
132 BUG_ON(size > MAX_INLINE_CMD_SIZE); 137 BUG_ON(size > MAX_INLINE_CMD_SIZE);
@@ -201,7 +206,9 @@ static void free_vbuf(struct virtio_gpu_device *vgdev,
201 if (vbuf->resp_size > MAX_INLINE_RESP_SIZE) 206 if (vbuf->resp_size > MAX_INLINE_RESP_SIZE)
202 kfree(vbuf->resp_buf); 207 kfree(vbuf->resp_buf);
203 kfree(vbuf->data_buf); 208 kfree(vbuf->data_buf);
209 spin_lock(&vgdev->free_vbufs_lock);
204 list_add(&vbuf->list, &vgdev->free_vbufs); 210 list_add(&vbuf->list, &vgdev->free_vbufs);
211 spin_unlock(&vgdev->free_vbufs_lock);
205} 212}
206 213
207static void reclaim_vbufs(struct virtqueue *vq, struct list_head *reclaim_list) 214static void reclaim_vbufs(struct virtqueue *vq, struct list_head *reclaim_list)