diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2012-09-04 21:02:54 +0100 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2012-09-20 14:22:56 +0200 |
commit | a5570178c059cec59e9835be20bc8546377fa7b5 (patch) | |
tree | 02689b01aa2d069ec59cbc7b1f95af61a1003d31 /drivers/gpu/drm/i915/i915_gem_dmabuf.c | |
parent | 37e680a15ff6375ff02773161f817e90a38c51f7 (diff) | |
download | op-kernel-dev-a5570178c059cec59e9835be20bc8546377fa7b5.zip op-kernel-dev-a5570178c059cec59e9835be20bc8546377fa7b5.tar.gz |
drm/i915: Pin backing pages whilst exporting through a dmabuf vmap
We need to refcount our pages in order to prevent reaping them at
inopportune times, such as when they currently vmapped or exported to
another driver. However, we also wish to keep the lazy deallocation of
our pages so we need to take a pin/unpinned approach rather than a
simple refcount.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Ben Widawsky <ben@bwidawsk.net>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem_dmabuf.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_dmabuf.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_dmabuf.c b/drivers/gpu/drm/i915/i915_gem_dmabuf.c index e4f1141..eca4726 100644 --- a/drivers/gpu/drm/i915/i915_gem_dmabuf.c +++ b/drivers/gpu/drm/i915/i915_gem_dmabuf.c @@ -50,6 +50,8 @@ static struct sg_table *i915_gem_map_dma_buf(struct dma_buf_attachment *attachme /* link the pages into an SG then map the sg */ sg = drm_prime_pages_to_sg(obj->pages, npages); nents = dma_map_sg(attachment->dev, sg->sgl, sg->nents, dir); + i915_gem_object_pin_pages(obj); + out: mutex_unlock(&dev->struct_mutex); return sg; @@ -102,6 +104,7 @@ static void *i915_gem_dmabuf_vmap(struct dma_buf *dma_buf) } obj->vmapping_count = 1; + i915_gem_object_pin_pages(obj); out_unlock: mutex_unlock(&dev->struct_mutex); return obj->dma_buf_vmapping; @@ -117,10 +120,11 @@ static void i915_gem_dmabuf_vunmap(struct dma_buf *dma_buf, void *vaddr) if (ret) return; - --obj->vmapping_count; - if (obj->vmapping_count == 0) { + if (--obj->vmapping_count == 0) { vunmap(obj->dma_buf_vmapping); obj->dma_buf_vmapping = NULL; + + i915_gem_object_unpin_pages(obj); } mutex_unlock(&dev->struct_mutex); } |