diff options
author | Dave Airlie <airlied@redhat.com> | 2014-02-13 08:39:22 +1000 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2014-03-25 16:19:28 +1000 |
commit | 7916e0c82edfa9bf01522e58885766bdbf99edf8 (patch) | |
tree | fbb8f6169014e7138c2afc76d2012bccb5b92e9c | |
parent | 9407f07e7d0c914f62df8d24c9cc1276fcd5c9ef (diff) |
wip: start invalidating backing store on swap
-rw-r--r-- | drivers/gpu/drm/virtio/virtgpu_drv.h | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/virtio/virtgpu_ioctl.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/virtio/virtgpu_ttm.c | 12 |
3 files changed, 17 insertions, 2 deletions
diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h index d99d76704659..ab0adbfa8a28 100644 --- a/drivers/gpu/drm/virtio/virtgpu_drv.h +++ b/drivers/gpu/drm/virtio/virtgpu_drv.h @@ -257,7 +257,8 @@ int virtgpu_cmd_transfer_to_host_3d(struct virtgpu_device *vgdev, uint32_t resou int virtgpu_cmd_resource_create_3d(struct virtgpu_device *vgdev, struct virtgpu_resource_create_3d *rc_3d, struct virtgpu_fence **fence); - +int virtgpu_cmd_resource_inval_backing(struct virtgpu_device *vgdev, + uint32_t resource_id); void virtgpu_ctrl_ack(struct virtqueue *vq); void virtgpu_cursor_ack(struct virtqueue *vq); void virtgpu_event_ack(struct virtqueue *vq); diff --git a/drivers/gpu/drm/virtio/virtgpu_ioctl.c b/drivers/gpu/drm/virtio/virtgpu_ioctl.c index 7cdf74f844a3..74fa0adcd07d 100644 --- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c +++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c @@ -293,8 +293,12 @@ static int virtgpu_resource_create_ioctl(struct drm_device *dev, void *data, rc_3d.flags = rc->flags; ret = virtgpu_cmd_resource_create_3d(vgdev, &rc_3d, NULL); + if (ret) + goto fail_unref; ret = virtgpu_object_attach(vgdev, qobj, res_id, &fence); + if (ret) + goto fail_unref; ttm_eu_fence_buffer_objects(&ticket, &validate_list, fence); } diff --git a/drivers/gpu/drm/virtio/virtgpu_ttm.c b/drivers/gpu/drm/virtio/virtgpu_ttm.c index 4570d2eeae55..9656bb4a4595 100644 --- a/drivers/gpu/drm/virtio/virtgpu_ttm.c +++ b/drivers/gpu/drm/virtio/virtgpu_ttm.c @@ -358,9 +358,19 @@ static void virtgpu_bo_move_notify(struct ttm_buffer_object *bo, return; } -static void virtgpu_bo_swap_notify(struct ttm_buffer_object *bo) +static void virtgpu_bo_swap_notify(struct ttm_buffer_object *tbo) { + struct virtgpu_object *bo; + struct virtgpu_device *vgdev; + bo = container_of(tbo, struct virtgpu_object, tbo); + vgdev = (struct virtgpu_device *)bo->gem_base.dev->dev_private; + + virtgpu_cmd_resource_inval_backing(vgdev, bo->hw_res_handle); + if (bo->pages) { + virtgpu_object_free_sg_table(bo); + } printk(KERN_ERR "swapping bo %p\n", bo); + /* should we invalidate the mapping? */ } static struct ttm_bo_driver virtgpu_bo_driver = { |