···14701470 int i;1471147114721472 BUG_ON(obj_priv->pages_refcount == 0);14731473+ BUG_ON(obj_priv->madv == __I915_MADV_PURGED);1473147414741475 if (--obj_priv->pages_refcount != 0)14751476 return;···15351534static void15361535i915_gem_object_truncate(struct drm_gem_object *obj)15371536{15381538- struct inode *inode;15371537+ struct drm_i915_gem_object *obj_priv = obj->driver_private;15381538+ struct inode *inode;1539153915401540- inode = obj->filp->f_path.dentry->d_inode;15411541- if (inode->i_op->truncate)15421542- inode->i_op->truncate (inode);15401540+ inode = obj->filp->f_path.dentry->d_inode;15411541+ if (inode->i_op->truncate)15421542+ inode->i_op->truncate (inode);15431543+15441544+ obj_priv->madv = __I915_MADV_PURGED;15431545}1544154615451547static inline int···25632559 if (dev_priv->mm.suspended)25642560 return -EBUSY;2565256125662566- if (obj_priv->madv == I915_MADV_DONTNEED) {25622562+ if (obj_priv->madv != I915_MADV_WILLNEED) {25672563 DRM_ERROR("Attempting to bind a purgeable object\n");25682564 return -EINVAL;25692565 }···39323928 }39333929 obj_priv = obj->driver_private;3934393039353935- if (obj_priv->madv == I915_MADV_DONTNEED) {39363936- DRM_ERROR("Attempting to pin a I915_MADV_DONTNEED buffer\n");39313931+ if (obj_priv->madv != I915_MADV_WILLNEED) {39323932+ DRM_ERROR("Attempting to pin a purgeable buffer\n");39373933 drm_gem_object_unreference(obj);39383934 mutex_unlock(&dev->struct_mutex);39393935 return -EINVAL;···40854081 return -EINVAL;40864082 }4087408340884088- obj_priv->madv = args->madv;40894089- args->retained = obj_priv->gtt_space != NULL;40844084+ if (obj_priv->madv != __I915_MADV_PURGED)40854085+ obj_priv->madv = args->madv;4090408640914087 /* if the object is no longer bound, discard its backing storage */40924088 if (i915_gem_object_is_purgeable(obj_priv) &&40934089 obj_priv->gtt_space == NULL)40944090 i915_gem_object_truncate(obj);40914091+40924092+ args->retained = obj_priv->madv != __I915_MADV_PURGED;4095409340964094 drm_gem_object_unreference(obj);40974095 mutex_unlock(&dev->struct_mutex);
+1
include/drm/i915_drm.h
···671671672672#define I915_MADV_WILLNEED 0673673#define I915_MADV_DONTNEED 1674674+#define __I915_MADV_PURGED 2 /* internal state */674675675676struct drm_i915_gem_madvise {676677 /** Handle of the buffer to change the backing store advice */