struct file *shmem_create_from_object(struct drm_i915_gem_object *obj) { struct drm_i915_private *i915 = to_i915(obj->base.dev); struct file *file; void *ptr; int err; if (obj->base.import_attach) { file = obj->base.filp; atomic_long_inc(&file->f_count); } else if (i915_gem_object_is_shmem(obj)) { err = i915_gem_object_pin_pages_unlocked(obj); if (err) { drm_dbg(&i915->drm, "%s pin-pages err=%d\n", __func__, err); return ERR_PTR(err); } file = i915_gem_ttm_get_filep(obj); GEM_BUG_ON(!file); atomic_long_inc(&file->f_count); i915_gem_clflush_object(obj, I915_CLFLUSH_FORCE | I915_CLFLUSH_SYNC); i915_gem_object_unpin_pages(obj); } else { ptr = i915_gem_object_pin_map_unlocked(obj, i915_gem_object_is_lmem(obj) ? I915_MAP_WC : I915_MAP_WB); if (IS_ERR(ptr)) { i915_gem_object_unpin_pages(obj); return ERR_CAST(ptr); } file = shmem_create_from_data("", ptr, obj->base.size); i915_gem_object_unpin_map(obj); } return file; }