--- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c @@ -1657,7 +1657,11 @@ int i915_driver_load(struct drm_device * return 0; out_gem_unload: +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)) if (dev_priv->mm.inactive_shrinker.scan_objects) +#else + if (dev_priv->mm.inactive_shrinker.shrink) +#endif unregister_shrinker(&dev_priv->mm.inactive_shrinker); if (dev->pdev->msi_enabled) @@ -1691,7 +1695,11 @@ int i915_driver_unload(struct drm_device i915_teardown_sysfs(dev); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)) if (dev_priv->mm.inactive_shrinker.scan_objects) +#else + if (dev_priv->mm.inactive_shrinker.shrink) +#endif unregister_shrinker(&dev_priv->mm.inactive_shrinker); mutex_lock(&dev->struct_mutex); --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -53,10 +53,15 @@ static void i915_gem_object_update_fence struct drm_i915_fence_reg *fence, bool enable); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)) static unsigned long i915_gem_inactive_count(struct shrinker *shrinker, struct shrink_control *sc); static unsigned long i915_gem_inactive_scan(struct shrinker *shrinker, struct shrink_control *sc); +#else +static int i915_gem_inactive_shrink(struct shrinker *shrinker, + struct shrink_control *sc); +#endif static long i915_gem_purge(struct drm_i915_private *dev_priv, long target); static long i915_gem_shrink_all(struct drm_i915_private *dev_priv); static void i915_gem_object_truncate(struct drm_i915_gem_object *obj); @@ -4360,8 +4365,12 @@ i915_gem_load(struct drm_device *dev) dev_priv->mm.interruptible = true; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)) dev_priv->mm.inactive_shrinker.scan_objects = i915_gem_inactive_scan; dev_priv->mm.inactive_shrinker.count_objects = i915_gem_inactive_count; +#else + dev_priv->mm.inactive_shrinker.shrink = i915_gem_inactive_shrink; +#endif dev_priv->mm.inactive_shrinker.seeks = DEFAULT_SEEKS; register_shrinker(&dev_priv->mm.inactive_shrinker); } @@ -4584,8 +4593,14 @@ static bool mutex_is_locked_by(struct mu #endif } +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)) static unsigned long i915_gem_inactive_count(struct shrinker *shrinker, struct shrink_control *sc) +#else +#define SHRINK_STOP -1 +static int +i915_gem_inactive_shrink(struct shrinker *shrinker, struct shrink_control *sc) +#endif { struct drm_i915_private *dev_priv = container_of(shrinker, @@ -4594,7 +4609,12 @@ i915_gem_inactive_count(struct shrinker struct drm_device *dev = dev_priv->dev; struct drm_i915_gem_object *obj; bool unlock = true; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)) unsigned long count; +#else + int nr_to_scan = sc->nr_to_scan; + int count; +#endif if (!mutex_trylock(&dev->struct_mutex)) { if (!mutex_is_locked_by(&dev->struct_mutex, current)) @@ -4606,6 +4626,17 @@ i915_gem_inactive_count(struct shrinker unlock = false; } +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,11,0)) + if (nr_to_scan) { + nr_to_scan -= i915_gem_purge(dev_priv, nr_to_scan); + if (nr_to_scan > 0) + nr_to_scan -= __i915_gem_shrink(dev_priv, nr_to_scan, + false); + if (nr_to_scan > 0) + i915_gem_shrink_all(dev_priv); + } +#endif + count = 0; list_for_each_entry(obj, &dev_priv->mm.unbound_list, global_list) if (obj->pages_pin_count == 0) @@ -4619,6 +4650,7 @@ i915_gem_inactive_count(struct shrinker return count; } +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)) static unsigned long i915_gem_inactive_scan(struct shrinker *shrinker, struct shrink_control *sc) { @@ -4652,3 +4684,4 @@ i915_gem_inactive_scan(struct shrinker * mutex_unlock(&dev->struct_mutex); return freed; } +#endif