Skip to content

Commit 5763ff0

Browse files
ickledanvet
authored andcommitted
drm/i915: Avoid GPU stalls from kswapd
Exclude active GPU pages from the purview of the background shrinker (kswapd), as these cause uncontrollable GPU stalls. Given that the shrinker is rerun until the freelists are satisfied, we should have opportunity in subsequent passes to recover the pages once idle. If the machine does run out of memory entirely, we have the forced idling in the oom-notifier as a means of releasing all the pages we can before an oom is prematurely executed. Note that this relies upon an up-front retire_requests to keep the inactive list in shape, which was added in a previous patch, mostly as execlist ctx pinning band-aids. Signed-off-by: Chris Wilson <[email protected]> Reviewed-by: Damien Lespiau <[email protected]> [danvet: Add note about retire_requests.] Signed-off-by: Daniel Vetter <[email protected]>
1 parent ce8daef commit 5763ff0

File tree

2 files changed

+8
-2
lines changed

2 files changed

+8
-2
lines changed

drivers/gpu/drm/i915/i915_drv.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3212,6 +3212,7 @@ unsigned long i915_gem_shrink(struct drm_i915_private *dev_priv,
32123212
#define I915_SHRINK_PURGEABLE 0x1
32133213
#define I915_SHRINK_UNBOUND 0x2
32143214
#define I915_SHRINK_BOUND 0x4
3215+
#define I915_SHRINK_ACTIVE 0x8
32153216
unsigned long i915_gem_shrink_all(struct drm_i915_private *dev_priv);
32163217
void i915_gem_shrinker_init(struct drm_i915_private *dev_priv);
32173218

drivers/gpu/drm/i915/i915_gem_shrinker.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,9 @@ i915_gem_shrink(struct drm_i915_private *dev_priv,
126126
obj->madv != I915_MADV_DONTNEED)
127127
continue;
128128

129+
if ((flags & I915_SHRINK_ACTIVE) == 0 && obj->active)
130+
continue;
131+
129132
drm_gem_object_reference(&obj->base);
130133

131134
/* For the unbound phase, this should be a no-op! */
@@ -164,7 +167,9 @@ i915_gem_shrink(struct drm_i915_private *dev_priv,
164167
unsigned long i915_gem_shrink_all(struct drm_i915_private *dev_priv)
165168
{
166169
return i915_gem_shrink(dev_priv, -1UL,
167-
I915_SHRINK_BOUND | I915_SHRINK_UNBOUND);
170+
I915_SHRINK_BOUND |
171+
I915_SHRINK_UNBOUND |
172+
I915_SHRINK_ACTIVE);
168173
}
169174

170175
static bool i915_gem_shrinker_lock(struct drm_device *dev, bool *unlock)
@@ -217,7 +222,7 @@ i915_gem_shrinker_count(struct shrinker *shrinker, struct shrink_control *sc)
217222
count += obj->base.size >> PAGE_SHIFT;
218223

219224
list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list) {
220-
if (obj->pages_pin_count == num_vma_bound(obj))
225+
if (!obj->active && obj->pages_pin_count == num_vma_bound(obj))
221226
count += obj->base.size >> PAGE_SHIFT;
222227
}
223228

0 commit comments

Comments
 (0)