diff options
author | Dave Airlie <airlied@redhat.com> | 2015-06-16 01:42:13 -0400 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2015-06-16 05:22:41 -0400 |
commit | d5084f1711c8917d48006e19099060b3b8387bb5 (patch) | |
tree | 6e494b46910e851ec881b554a16124c93aeabcb5 | |
parent | 441012aff674c8d2d9b371e1a19320de38eecc84 (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.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/virtio/virtgpu_vq.c | 7 |
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 | ||
207 | static void reclaim_vbufs(struct virtqueue *vq, struct list_head *reclaim_list) | 214 | static void reclaim_vbufs(struct virtqueue *vq, struct list_head *reclaim_list) |