summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2014-02-13 08:39:22 +1000
committerDave Airlie <airlied@redhat.com>2014-03-25 16:19:28 +1000
commit7916e0c82edfa9bf01522e58885766bdbf99edf8 (patch)
treefbb8f6169014e7138c2afc76d2012bccb5b92e9c
parent9407f07e7d0c914f62df8d24c9cc1276fcd5c9ef (diff)
wip: start invalidating backing store on swap
-rw-r--r--drivers/gpu/drm/virtio/virtgpu_drv.h3
-rw-r--r--drivers/gpu/drm/virtio/virtgpu_ioctl.c4
-rw-r--r--drivers/gpu/drm/virtio/virtgpu_ttm.c12
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 = {