8000 Merge tag 'drm-intel-fixes-2013-06-24' of git://people.freedesktop.or… · codeguru85/linux@0d20299 · GitHub
[go: up one dir, main page]

Skip to content

Commit 0d20299

Browse files
committed
Merge tag 'drm-intel-fixes-2013-06-24' of git://people.freedesktop.org/~danvet/drm-intel into drm-fixes
One remaining regression fix for i915. I've left it in -fixes for more than a week since it's in tricky code, and it took us a few kernel releases to notice the regression at all. The fence leak is especially annoying on gen2/3 and will kill userspace there quickly. For extra paranoia we've added a WARN in -next to catch this, things seem to be solid now. * tag 'drm-intel-fixes-2013-06-24' of git://people.freedesktop.org/~danvet/drm-intel: drm/i915: Restore fences after resume and GPU resets
2 parents acdb37c + 19b2dbd commit 0d20299

File tree

3 files changed

+8
-17
lines changed

3 files changed

+8
-17
lines changed

drivers/gpu/drm/i915/i915_drv.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1697,6 +1697,8 @@ struct drm_gem_object *i915_gem_prime_import(struct drm_device *dev,
16971697
struct dma_buf *i915_gem_prime_export(struct drm_device *dev,
16981698
struct drm_gem_object *gem_obj, int flags);
16991699

1700+
void i915_gem_restore_fences(struct drm_device *dev);
1701+
17001702
/* i915_gem_context.c */
17011703
void i915_gem_context_init(struct drm_device *dev);
17021704
void i915_gem_context_fini(struct drm_device *dev);

drivers/gpu/drm/i915/i915_gem.c

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2117,25 +2117,15 @@ static void i915_gem_reset_ring_lists(struct drm_i915_private *dev_priv,
21172117
}
21182118
}
21192119

2120-
static void i915_gem_reset_fences(struct drm_device *dev)
2120+
void i915_gem_restore_fences(struct drm_device *dev)
21212121
{
21222122
struct drm_i915_private *dev_priv = dev->dev_private;
21232123
int i;
21242124

21252125
for (i = 0; i < dev_priv->num_fence_regs; i++) {
21262126
struct drm_i915_fence_reg *reg = &dev_priv->fence_regs[i];
2127-
2128-
if (reg->obj)
2129-
i915_gem_object_fence_lost(reg->obj);
2130-
2131-
i915_gem_write_fence(dev, i, NULL);
2132-
2133-
reg->pin_count = 0;
2134-
reg->obj = NULL;
2135-
INIT_LIST_HEAD(&reg->lru_list);
2127+
i915_gem_write_fence(dev, i, reg->obj);
21362128
}
2137-
2138-
INIT_LIST_HEAD(&dev_priv->mm.fence_list);
21392129
}
21402130

21412131
void i915_gem_reset(struct drm_device *dev)
@@ -2158,8 +2148,7 @@ void i915_gem_reset(struct drm_device *dev)
21582148
obj->base.read_domains &= ~I915_GEM_GPU_DOMAINS;
21592149
}
21602150

2161-
/* The fence registers are invalidated so clear them out */
2162-
i915_gem_reset_fences(dev);
2151+
i915_gem_restore_fences(dev);
21632152
}
21642153

21652154
/**
@@ -3865,8 +3854,6 @@ i915_gem_idle(struct drm_device *dev)
38653854
if (!drm_core_check_feature(dev, DRIVER_MODESET))
38663855
i915_gem_evict_everything(dev);
38673856

3868-
i915_gem_reset_fences(dev);
3869-
38703857
/* Hack! Don't let anybody do execbuf while we don't control the chip.
38713858
* We need to replace this with a semaphore, or something.
38723859
* And not confound mm.suspended!
@@ -4193,7 +4180,8 @@ i915_gem_load(struct drm_device *dev)
41934180
dev_priv->num_fence_regs = 8;
41944181

41954182
/* Initialize fence registers to zero */
4196-
i915_gem_reset_fences(dev);
4183+
INIT_LIST_HEAD(&dev_priv->mm.fence_list);
4184+
i915_gem_restore_fences(dev);
41974185

41984186
i915_gem_detect_bit_6_swizzle(dev);
41994187
init_waitqueue_head(&dev_priv->pending_flip_queue);

drivers/gpu/drm/i915/i915_suspend.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,7 @@ int i915_restore_state(struct drm_device *dev)
384384

385385
mutex_lock(&dev->struct_mutex);
386386

387+
i915_gem_restore_fences(dev);
387388
i915_restore_display(dev);
388389

389390
if (!drm_core_check_feature(dev, DRIVER_MODESET)) {

0 commit comments

Comments
 (0)
0