2 * Copyright © 2017 Intel Corporation
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25 #include <linux/sched/mm.h>
27 #include "display/intel_frontbuffer.h"
28 #include "gt/intel_gt.h"
30 #include "i915_gem_clflush.h"
31 #include "i915_gem_context.h"
32 #include "i915_gem_mman.h"
33 #include "i915_gem_object.h"
34 #include "i915_globals.h"
35 #include "i915_trace.h"
37 static struct i915_global_object
{
38 struct i915_global base
;
39 struct kmem_cache
*slab_objects
;
42 struct drm_i915_gem_object
*i915_gem_object_alloc(void)
44 return kmem_cache_zalloc(global
.slab_objects
, GFP_KERNEL
);
47 void i915_gem_object_free(struct drm_i915_gem_object
*obj
)
49 return kmem_cache_free(global
.slab_objects
, obj
);
52 void i915_gem_object_init(struct drm_i915_gem_object
*obj
,
53 const struct drm_i915_gem_object_ops
*ops
,
54 struct lock_class_key
*key
)
56 __mutex_init(&obj
->mm
.lock
, "obj->mm.lock", key
);
58 spin_lock_init(&obj
->vma
.lock
);
59 INIT_LIST_HEAD(&obj
->vma
.list
);
61 INIT_LIST_HEAD(&obj
->mm
.link
);
63 INIT_LIST_HEAD(&obj
->lut_list
);
65 spin_lock_init(&obj
->mmo
.lock
);
66 INIT_LIST_HEAD(&obj
->mmo
.offsets
);
68 init_rcu_head(&obj
->rcu
);
72 obj
->mm
.madv
= I915_MADV_WILLNEED
;
73 INIT_RADIX_TREE(&obj
->mm
.get_page
.radix
, GFP_KERNEL
| __GFP_NOWARN
);
74 mutex_init(&obj
->mm
.get_page
.lock
);
78 * Mark up the object's coherency levels for a given cache_level
79 * @obj: #drm_i915_gem_object
80 * @cache_level: cache level
82 void i915_gem_object_set_cache_coherency(struct drm_i915_gem_object
*obj
,
83 unsigned int cache_level
)
85 obj
->cache_level
= cache_level
;
87 if (cache_level
!= I915_CACHE_NONE
)
88 obj
->cache_coherent
= (I915_BO_CACHE_COHERENT_FOR_READ
|
89 I915_BO_CACHE_COHERENT_FOR_WRITE
);
90 else if (HAS_LLC(to_i915(obj
->base
.dev
)))
91 obj
->cache_coherent
= I915_BO_CACHE_COHERENT_FOR_READ
;
93 obj
->cache_coherent
= 0;
96 !(obj
->cache_coherent
& I915_BO_CACHE_COHERENT_FOR_WRITE
);
99 void i915_gem_close_object(struct drm_gem_object
*gem
, struct drm_file
*file
)
101 struct drm_i915_gem_object
*obj
= to_intel_bo(gem
);
102 struct drm_i915_file_private
*fpriv
= file
->driver_priv
;
103 struct i915_lut_handle
*lut
, *ln
;
104 struct i915_mmap_offset
*mmo
;
107 i915_gem_object_lock(obj
);
108 list_for_each_entry_safe(lut
, ln
, &obj
->lut_list
, obj_link
) {
109 struct i915_gem_context
*ctx
= lut
->ctx
;
111 if (ctx
->file_priv
!= fpriv
)
114 i915_gem_context_get(ctx
);
115 list_move(&lut
->obj_link
, &close
);
117 i915_gem_object_unlock(obj
);
119 spin_lock(&obj
->mmo
.lock
);
120 list_for_each_entry(mmo
, &obj
->mmo
.offsets
, offset
) {
121 if (mmo
->file
!= file
)
124 spin_unlock(&obj
->mmo
.lock
);
125 drm_vma_node_revoke(&mmo
->vma_node
, file
);
126 spin_lock(&obj
->mmo
.lock
);
128 spin_unlock(&obj
->mmo
.lock
);
130 list_for_each_entry_safe(lut
, ln
, &close
, obj_link
) {
131 struct i915_gem_context
*ctx
= lut
->ctx
;
132 struct i915_vma
*vma
;
135 * We allow the process to have multiple handles to the same
136 * vma, in the same fd namespace, by virtue of flink/open.
139 mutex_lock(&ctx
->mutex
);
140 vma
= radix_tree_delete(&ctx
->handles_vma
, lut
->handle
);
142 GEM_BUG_ON(vma
->obj
!= obj
);
143 GEM_BUG_ON(!atomic_read(&vma
->open_count
));
144 if (atomic_dec_and_test(&vma
->open_count
) &&
145 !i915_vma_is_ggtt(vma
))
148 mutex_unlock(&ctx
->mutex
);
150 i915_gem_context_put(lut
->ctx
);
151 i915_lut_handle_free(lut
);
152 i915_gem_object_put(obj
);
156 static void __i915_gem_free_object_rcu(struct rcu_head
*head
)
158 struct drm_i915_gem_object
*obj
=
159 container_of(head
, typeof(*obj
), rcu
);
160 struct drm_i915_private
*i915
= to_i915(obj
->base
.dev
);
162 dma_resv_fini(&obj
->base
._resv
);
163 i915_gem_object_free(obj
);
165 GEM_BUG_ON(!atomic_read(&i915
->mm
.free_count
));
166 atomic_dec(&i915
->mm
.free_count
);
169 static void __i915_gem_free_objects(struct drm_i915_private
*i915
,
170 struct llist_node
*freed
)
172 struct drm_i915_gem_object
*obj
, *on
;
173 intel_wakeref_t wakeref
;
175 wakeref
= intel_runtime_pm_get(&i915
->runtime_pm
);
176 llist_for_each_entry_safe(obj
, on
, freed
, freed
) {
177 struct i915_mmap_offset
*mmo
, *mn
;
179 trace_i915_gem_object_destroy(obj
);
181 if (!list_empty(&obj
->vma
.list
)) {
182 struct i915_vma
*vma
;
185 * Note that the vma keeps an object reference while
186 * it is active, so it *should* not sleep while we
187 * destroy it. Our debug code errs insits it *might*.
188 * For the moment, play along.
190 spin_lock(&obj
->vma
.lock
);
191 while ((vma
= list_first_entry_or_null(&obj
->vma
.list
,
194 GEM_BUG_ON(vma
->obj
!= obj
);
195 spin_unlock(&obj
->vma
.lock
);
199 spin_lock(&obj
->vma
.lock
);
201 spin_unlock(&obj
->vma
.lock
);
204 i915_gem_object_release_mmap(obj
);
206 list_for_each_entry_safe(mmo
, mn
, &obj
->mmo
.offsets
, offset
) {
207 drm_vma_offset_remove(obj
->base
.dev
->vma_offset_manager
,
211 INIT_LIST_HEAD(&obj
->mmo
.offsets
);
213 GEM_BUG_ON(atomic_read(&obj
->bind_count
));
214 GEM_BUG_ON(obj
->userfault_count
);
215 GEM_BUG_ON(!list_empty(&obj
->lut_list
));
217 atomic_set(&obj
->mm
.pages_pin_count
, 0);
218 __i915_gem_object_put_pages(obj
);
219 GEM_BUG_ON(i915_gem_object_has_pages(obj
));
220 bitmap_free(obj
->bit_17
);
222 if (obj
->base
.import_attach
)
223 drm_prime_gem_destroy(&obj
->base
, NULL
);
225 drm_gem_free_mmap_offset(&obj
->base
);
227 if (obj
->ops
->release
)
228 obj
->ops
->release(obj
);
230 /* But keep the pointer alive for RCU-protected lookups */
231 call_rcu(&obj
->rcu
, __i915_gem_free_object_rcu
);
233 intel_runtime_pm_put(&i915
->runtime_pm
, wakeref
);
236 void i915_gem_flush_free_objects(struct drm_i915_private
*i915
)
238 struct llist_node
*freed
= llist_del_all(&i915
->mm
.free_list
);
241 __i915_gem_free_objects(i915
, freed
);
244 static void __i915_gem_free_work(struct work_struct
*work
)
246 struct drm_i915_private
*i915
=
247 container_of(work
, struct drm_i915_private
, mm
.free_work
);
249 i915_gem_flush_free_objects(i915
);
252 void i915_gem_free_object(struct drm_gem_object
*gem_obj
)
254 struct drm_i915_gem_object
*obj
= to_intel_bo(gem_obj
);
255 struct drm_i915_private
*i915
= to_i915(obj
->base
.dev
);
257 GEM_BUG_ON(i915_gem_object_is_framebuffer(obj
));
260 * Before we free the object, make sure any pure RCU-only
261 * read-side critical sections are complete, e.g.
262 * i915_gem_busy_ioctl(). For the corresponding synchronized
263 * lookup see i915_gem_object_lookup_rcu().
265 atomic_inc(&i915
->mm
.free_count
);
268 * This serializes freeing with the shrinker. Since the free
269 * is delayed, first by RCU then by the workqueue, we want the
270 * shrinker to be able to free pages of unreferenced objects,
271 * or else we may oom whilst there are plenty of deferred
274 i915_gem_object_make_unshrinkable(obj
);
277 * Since we require blocking on struct_mutex to unbind the freed
278 * object from the GPU before releasing resources back to the
279 * system, we can not do that directly from the RCU callback (which may
280 * be a softirq context), but must instead then defer that work onto a
281 * kthread. We use the RCU callback rather than move the freed object
282 * directly onto the work queue so that we can mix between using the
283 * worker and performing frees directly from subsequent allocations for
284 * crude but effective memory throttling.
286 if (llist_add(&obj
->freed
, &i915
->mm
.free_list
))
287 queue_work(i915
->wq
, &i915
->mm
.free_work
);
290 static bool gpu_write_needs_clflush(struct drm_i915_gem_object
*obj
)
292 return !(obj
->cache_level
== I915_CACHE_NONE
||
293 obj
->cache_level
== I915_CACHE_WT
);
297 i915_gem_object_flush_write_domain(struct drm_i915_gem_object
*obj
,
298 unsigned int flush_domains
)
300 struct i915_vma
*vma
;
302 assert_object_held(obj
);
304 if (!(obj
->write_domain
& flush_domains
))
307 switch (obj
->write_domain
) {
308 case I915_GEM_DOMAIN_GTT
:
309 spin_lock(&obj
->vma
.lock
);
310 for_each_ggtt_vma(vma
, obj
) {
311 if (i915_vma_unset_ggtt_write(vma
))
312 intel_gt_flush_ggtt_writes(vma
->vm
->gt
);
314 spin_unlock(&obj
->vma
.lock
);
316 i915_gem_object_flush_frontbuffer(obj
, ORIGIN_CPU
);
319 case I915_GEM_DOMAIN_WC
:
323 case I915_GEM_DOMAIN_CPU
:
324 i915_gem_clflush_object(obj
, I915_CLFLUSH_SYNC
);
327 case I915_GEM_DOMAIN_RENDER
:
328 if (gpu_write_needs_clflush(obj
))
329 obj
->cache_dirty
= true;
333 obj
->write_domain
= 0;
336 void __i915_gem_object_flush_frontbuffer(struct drm_i915_gem_object
*obj
,
337 enum fb_op_origin origin
)
339 struct intel_frontbuffer
*front
;
341 front
= __intel_frontbuffer_get(obj
);
343 intel_frontbuffer_flush(front
, origin
);
344 intel_frontbuffer_put(front
);
348 void __i915_gem_object_invalidate_frontbuffer(struct drm_i915_gem_object
*obj
,
349 enum fb_op_origin origin
)
351 struct intel_frontbuffer
*front
;
353 front
= __intel_frontbuffer_get(obj
);
355 intel_frontbuffer_invalidate(front
, origin
);
356 intel_frontbuffer_put(front
);
360 void i915_gem_init__objects(struct drm_i915_private
*i915
)
362 INIT_WORK(&i915
->mm
.free_work
, __i915_gem_free_work
);
365 static void i915_global_objects_shrink(void)
367 kmem_cache_shrink(global
.slab_objects
);
370 static void i915_global_objects_exit(void)
372 kmem_cache_destroy(global
.slab_objects
);
375 static struct i915_global_object global
= { {
376 .shrink
= i915_global_objects_shrink
,
377 .exit
= i915_global_objects_exit
,
380 int __init
i915_global_objects_init(void)
382 global
.slab_objects
=
383 KMEM_CACHE(drm_i915_gem_object
, SLAB_HWCACHE_ALIGN
);
384 if (!global
.slab_objects
)
387 i915_global_register(&global
.base
);
391 #if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
392 #include "selftests/huge_gem_object.c"
393 #include "selftests/huge_pages.c"
394 #include "selftests/i915_gem_object.c"
395 #include "selftests/i915_gem_coherency.c"