diff options
author | Eric Anholt <eric@anholt.net> | 2009-01-27 13:33:49 -0500 |
---|---|---|
committer | Dave Airlie <airlied@linux.ie> | 2009-02-08 06:37:56 -0500 |
commit | d9ddcb96e05cfbadf3dbf66859bcaf5eae25af0b (patch) | |
tree | ee7b3f9b95f21d8489240578e42f35e6964bc952 /drivers/gpu | |
parent | ab657db12d7020629f26f30d287558a8d0e32b41 (diff) |
drm/i915: Return error from i915_gem_object_get_fence_reg() when failing.
Previously, the caller would continue along without knowing that the
function failed, resulting in potential mis-rendering. Right now vm_fault
just returns SIGBUS in that case, and we may need to disable signal handling
to avoid that happening.
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@linux.ie>
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index af8034d52511..e1f831f166ca 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
@@ -52,7 +52,7 @@ static void i915_gem_object_free_page_list(struct drm_gem_object *obj); | |||
52 | static int i915_gem_object_wait_rendering(struct drm_gem_object *obj); | 52 | static int i915_gem_object_wait_rendering(struct drm_gem_object *obj); |
53 | static int i915_gem_object_bind_to_gtt(struct drm_gem_object *obj, | 53 | static int i915_gem_object_bind_to_gtt(struct drm_gem_object *obj, |
54 | unsigned alignment); | 54 | unsigned alignment); |
55 | static void i915_gem_object_get_fence_reg(struct drm_gem_object *obj); | 55 | static int i915_gem_object_get_fence_reg(struct drm_gem_object *obj); |
56 | static void i915_gem_clear_fence_reg(struct drm_gem_object *obj); | 56 | static void i915_gem_clear_fence_reg(struct drm_gem_object *obj); |
57 | static int i915_gem_evict_something(struct drm_device *dev); | 57 | static int i915_gem_evict_something(struct drm_device *dev); |
58 | static int i915_gem_phys_pwrite(struct drm_device *dev, struct drm_gem_object *obj, | 58 | static int i915_gem_phys_pwrite(struct drm_device *dev, struct drm_gem_object *obj, |
@@ -585,8 +585,11 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
585 | 585 | ||
586 | /* Need a new fence register? */ | 586 | /* Need a new fence register? */ |
587 | if (obj_priv->fence_reg == I915_FENCE_REG_NONE && | 587 | if (obj_priv->fence_reg == I915_FENCE_REG_NONE && |
588 | obj_priv->tiling_mode != I915_TILING_NONE) | 588 | obj_priv->tiling_mode != I915_TILING_NONE) { |
589 | i915_gem_object_get_fence_reg(obj); | 589 | ret = i915_gem_object_get_fence_reg(obj); |
590 | if (ret != 0) | ||
591 | return VM_FAULT_SIGBUS; | ||
592 | } | ||
590 | 593 | ||
591 | pfn = ((dev->agp->base + obj_priv->gtt_offset) >> PAGE_SHIFT) + | 594 | pfn = ((dev->agp->base + obj_priv->gtt_offset) >> PAGE_SHIFT) + |
592 | page_offset; | 595 | page_offset; |
@@ -1513,7 +1516,7 @@ static void i830_write_fence_reg(struct drm_i915_fence_reg *reg) | |||
1513 | * It then sets up the reg based on the object's properties: address, pitch | 1516 | * It then sets up the reg based on the object's properties: address, pitch |
1514 | * and tiling format. | 1517 | * and tiling format. |
1515 | */ | 1518 | */ |
1516 | static void | 1519 | static int |
1517 | i915_gem_object_get_fence_reg(struct drm_gem_object *obj) | 1520 | i915_gem_object_get_fence_reg(struct drm_gem_object *obj) |
1518 | { | 1521 | { |
1519 | struct drm_device *dev = obj->dev; | 1522 | struct drm_device *dev = obj->dev; |
@@ -1563,10 +1566,11 @@ try_again: | |||
1563 | * objects to finish before trying again. | 1566 | * objects to finish before trying again. |
1564 | */ | 1567 | */ |
1565 | if (i == dev_priv->num_fence_regs) { | 1568 | if (i == dev_priv->num_fence_regs) { |
1566 | ret = i915_gem_object_wait_rendering(reg->obj); | 1569 | ret = i915_gem_object_set_to_gtt_domain(reg->obj, 0); |
1567 | if (ret) { | 1570 | if (ret) { |
1568 | WARN(ret, "wait_rendering failed: %d\n", ret); | 1571 | WARN(ret != -ERESTARTSYS, |
1569 | return; | 1572 | "switch to GTT domain failed: %d\n", ret); |
1573 | return ret; | ||
1570 | } | 1574 | } |
1571 | goto try_again; | 1575 | goto try_again; |
1572 | } | 1576 | } |
@@ -1591,6 +1595,8 @@ try_again: | |||
1591 | i915_write_fence_reg(reg); | 1595 | i915_write_fence_reg(reg); |
1592 | else | 1596 | else |
1593 | i830_write_fence_reg(reg); | 1597 | i830_write_fence_reg(reg); |
1598 | |||
1599 | return 0; | ||
1594 | } | 1600 | } |
1595 | 1601 | ||
1596 | /** | 1602 | /** |