diff options
Diffstat (limited to 'drivers/gpu/drm/virtio/virtgpu_object.c')
-rw-r--r-- | drivers/gpu/drm/virtio/virtgpu_object.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/gpu/drm/virtio/virtgpu_object.c b/drivers/gpu/drm/virtio/virtgpu_object.c index b2da31310d24..09b526518f5a 100644 --- a/drivers/gpu/drm/virtio/virtgpu_object.c +++ b/drivers/gpu/drm/virtio/virtgpu_object.c | |||
@@ -204,6 +204,7 @@ int virtio_gpu_object_get_sg_table(struct virtio_gpu_device *qdev, | |||
204 | .interruptible = false, | 204 | .interruptible = false, |
205 | .no_wait_gpu = false | 205 | .no_wait_gpu = false |
206 | }; | 206 | }; |
207 | size_t max_segment; | ||
207 | 208 | ||
208 | /* wtf swapping */ | 209 | /* wtf swapping */ |
209 | if (bo->pages) | 210 | if (bo->pages) |
@@ -215,8 +216,13 @@ int virtio_gpu_object_get_sg_table(struct virtio_gpu_device *qdev, | |||
215 | if (!bo->pages) | 216 | if (!bo->pages) |
216 | goto out; | 217 | goto out; |
217 | 218 | ||
218 | ret = sg_alloc_table_from_pages(bo->pages, pages, nr_pages, 0, | 219 | max_segment = virtio_max_dma_size(qdev->vdev); |
219 | nr_pages << PAGE_SHIFT, GFP_KERNEL); | 220 | max_segment &= PAGE_MASK; |
221 | if (max_segment > SCATTERLIST_MAX_SEGMENT) | ||
222 | max_segment = SCATTERLIST_MAX_SEGMENT; | ||
223 | ret = __sg_alloc_table_from_pages(bo->pages, pages, nr_pages, 0, | ||
224 | nr_pages << PAGE_SHIFT, | ||
225 | max_segment, GFP_KERNEL); | ||
220 | if (ret) | 226 | if (ret) |
221 | goto out; | 227 | goto out; |
222 | return 0; | 228 | return 0; |