int __i915_gem_object_put_pages(struct drm_i915_gem_object *obj);
 int i915_gem_object_truncate(struct drm_i915_gem_object *obj);
-void i915_gem_object_writeback(struct drm_i915_gem_object *obj);
 
 /**
  * i915_gem_object_pin_map - return a contiguous mapping of the entire object
 
        void (*put_pages)(struct drm_i915_gem_object *obj,
                          struct sg_table *pages);
        int (*truncate)(struct drm_i915_gem_object *obj);
-       void (*writeback)(struct drm_i915_gem_object *obj);
        int (*shrinker_release_pages)(struct drm_i915_gem_object *obj,
                                      bool no_gpu_wait,
                                      bool should_writeback);
 
        return 0;
 }
 
-/* Try to discard unwanted pages */
-void i915_gem_object_writeback(struct drm_i915_gem_object *obj)
-{
-       assert_object_held_shared(obj);
-       GEM_BUG_ON(i915_gem_object_has_pages(obj));
-
-       if (obj->ops->writeback)
-               obj->ops->writeback(obj);
-}
-
 static void __i915_gem_object_reset_page_iter(struct drm_i915_gem_object *obj)
 {
        struct radix_tree_iter iter;
 
        __shmem_writeback(obj->base.size, obj->base.filp->f_mapping);
 }
 
+static int shmem_shrinker_release_pages(struct drm_i915_gem_object *obj,
+                                       bool no_gpu_wait,
+                                       bool writeback)
+{
+       switch (obj->mm.madv) {
+       case I915_MADV_DONTNEED:
+               return i915_gem_object_truncate(obj);
+       case __I915_MADV_PURGED:
+               return 0;
+       }
+
+       if (writeback)
+               shmem_writeback(obj);
+
+       return 0;
+}
+
 void
 __i915_gem_object_release_shmem(struct drm_i915_gem_object *obj,
                                struct sg_table *pages,
        .get_pages = shmem_get_pages,
        .put_pages = shmem_put_pages,
        .truncate = shmem_truncate,
-       .writeback = shmem_writeback,
+       .shrinker_release_pages = shmem_shrinker_release_pages,
 
        .pwrite = shmem_pwrite,
        .pread = shmem_pread,
 
                return obj->ops->shrinker_release_pages(obj,
                                                        !(flags & I915_SHRINK_ACTIVE),
                                                        flags & I915_SHRINK_WRITEBACK);
-
-       switch (obj->mm.madv) {
-       case I915_MADV_DONTNEED:
-               i915_gem_object_truncate(obj);
-               return 0;
-       case __I915_MADV_PURGED:
-               return 0;
-       }
-
-       if (flags & I915_SHRINK_WRITEBACK)
-               i915_gem_object_writeback(obj);
-
        return 0;
 }