2 * Copyright © 2016 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/list_sort.h>
26 #include <linux/prime_numbers.h>
28 #include "gem/i915_gem_context.h"
29 #include "gem/selftests/mock_context.h"
30 #include "gt/intel_context.h"
32 #include "i915_random.h"
33 #include "i915_selftest.h"
36 #include "mock_gem_device.h"
38 #include "igt_flush_test.h"
40 static void cleanup_freed_objects(struct drm_i915_private
*i915
)
42 i915_gem_drain_freed_objects(i915
);
45 static void fake_free_pages(struct drm_i915_gem_object
*obj
,
46 struct sg_table
*pages
)
52 static int fake_get_pages(struct drm_i915_gem_object
*obj
)
54 #define GFP (GFP_KERNEL | __GFP_NOWARN | __GFP_NORETRY)
55 #define PFN_BIAS 0x1000
56 struct sg_table
*pages
;
57 struct scatterlist
*sg
;
58 unsigned int sg_page_sizes
;
59 typeof(obj
->base
.size
) rem
;
61 pages
= kmalloc(sizeof(*pages
), GFP
);
65 rem
= round_up(obj
->base
.size
, BIT(31)) >> 31;
66 if (sg_alloc_table(pages
, rem
, GFP
)) {
73 for (sg
= pages
->sgl
; sg
; sg
= sg_next(sg
)) {
74 unsigned long len
= min_t(typeof(rem
), rem
, BIT(31));
77 sg_set_page(sg
, pfn_to_page(PFN_BIAS
), len
, 0);
78 sg_dma_address(sg
) = page_to_phys(sg_page(sg
));
86 __i915_gem_object_set_pages(obj
, pages
, sg_page_sizes
);
92 static void fake_put_pages(struct drm_i915_gem_object
*obj
,
93 struct sg_table
*pages
)
95 fake_free_pages(obj
, pages
);
96 obj
->mm
.dirty
= false;
99 static const struct drm_i915_gem_object_ops fake_ops
= {
101 .flags
= I915_GEM_OBJECT_IS_SHRINKABLE
,
102 .get_pages
= fake_get_pages
,
103 .put_pages
= fake_put_pages
,
106 static struct drm_i915_gem_object
*
107 fake_dma_object(struct drm_i915_private
*i915
, u64 size
)
109 static struct lock_class_key lock_class
;
110 struct drm_i915_gem_object
*obj
;
113 GEM_BUG_ON(!IS_ALIGNED(size
, I915_GTT_PAGE_SIZE
));
115 if (overflows_type(size
, obj
->base
.size
))
116 return ERR_PTR(-E2BIG
);
118 obj
= i915_gem_object_alloc();
122 drm_gem_private_object_init(&i915
->drm
, &obj
->base
, size
);
123 i915_gem_object_init(obj
, &fake_ops
, &lock_class
);
125 i915_gem_object_set_volatile(obj
);
127 obj
->write_domain
= I915_GEM_DOMAIN_CPU
;
128 obj
->read_domains
= I915_GEM_DOMAIN_CPU
;
129 obj
->cache_level
= I915_CACHE_NONE
;
131 /* Preallocate the "backing storage" */
132 if (i915_gem_object_pin_pages(obj
))
135 i915_gem_object_unpin_pages(obj
);
139 i915_gem_object_put(obj
);
141 return ERR_PTR(-ENOMEM
);
144 static int igt_ppgtt_alloc(void *arg
)
146 struct drm_i915_private
*dev_priv
= arg
;
147 struct i915_ppgtt
*ppgtt
;
148 u64 size
, last
, limit
;
151 /* Allocate a ppggt and try to fill the entire range */
153 if (!HAS_PPGTT(dev_priv
))
156 ppgtt
= i915_ppgtt_create(&dev_priv
->gt
);
158 return PTR_ERR(ppgtt
);
160 if (!ppgtt
->vm
.allocate_va_range
)
161 goto err_ppgtt_cleanup
;
164 * While we only allocate the page tables here and so we could
165 * address a much larger GTT than we could actually fit into
166 * RAM, a practical limit is the amount of physical pages in the system.
167 * This should ensure that we do not run into the oomkiller during
168 * the test and take down the machine wilfully.
170 limit
= totalram_pages() << PAGE_SHIFT
;
171 limit
= min(ppgtt
->vm
.total
, limit
);
173 /* Check we can allocate the entire range */
174 for (size
= 4096; size
<= limit
; size
<<= 2) {
175 struct i915_vm_pt_stash stash
= {};
177 err
= i915_vm_alloc_pt_stash(&ppgtt
->vm
, &stash
, size
);
179 goto err_ppgtt_cleanup
;
181 err
= i915_vm_pin_pt_stash(&ppgtt
->vm
, &stash
);
183 i915_vm_free_pt_stash(&ppgtt
->vm
, &stash
);
184 goto err_ppgtt_cleanup
;
187 ppgtt
->vm
.allocate_va_range(&ppgtt
->vm
, &stash
, 0, size
);
190 ppgtt
->vm
.clear_range(&ppgtt
->vm
, 0, size
);
192 i915_vm_free_pt_stash(&ppgtt
->vm
, &stash
);
195 /* Check we can incrementally allocate the entire range */
196 for (last
= 0, size
= 4096; size
<= limit
; last
= size
, size
<<= 2) {
197 struct i915_vm_pt_stash stash
= {};
199 err
= i915_vm_alloc_pt_stash(&ppgtt
->vm
, &stash
, size
- last
);
201 goto err_ppgtt_cleanup
;
203 err
= i915_vm_pin_pt_stash(&ppgtt
->vm
, &stash
);
205 i915_vm_free_pt_stash(&ppgtt
->vm
, &stash
);
206 goto err_ppgtt_cleanup
;
209 ppgtt
->vm
.allocate_va_range(&ppgtt
->vm
, &stash
,
213 i915_vm_free_pt_stash(&ppgtt
->vm
, &stash
);
217 i915_vm_put(&ppgtt
->vm
);
221 static int lowlevel_hole(struct i915_address_space
*vm
,
222 u64 hole_start
, u64 hole_end
,
223 unsigned long end_time
)
225 I915_RND_STATE(seed_prng
);
226 struct i915_vma
*mock_vma
;
229 mock_vma
= kzalloc(sizeof(*mock_vma
), GFP_KERNEL
);
233 /* Keep creating larger objects until one cannot fit into the hole */
234 for (size
= 12; (hole_end
- hole_start
) >> size
; size
++) {
235 I915_RND_SUBSTATE(prng
, seed_prng
);
236 struct drm_i915_gem_object
*obj
;
237 unsigned int *order
, count
, n
;
240 hole_size
= (hole_end
- hole_start
) >> size
;
241 if (hole_size
> KMALLOC_MAX_SIZE
/ sizeof(u32
))
242 hole_size
= KMALLOC_MAX_SIZE
/ sizeof(u32
);
243 count
= hole_size
>> 1;
245 pr_debug("%s: hole is too small [%llx - %llx] >> %d: %lld\n",
246 __func__
, hole_start
, hole_end
, size
, hole_size
);
251 order
= i915_random_order(count
, &prng
);
254 } while (count
>>= 1);
261 GEM_BUG_ON(count
* BIT_ULL(size
) > vm
->total
);
262 GEM_BUG_ON(hole_start
+ count
* BIT_ULL(size
) > hole_end
);
264 /* Ignore allocation failures (i.e. don't report them as
265 * a test failure) as we are purposefully allocating very
266 * large objects without checking that we have sufficient
267 * memory. We expect to hit -ENOMEM.
270 obj
= fake_dma_object(vm
->i915
, BIT_ULL(size
));
276 GEM_BUG_ON(obj
->base
.size
!= BIT_ULL(size
));
278 if (i915_gem_object_pin_pages(obj
)) {
279 i915_gem_object_put(obj
);
284 for (n
= 0; n
< count
; n
++) {
285 u64 addr
= hole_start
+ order
[n
] * BIT_ULL(size
);
286 intel_wakeref_t wakeref
;
288 GEM_BUG_ON(addr
+ BIT_ULL(size
) > vm
->total
);
290 if (igt_timeout(end_time
,
291 "%s timed out before %d/%d\n",
292 __func__
, n
, count
)) {
293 hole_end
= hole_start
; /* quit */
297 if (vm
->allocate_va_range
) {
298 struct i915_vm_pt_stash stash
= {};
300 if (i915_vm_alloc_pt_stash(vm
, &stash
,
304 if (i915_vm_pin_pt_stash(vm
, &stash
)) {
305 i915_vm_free_pt_stash(vm
, &stash
);
309 vm
->allocate_va_range(vm
, &stash
,
310 addr
, BIT_ULL(size
));
312 i915_vm_free_pt_stash(vm
, &stash
);
315 mock_vma
->pages
= obj
->mm
.pages
;
316 mock_vma
->node
.size
= BIT_ULL(size
);
317 mock_vma
->node
.start
= addr
;
319 with_intel_runtime_pm(vm
->gt
->uncore
->rpm
, wakeref
)
320 vm
->insert_entries(vm
, mock_vma
,
325 i915_random_reorder(order
, count
, &prng
);
326 for (n
= 0; n
< count
; n
++) {
327 u64 addr
= hole_start
+ order
[n
] * BIT_ULL(size
);
328 intel_wakeref_t wakeref
;
330 GEM_BUG_ON(addr
+ BIT_ULL(size
) > vm
->total
);
331 with_intel_runtime_pm(vm
->gt
->uncore
->rpm
, wakeref
)
332 vm
->clear_range(vm
, addr
, BIT_ULL(size
));
335 i915_gem_object_unpin_pages(obj
);
336 i915_gem_object_put(obj
);
340 cleanup_freed_objects(vm
->i915
);
347 static void close_object_list(struct list_head
*objects
,
348 struct i915_address_space
*vm
)
350 struct drm_i915_gem_object
*obj
, *on
;
353 list_for_each_entry_safe(obj
, on
, objects
, st_link
) {
354 struct i915_vma
*vma
;
356 vma
= i915_vma_instance(obj
, vm
, NULL
);
358 ignored
= i915_vma_unbind(vma
);
360 list_del(&obj
->st_link
);
361 i915_gem_object_put(obj
);
365 static int fill_hole(struct i915_address_space
*vm
,
366 u64 hole_start
, u64 hole_end
,
367 unsigned long end_time
)
369 const u64 hole_size
= hole_end
- hole_start
;
370 struct drm_i915_gem_object
*obj
;
371 const unsigned long max_pages
=
372 min_t(u64
, ULONG_MAX
- 1, hole_size
/2 >> PAGE_SHIFT
);
373 const unsigned long max_step
= max(int_sqrt(max_pages
), 2UL);
374 unsigned long npages
, prime
, flags
;
375 struct i915_vma
*vma
;
379 /* Try binding many VMA working inwards from either edge */
381 flags
= PIN_OFFSET_FIXED
| PIN_USER
;
382 if (i915_is_ggtt(vm
))
385 for_each_prime_number_from(prime
, 2, max_step
) {
386 for (npages
= 1; npages
<= max_pages
; npages
*= prime
) {
387 const u64 full_size
= npages
<< PAGE_SHIFT
;
393 { "top-down", hole_end
, -1, },
394 { "bottom-up", hole_start
, 1, },
398 obj
= fake_dma_object(vm
->i915
, full_size
);
402 list_add(&obj
->st_link
, &objects
);
404 /* Align differing sized objects against the edges, and
405 * check we don't walk off into the void when binding
408 for (p
= phases
; p
->name
; p
++) {
412 list_for_each_entry(obj
, &objects
, st_link
) {
413 vma
= i915_vma_instance(obj
, vm
, NULL
);
418 if (offset
< hole_start
+ obj
->base
.size
)
420 offset
-= obj
->base
.size
;
423 err
= i915_vma_pin(vma
, 0, 0, offset
| flags
);
425 pr_err("%s(%s) pin (forward) failed with err=%d on size=%lu pages (prime=%lu), offset=%llx\n",
426 __func__
, p
->name
, err
, npages
, prime
, offset
);
430 if (!drm_mm_node_allocated(&vma
->node
) ||
431 i915_vma_misplaced(vma
, 0, 0, offset
| flags
)) {
432 pr_err("%s(%s) (forward) insert failed: vma.node=%llx + %llx [allocated? %d], expected offset %llx\n",
433 __func__
, p
->name
, vma
->node
.start
, vma
->node
.size
, drm_mm_node_allocated(&vma
->node
),
442 if (offset
+ obj
->base
.size
> hole_end
)
444 offset
+= obj
->base
.size
;
449 list_for_each_entry(obj
, &objects
, st_link
) {
450 vma
= i915_vma_instance(obj
, vm
, NULL
);
455 if (offset
< hole_start
+ obj
->base
.size
)
457 offset
-= obj
->base
.size
;
460 if (!drm_mm_node_allocated(&vma
->node
) ||
461 i915_vma_misplaced(vma
, 0, 0, offset
| flags
)) {
462 pr_err("%s(%s) (forward) moved vma.node=%llx + %llx, expected offset %llx\n",
463 __func__
, p
->name
, vma
->node
.start
, vma
->node
.size
,
469 err
= i915_vma_unbind(vma
);
471 pr_err("%s(%s) (forward) unbind of vma.node=%llx + %llx failed with err=%d\n",
472 __func__
, p
->name
, vma
->node
.start
, vma
->node
.size
,
478 if (offset
+ obj
->base
.size
> hole_end
)
480 offset
+= obj
->base
.size
;
485 list_for_each_entry_reverse(obj
, &objects
, st_link
) {
486 vma
= i915_vma_instance(obj
, vm
, NULL
);
491 if (offset
< hole_start
+ obj
->base
.size
)
493 offset
-= obj
->base
.size
;
496 err
= i915_vma_pin(vma
, 0, 0, offset
| flags
);
498 pr_err("%s(%s) pin (backward) failed with err=%d on size=%lu pages (prime=%lu), offset=%llx\n",
499 __func__
, p
->name
, err
, npages
, prime
, offset
);
503 if (!drm_mm_node_allocated(&vma
->node
) ||
504 i915_vma_misplaced(vma
, 0, 0, offset
| flags
)) {
505 pr_err("%s(%s) (backward) insert failed: vma.node=%llx + %llx [allocated? %d], expected offset %llx\n",
506 __func__
, p
->name
, vma
->node
.start
, vma
->node
.size
, drm_mm_node_allocated(&vma
->node
),
515 if (offset
+ obj
->base
.size
> hole_end
)
517 offset
+= obj
->base
.size
;
522 list_for_each_entry_reverse(obj
, &objects
, st_link
) {
523 vma
= i915_vma_instance(obj
, vm
, NULL
);
528 if (offset
< hole_start
+ obj
->base
.size
)
530 offset
-= obj
->base
.size
;
533 if (!drm_mm_node_allocated(&vma
->node
) ||
534 i915_vma_misplaced(vma
, 0, 0, offset
| flags
)) {
535 pr_err("%s(%s) (backward) moved vma.node=%llx + %llx [allocated? %d], expected offset %llx\n",
536 __func__
, p
->name
, vma
->node
.start
, vma
->node
.size
, drm_mm_node_allocated(&vma
->node
),
542 err
= i915_vma_unbind(vma
);
544 pr_err("%s(%s) (backward) unbind of vma.node=%llx + %llx failed with err=%d\n",
545 __func__
, p
->name
, vma
->node
.start
, vma
->node
.size
,
551 if (offset
+ obj
->base
.size
> hole_end
)
553 offset
+= obj
->base
.size
;
558 if (igt_timeout(end_time
, "%s timed out (npages=%lu, prime=%lu)\n",
559 __func__
, npages
, prime
)) {
565 close_object_list(&objects
, vm
);
566 cleanup_freed_objects(vm
->i915
);
572 close_object_list(&objects
, vm
);
576 static int walk_hole(struct i915_address_space
*vm
,
577 u64 hole_start
, u64 hole_end
,
578 unsigned long end_time
)
580 const u64 hole_size
= hole_end
- hole_start
;
581 const unsigned long max_pages
=
582 min_t(u64
, ULONG_MAX
- 1, hole_size
>> PAGE_SHIFT
);
586 /* Try binding a single VMA in different positions within the hole */
588 flags
= PIN_OFFSET_FIXED
| PIN_USER
;
589 if (i915_is_ggtt(vm
))
592 for_each_prime_number_from(size
, 1, max_pages
) {
593 struct drm_i915_gem_object
*obj
;
594 struct i915_vma
*vma
;
598 obj
= fake_dma_object(vm
->i915
, size
<< PAGE_SHIFT
);
602 vma
= i915_vma_instance(obj
, vm
, NULL
);
608 for (addr
= hole_start
;
609 addr
+ obj
->base
.size
< hole_end
;
610 addr
+= obj
->base
.size
) {
611 err
= i915_vma_pin(vma
, 0, 0, addr
| flags
);
613 pr_err("%s bind failed at %llx + %llx [hole %llx- %llx] with err=%d\n",
614 __func__
, addr
, vma
->size
,
615 hole_start
, hole_end
, err
);
620 if (!drm_mm_node_allocated(&vma
->node
) ||
621 i915_vma_misplaced(vma
, 0, 0, addr
| flags
)) {
622 pr_err("%s incorrect at %llx + %llx\n",
623 __func__
, addr
, vma
->size
);
628 err
= i915_vma_unbind(vma
);
630 pr_err("%s unbind failed at %llx + %llx with err=%d\n",
631 __func__
, addr
, vma
->size
, err
);
635 GEM_BUG_ON(drm_mm_node_allocated(&vma
->node
));
637 if (igt_timeout(end_time
,
638 "%s timed out at %llx\n",
646 i915_gem_object_put(obj
);
650 cleanup_freed_objects(vm
->i915
);
656 static int pot_hole(struct i915_address_space
*vm
,
657 u64 hole_start
, u64 hole_end
,
658 unsigned long end_time
)
660 struct drm_i915_gem_object
*obj
;
661 struct i915_vma
*vma
;
666 flags
= PIN_OFFSET_FIXED
| PIN_USER
;
667 if (i915_is_ggtt(vm
))
670 obj
= i915_gem_object_create_internal(vm
->i915
, 2 * I915_GTT_PAGE_SIZE
);
674 vma
= i915_vma_instance(obj
, vm
, NULL
);
680 /* Insert a pair of pages across every pot boundary within the hole */
681 for (pot
= fls64(hole_end
- 1) - 1;
682 pot
> ilog2(2 * I915_GTT_PAGE_SIZE
);
684 u64 step
= BIT_ULL(pot
);
687 for (addr
= round_up(hole_start
+ I915_GTT_PAGE_SIZE
, step
) - I915_GTT_PAGE_SIZE
;
688 addr
<= round_down(hole_end
- 2*I915_GTT_PAGE_SIZE
, step
) - I915_GTT_PAGE_SIZE
;
690 err
= i915_vma_pin(vma
, 0, 0, addr
| flags
);
692 pr_err("%s failed to pin object at %llx in hole [%llx - %llx], with err=%d\n",
695 hole_start
, hole_end
,
700 if (!drm_mm_node_allocated(&vma
->node
) ||
701 i915_vma_misplaced(vma
, 0, 0, addr
| flags
)) {
702 pr_err("%s incorrect at %llx + %llx\n",
703 __func__
, addr
, vma
->size
);
705 err
= i915_vma_unbind(vma
);
711 err
= i915_vma_unbind(vma
);
715 if (igt_timeout(end_time
,
716 "%s timed out after %d/%d\n",
717 __func__
, pot
, fls64(hole_end
- 1) - 1)) {
724 i915_gem_object_put(obj
);
728 static int drunk_hole(struct i915_address_space
*vm
,
729 u64 hole_start
, u64 hole_end
,
730 unsigned long end_time
)
732 I915_RND_STATE(prng
);
736 flags
= PIN_OFFSET_FIXED
| PIN_USER
;
737 if (i915_is_ggtt(vm
))
740 /* Keep creating larger objects until one cannot fit into the hole */
741 for (size
= 12; (hole_end
- hole_start
) >> size
; size
++) {
742 struct drm_i915_gem_object
*obj
;
743 unsigned int *order
, count
, n
;
744 struct i915_vma
*vma
;
748 hole_size
= (hole_end
- hole_start
) >> size
;
749 if (hole_size
> KMALLOC_MAX_SIZE
/ sizeof(u32
))
750 hole_size
= KMALLOC_MAX_SIZE
/ sizeof(u32
);
751 count
= hole_size
>> 1;
753 pr_debug("%s: hole is too small [%llx - %llx] >> %d: %lld\n",
754 __func__
, hole_start
, hole_end
, size
, hole_size
);
759 order
= i915_random_order(count
, &prng
);
762 } while (count
>>= 1);
767 /* Ignore allocation failures (i.e. don't report them as
768 * a test failure) as we are purposefully allocating very
769 * large objects without checking that we have sufficient
770 * memory. We expect to hit -ENOMEM.
773 obj
= fake_dma_object(vm
->i915
, BIT_ULL(size
));
779 vma
= i915_vma_instance(obj
, vm
, NULL
);
785 GEM_BUG_ON(vma
->size
!= BIT_ULL(size
));
787 for (n
= 0; n
< count
; n
++) {
788 u64 addr
= hole_start
+ order
[n
] * BIT_ULL(size
);
790 err
= i915_vma_pin(vma
, 0, 0, addr
| flags
);
792 pr_err("%s failed to pin object at %llx + %llx in hole [%llx - %llx], with err=%d\n",
795 hole_start
, hole_end
,
800 if (!drm_mm_node_allocated(&vma
->node
) ||
801 i915_vma_misplaced(vma
, 0, 0, addr
| flags
)) {
802 pr_err("%s incorrect at %llx + %llx\n",
803 __func__
, addr
, BIT_ULL(size
));
805 err
= i915_vma_unbind(vma
);
811 err
= i915_vma_unbind(vma
);
814 if (igt_timeout(end_time
,
815 "%s timed out after %d/%d\n",
816 __func__
, n
, count
)) {
823 i915_gem_object_put(obj
);
828 cleanup_freed_objects(vm
->i915
);
834 static int __shrink_hole(struct i915_address_space
*vm
,
835 u64 hole_start
, u64 hole_end
,
836 unsigned long end_time
)
838 struct drm_i915_gem_object
*obj
;
839 unsigned long flags
= PIN_OFFSET_FIXED
| PIN_USER
;
840 unsigned int order
= 12;
845 /* Keep creating larger objects until one cannot fit into the hole */
846 for (addr
= hole_start
; addr
< hole_end
; ) {
847 struct i915_vma
*vma
;
848 u64 size
= BIT_ULL(order
++);
850 size
= min(size
, hole_end
- addr
);
851 obj
= fake_dma_object(vm
->i915
, size
);
857 list_add(&obj
->st_link
, &objects
);
859 vma
= i915_vma_instance(obj
, vm
, NULL
);
865 GEM_BUG_ON(vma
->size
!= size
);
867 err
= i915_vma_pin(vma
, 0, 0, addr
| flags
);
869 pr_err("%s failed to pin object at %llx + %llx in hole [%llx - %llx], with err=%d\n",
870 __func__
, addr
, size
, hole_start
, hole_end
, err
);
874 if (!drm_mm_node_allocated(&vma
->node
) ||
875 i915_vma_misplaced(vma
, 0, 0, addr
| flags
)) {
876 pr_err("%s incorrect at %llx + %llx\n",
877 __func__
, addr
, size
);
879 err
= i915_vma_unbind(vma
);
888 * Since we are injecting allocation faults at random intervals,
889 * wait for this allocation to complete before we change the
892 err
= i915_vma_sync(vma
);
896 if (igt_timeout(end_time
,
897 "%s timed out at ofset %llx [%llx - %llx]\n",
898 __func__
, addr
, hole_start
, hole_end
)) {
904 close_object_list(&objects
, vm
);
905 cleanup_freed_objects(vm
->i915
);
909 static int shrink_hole(struct i915_address_space
*vm
,
910 u64 hole_start
, u64 hole_end
,
911 unsigned long end_time
)
916 vm
->fault_attr
.probability
= 999;
917 atomic_set(&vm
->fault_attr
.times
, -1);
919 for_each_prime_number_from(prime
, 0, ULONG_MAX
- 1) {
920 vm
->fault_attr
.interval
= prime
;
921 err
= __shrink_hole(vm
, hole_start
, hole_end
, end_time
);
926 memset(&vm
->fault_attr
, 0, sizeof(vm
->fault_attr
));
931 static int shrink_boom(struct i915_address_space
*vm
,
932 u64 hole_start
, u64 hole_end
,
933 unsigned long end_time
)
935 unsigned int sizes
[] = { SZ_2M
, SZ_1G
};
936 struct drm_i915_gem_object
*purge
;
937 struct drm_i915_gem_object
*explode
;
942 * Catch the case which shrink_hole seems to miss. The setup here
943 * requires invoking the shrinker as we do the alloc_pt/alloc_pd, while
944 * ensuring that all vma assiocated with the respective pd/pdp are
945 * unpinned at the time.
948 for (i
= 0; i
< ARRAY_SIZE(sizes
); ++i
) {
949 unsigned int flags
= PIN_USER
| PIN_OFFSET_FIXED
;
950 unsigned int size
= sizes
[i
];
951 struct i915_vma
*vma
;
953 purge
= fake_dma_object(vm
->i915
, size
);
955 return PTR_ERR(purge
);
957 vma
= i915_vma_instance(purge
, vm
, NULL
);
963 err
= i915_vma_pin(vma
, 0, 0, flags
);
967 /* Should now be ripe for purging */
970 explode
= fake_dma_object(vm
->i915
, size
);
971 if (IS_ERR(explode
)) {
972 err
= PTR_ERR(explode
);
976 vm
->fault_attr
.probability
= 100;
977 vm
->fault_attr
.interval
= 1;
978 atomic_set(&vm
->fault_attr
.times
, -1);
980 vma
= i915_vma_instance(explode
, vm
, NULL
);
986 err
= i915_vma_pin(vma
, 0, 0, flags
| size
);
992 i915_gem_object_put(purge
);
993 i915_gem_object_put(explode
);
995 memset(&vm
->fault_attr
, 0, sizeof(vm
->fault_attr
));
996 cleanup_freed_objects(vm
->i915
);
1002 i915_gem_object_put(explode
);
1004 i915_gem_object_put(purge
);
1005 memset(&vm
->fault_attr
, 0, sizeof(vm
->fault_attr
));
1009 static int exercise_ppgtt(struct drm_i915_private
*dev_priv
,
1010 int (*func
)(struct i915_address_space
*vm
,
1011 u64 hole_start
, u64 hole_end
,
1012 unsigned long end_time
))
1014 struct i915_ppgtt
*ppgtt
;
1015 IGT_TIMEOUT(end_time
);
1019 if (!HAS_FULL_PPGTT(dev_priv
))
1022 file
= mock_file(dev_priv
);
1024 return PTR_ERR(file
);
1026 ppgtt
= i915_ppgtt_create(&dev_priv
->gt
);
1027 if (IS_ERR(ppgtt
)) {
1028 err
= PTR_ERR(ppgtt
);
1031 GEM_BUG_ON(offset_in_page(ppgtt
->vm
.total
));
1032 GEM_BUG_ON(!atomic_read(&ppgtt
->vm
.open
));
1034 err
= func(&ppgtt
->vm
, 0, ppgtt
->vm
.total
, end_time
);
1036 i915_vm_put(&ppgtt
->vm
);
1043 static int igt_ppgtt_fill(void *arg
)
1045 return exercise_ppgtt(arg
, fill_hole
);
1048 static int igt_ppgtt_walk(void *arg
)
1050 return exercise_ppgtt(arg
, walk_hole
);
1053 static int igt_ppgtt_pot(void *arg
)
1055 return exercise_ppgtt(arg
, pot_hole
);
1058 static int igt_ppgtt_drunk(void *arg
)
1060 return exercise_ppgtt(arg
, drunk_hole
);
1063 static int igt_ppgtt_lowlevel(void *arg
)
1065 return exercise_ppgtt(arg
, lowlevel_hole
);
1068 static int igt_ppgtt_shrink(void *arg
)
1070 return exercise_ppgtt(arg
, shrink_hole
);
1073 static int igt_ppgtt_shrink_boom(void *arg
)
1075 return exercise_ppgtt(arg
, shrink_boom
);
1078 static int sort_holes(void *priv
, struct list_head
*A
, struct list_head
*B
)
1080 struct drm_mm_node
*a
= list_entry(A
, typeof(*a
), hole_stack
);
1081 struct drm_mm_node
*b
= list_entry(B
, typeof(*b
), hole_stack
);
1083 if (a
->start
< b
->start
)
1089 static int exercise_ggtt(struct drm_i915_private
*i915
,
1090 int (*func
)(struct i915_address_space
*vm
,
1091 u64 hole_start
, u64 hole_end
,
1092 unsigned long end_time
))
1094 struct i915_ggtt
*ggtt
= &i915
->ggtt
;
1095 u64 hole_start
, hole_end
, last
= 0;
1096 struct drm_mm_node
*node
;
1097 IGT_TIMEOUT(end_time
);
1101 list_sort(NULL
, &ggtt
->vm
.mm
.hole_stack
, sort_holes
);
1102 drm_mm_for_each_hole(node
, &ggtt
->vm
.mm
, hole_start
, hole_end
) {
1103 if (hole_start
< last
)
1106 if (ggtt
->vm
.mm
.color_adjust
)
1107 ggtt
->vm
.mm
.color_adjust(node
, 0,
1108 &hole_start
, &hole_end
);
1109 if (hole_start
>= hole_end
)
1112 err
= func(&ggtt
->vm
, hole_start
, hole_end
, end_time
);
1116 /* As we have manipulated the drm_mm, the list may be corrupt */
1124 static int igt_ggtt_fill(void *arg
)
1126 return exercise_ggtt(arg
, fill_hole
);
1129 static int igt_ggtt_walk(void *arg
)
1131 return exercise_ggtt(arg
, walk_hole
);
1134 static int igt_ggtt_pot(void *arg
)
1136 return exercise_ggtt(arg
, pot_hole
);
1139 static int igt_ggtt_drunk(void *arg
)
1141 return exercise_ggtt(arg
, drunk_hole
);
1144 static int igt_ggtt_lowlevel(void *arg
)
1146 return exercise_ggtt(arg
, lowlevel_hole
);
1149 static int igt_ggtt_page(void *arg
)
1151 const unsigned int count
= PAGE_SIZE
/sizeof(u32
);
1152 I915_RND_STATE(prng
);
1153 struct drm_i915_private
*i915
= arg
;
1154 struct i915_ggtt
*ggtt
= &i915
->ggtt
;
1155 struct drm_i915_gem_object
*obj
;
1156 intel_wakeref_t wakeref
;
1157 struct drm_mm_node tmp
;
1158 unsigned int *order
, n
;
1161 if (!i915_ggtt_has_aperture(ggtt
))
1164 obj
= i915_gem_object_create_internal(i915
, PAGE_SIZE
);
1166 return PTR_ERR(obj
);
1168 err
= i915_gem_object_pin_pages(obj
);
1172 memset(&tmp
, 0, sizeof(tmp
));
1173 mutex_lock(&ggtt
->vm
.mutex
);
1174 err
= drm_mm_insert_node_in_range(&ggtt
->vm
.mm
, &tmp
,
1175 count
* PAGE_SIZE
, 0,
1176 I915_COLOR_UNEVICTABLE
,
1177 0, ggtt
->mappable_end
,
1179 mutex_unlock(&ggtt
->vm
.mutex
);
1183 wakeref
= intel_runtime_pm_get(&i915
->runtime_pm
);
1185 for (n
= 0; n
< count
; n
++) {
1186 u64 offset
= tmp
.start
+ n
* PAGE_SIZE
;
1188 ggtt
->vm
.insert_page(&ggtt
->vm
,
1189 i915_gem_object_get_dma_address(obj
, 0),
1190 offset
, I915_CACHE_NONE
, 0);
1193 order
= i915_random_order(count
, &prng
);
1199 for (n
= 0; n
< count
; n
++) {
1200 u64 offset
= tmp
.start
+ order
[n
] * PAGE_SIZE
;
1203 vaddr
= io_mapping_map_atomic_wc(&ggtt
->iomap
, offset
);
1204 iowrite32(n
, vaddr
+ n
);
1205 io_mapping_unmap_atomic(vaddr
);
1207 intel_gt_flush_ggtt_writes(ggtt
->vm
.gt
);
1209 i915_random_reorder(order
, count
, &prng
);
1210 for (n
= 0; n
< count
; n
++) {
1211 u64 offset
= tmp
.start
+ order
[n
] * PAGE_SIZE
;
1215 vaddr
= io_mapping_map_atomic_wc(&ggtt
->iomap
, offset
);
1216 val
= ioread32(vaddr
+ n
);
1217 io_mapping_unmap_atomic(vaddr
);
1220 pr_err("insert page failed: found %d, expected %d\n",
1229 ggtt
->vm
.clear_range(&ggtt
->vm
, tmp
.start
, tmp
.size
);
1230 intel_runtime_pm_put(&i915
->runtime_pm
, wakeref
);
1231 mutex_lock(&ggtt
->vm
.mutex
);
1232 drm_mm_remove_node(&tmp
);
1233 mutex_unlock(&ggtt
->vm
.mutex
);
1235 i915_gem_object_unpin_pages(obj
);
1237 i915_gem_object_put(obj
);
1241 static void track_vma_bind(struct i915_vma
*vma
)
1243 struct drm_i915_gem_object
*obj
= vma
->obj
;
1245 __i915_gem_object_pin_pages(obj
);
1247 GEM_BUG_ON(vma
->pages
);
1248 atomic_set(&vma
->pages_count
, I915_VMA_PAGES_ACTIVE
);
1249 __i915_gem_object_pin_pages(obj
);
1250 vma
->pages
= obj
->mm
.pages
;
1252 mutex_lock(&vma
->vm
->mutex
);
1253 list_add_tail(&vma
->vm_link
, &vma
->vm
->bound_list
);
1254 mutex_unlock(&vma
->vm
->mutex
);
1257 static int exercise_mock(struct drm_i915_private
*i915
,
1258 int (*func
)(struct i915_address_space
*vm
,
1259 u64 hole_start
, u64 hole_end
,
1260 unsigned long end_time
))
1262 const u64 limit
= totalram_pages() << PAGE_SHIFT
;
1263 struct i915_address_space
*vm
;
1264 struct i915_gem_context
*ctx
;
1265 IGT_TIMEOUT(end_time
);
1268 ctx
= mock_context(i915
, "mock");
1272 vm
= i915_gem_context_get_vm_rcu(ctx
);
1273 err
= func(vm
, 0, min(vm
->total
, limit
), end_time
);
1276 mock_context_close(ctx
);
1280 static int igt_mock_fill(void *arg
)
1282 struct i915_ggtt
*ggtt
= arg
;
1284 return exercise_mock(ggtt
->vm
.i915
, fill_hole
);
1287 static int igt_mock_walk(void *arg
)
1289 struct i915_ggtt
*ggtt
= arg
;
1291 return exercise_mock(ggtt
->vm
.i915
, walk_hole
);
1294 static int igt_mock_pot(void *arg
)
1296 struct i915_ggtt
*ggtt
= arg
;
1298 return exercise_mock(ggtt
->vm
.i915
, pot_hole
);
1301 static int igt_mock_drunk(void *arg
)
1303 struct i915_ggtt
*ggtt
= arg
;
1305 return exercise_mock(ggtt
->vm
.i915
, drunk_hole
);
1308 static int igt_gtt_reserve(void *arg
)
1310 struct i915_ggtt
*ggtt
= arg
;
1311 struct drm_i915_gem_object
*obj
, *on
;
1312 I915_RND_STATE(prng
);
1317 /* i915_gem_gtt_reserve() tries to reserve the precise range
1318 * for the node, and evicts if it has to. So our test checks that
1319 * it can give us the requsted space and prevent overlaps.
1322 /* Start by filling the GGTT */
1324 total
+ 2 * I915_GTT_PAGE_SIZE
<= ggtt
->vm
.total
;
1325 total
+= 2 * I915_GTT_PAGE_SIZE
) {
1326 struct i915_vma
*vma
;
1328 obj
= i915_gem_object_create_internal(ggtt
->vm
.i915
,
1335 err
= i915_gem_object_pin_pages(obj
);
1337 i915_gem_object_put(obj
);
1341 list_add(&obj
->st_link
, &objects
);
1343 vma
= i915_vma_instance(obj
, &ggtt
->vm
, NULL
);
1349 mutex_lock(&ggtt
->vm
.mutex
);
1350 err
= i915_gem_gtt_reserve(&ggtt
->vm
, &vma
->node
,
1355 mutex_unlock(&ggtt
->vm
.mutex
);
1357 pr_err("i915_gem_gtt_reserve (pass 1) failed at %llu/%llu with err=%d\n",
1358 total
, ggtt
->vm
.total
, err
);
1361 track_vma_bind(vma
);
1363 GEM_BUG_ON(!drm_mm_node_allocated(&vma
->node
));
1364 if (vma
->node
.start
!= total
||
1365 vma
->node
.size
!= 2*I915_GTT_PAGE_SIZE
) {
1366 pr_err("i915_gem_gtt_reserve (pass 1) placement failed, found (%llx + %llx), expected (%llx + %llx)\n",
1367 vma
->node
.start
, vma
->node
.size
,
1368 total
, 2*I915_GTT_PAGE_SIZE
);
1374 /* Now we start forcing evictions */
1375 for (total
= I915_GTT_PAGE_SIZE
;
1376 total
+ 2 * I915_GTT_PAGE_SIZE
<= ggtt
->vm
.total
;
1377 total
+= 2 * I915_GTT_PAGE_SIZE
) {
1378 struct i915_vma
*vma
;
1380 obj
= i915_gem_object_create_internal(ggtt
->vm
.i915
,
1387 err
= i915_gem_object_pin_pages(obj
);
1389 i915_gem_object_put(obj
);
1393 list_add(&obj
->st_link
, &objects
);
1395 vma
= i915_vma_instance(obj
, &ggtt
->vm
, NULL
);
1401 mutex_lock(&ggtt
->vm
.mutex
);
1402 err
= i915_gem_gtt_reserve(&ggtt
->vm
, &vma
->node
,
1407 mutex_unlock(&ggtt
->vm
.mutex
);
1409 pr_err("i915_gem_gtt_reserve (pass 2) failed at %llu/%llu with err=%d\n",
1410 total
, ggtt
->vm
.total
, err
);
1413 track_vma_bind(vma
);
1415 GEM_BUG_ON(!drm_mm_node_allocated(&vma
->node
));
1416 if (vma
->node
.start
!= total
||
1417 vma
->node
.size
!= 2*I915_GTT_PAGE_SIZE
) {
1418 pr_err("i915_gem_gtt_reserve (pass 2) placement failed, found (%llx + %llx), expected (%llx + %llx)\n",
1419 vma
->node
.start
, vma
->node
.size
,
1420 total
, 2*I915_GTT_PAGE_SIZE
);
1426 /* And then try at random */
1427 list_for_each_entry_safe(obj
, on
, &objects
, st_link
) {
1428 struct i915_vma
*vma
;
1431 vma
= i915_vma_instance(obj
, &ggtt
->vm
, NULL
);
1437 err
= i915_vma_unbind(vma
);
1439 pr_err("i915_vma_unbind failed with err=%d!\n", err
);
1443 offset
= igt_random_offset(&prng
,
1445 2 * I915_GTT_PAGE_SIZE
,
1446 I915_GTT_MIN_ALIGNMENT
);
1448 mutex_lock(&ggtt
->vm
.mutex
);
1449 err
= i915_gem_gtt_reserve(&ggtt
->vm
, &vma
->node
,
1454 mutex_unlock(&ggtt
->vm
.mutex
);
1456 pr_err("i915_gem_gtt_reserve (pass 3) failed at %llu/%llu with err=%d\n",
1457 total
, ggtt
->vm
.total
, err
);
1460 track_vma_bind(vma
);
1462 GEM_BUG_ON(!drm_mm_node_allocated(&vma
->node
));
1463 if (vma
->node
.start
!= offset
||
1464 vma
->node
.size
!= 2*I915_GTT_PAGE_SIZE
) {
1465 pr_err("i915_gem_gtt_reserve (pass 3) placement failed, found (%llx + %llx), expected (%llx + %llx)\n",
1466 vma
->node
.start
, vma
->node
.size
,
1467 offset
, 2*I915_GTT_PAGE_SIZE
);
1474 list_for_each_entry_safe(obj
, on
, &objects
, st_link
) {
1475 i915_gem_object_unpin_pages(obj
);
1476 i915_gem_object_put(obj
);
1481 static int igt_gtt_insert(void *arg
)
1483 struct i915_ggtt
*ggtt
= arg
;
1484 struct drm_i915_gem_object
*obj
, *on
;
1485 struct drm_mm_node tmp
= {};
1486 const struct invalid_insert
{
1490 } invalid_insert
[] = {
1492 ggtt
->vm
.total
+ I915_GTT_PAGE_SIZE
, 0,
1496 2*I915_GTT_PAGE_SIZE
, 0,
1497 0, I915_GTT_PAGE_SIZE
,
1500 -(u64
)I915_GTT_PAGE_SIZE
, 0,
1501 0, 4*I915_GTT_PAGE_SIZE
,
1504 -(u64
)2*I915_GTT_PAGE_SIZE
, 2*I915_GTT_PAGE_SIZE
,
1505 0, 4*I915_GTT_PAGE_SIZE
,
1508 I915_GTT_PAGE_SIZE
, I915_GTT_MIN_ALIGNMENT
<< 1,
1509 I915_GTT_MIN_ALIGNMENT
, I915_GTT_MIN_ALIGNMENT
<< 1,
1517 /* i915_gem_gtt_insert() tries to allocate some free space in the GTT
1518 * to the node, evicting if required.
1521 /* Check a couple of obviously invalid requests */
1522 for (ii
= invalid_insert
; ii
->size
; ii
++) {
1523 mutex_lock(&ggtt
->vm
.mutex
);
1524 err
= i915_gem_gtt_insert(&ggtt
->vm
, &tmp
,
1525 ii
->size
, ii
->alignment
,
1526 I915_COLOR_UNEVICTABLE
,
1529 mutex_unlock(&ggtt
->vm
.mutex
);
1530 if (err
!= -ENOSPC
) {
1531 pr_err("Invalid i915_gem_gtt_insert(.size=%llx, .alignment=%llx, .start=%llx, .end=%llx) succeeded (err=%d)\n",
1532 ii
->size
, ii
->alignment
, ii
->start
, ii
->end
,
1538 /* Start by filling the GGTT */
1540 total
+ I915_GTT_PAGE_SIZE
<= ggtt
->vm
.total
;
1541 total
+= I915_GTT_PAGE_SIZE
) {
1542 struct i915_vma
*vma
;
1544 obj
= i915_gem_object_create_internal(ggtt
->vm
.i915
,
1545 I915_GTT_PAGE_SIZE
);
1551 err
= i915_gem_object_pin_pages(obj
);
1553 i915_gem_object_put(obj
);
1557 list_add(&obj
->st_link
, &objects
);
1559 vma
= i915_vma_instance(obj
, &ggtt
->vm
, NULL
);
1565 mutex_lock(&ggtt
->vm
.mutex
);
1566 err
= i915_gem_gtt_insert(&ggtt
->vm
, &vma
->node
,
1567 obj
->base
.size
, 0, obj
->cache_level
,
1570 mutex_unlock(&ggtt
->vm
.mutex
);
1571 if (err
== -ENOSPC
) {
1572 /* maxed out the GGTT space */
1573 i915_gem_object_put(obj
);
1577 pr_err("i915_gem_gtt_insert (pass 1) failed at %llu/%llu with err=%d\n",
1578 total
, ggtt
->vm
.total
, err
);
1581 track_vma_bind(vma
);
1582 __i915_vma_pin(vma
);
1584 GEM_BUG_ON(!drm_mm_node_allocated(&vma
->node
));
1587 list_for_each_entry(obj
, &objects
, st_link
) {
1588 struct i915_vma
*vma
;
1590 vma
= i915_vma_instance(obj
, &ggtt
->vm
, NULL
);
1596 if (!drm_mm_node_allocated(&vma
->node
)) {
1597 pr_err("VMA was unexpectedly evicted!\n");
1602 __i915_vma_unpin(vma
);
1605 /* If we then reinsert, we should find the same hole */
1606 list_for_each_entry_safe(obj
, on
, &objects
, st_link
) {
1607 struct i915_vma
*vma
;
1610 vma
= i915_vma_instance(obj
, &ggtt
->vm
, NULL
);
1616 GEM_BUG_ON(!drm_mm_node_allocated(&vma
->node
));
1617 offset
= vma
->node
.start
;
1619 err
= i915_vma_unbind(vma
);
1621 pr_err("i915_vma_unbind failed with err=%d!\n", err
);
1625 mutex_lock(&ggtt
->vm
.mutex
);
1626 err
= i915_gem_gtt_insert(&ggtt
->vm
, &vma
->node
,
1627 obj
->base
.size
, 0, obj
->cache_level
,
1630 mutex_unlock(&ggtt
->vm
.mutex
);
1632 pr_err("i915_gem_gtt_insert (pass 2) failed at %llu/%llu with err=%d\n",
1633 total
, ggtt
->vm
.total
, err
);
1636 track_vma_bind(vma
);
1638 GEM_BUG_ON(!drm_mm_node_allocated(&vma
->node
));
1639 if (vma
->node
.start
!= offset
) {
1640 pr_err("i915_gem_gtt_insert did not return node to its previous location (the only hole), expected address %llx, found %llx\n",
1641 offset
, vma
->node
.start
);
1647 /* And then force evictions */
1649 total
+ 2 * I915_GTT_PAGE_SIZE
<= ggtt
->vm
.total
;
1650 total
+= 2 * I915_GTT_PAGE_SIZE
) {
1651 struct i915_vma
*vma
;
1653 obj
= i915_gem_object_create_internal(ggtt
->vm
.i915
,
1654 2 * I915_GTT_PAGE_SIZE
);
1660 err
= i915_gem_object_pin_pages(obj
);
1662 i915_gem_object_put(obj
);
1666 list_add(&obj
->st_link
, &objects
);
1668 vma
= i915_vma_instance(obj
, &ggtt
->vm
, NULL
);
1674 mutex_lock(&ggtt
->vm
.mutex
);
1675 err
= i915_gem_gtt_insert(&ggtt
->vm
, &vma
->node
,
1676 obj
->base
.size
, 0, obj
->cache_level
,
1679 mutex_unlock(&ggtt
->vm
.mutex
);
1681 pr_err("i915_gem_gtt_insert (pass 3) failed at %llu/%llu with err=%d\n",
1682 total
, ggtt
->vm
.total
, err
);
1685 track_vma_bind(vma
);
1687 GEM_BUG_ON(!drm_mm_node_allocated(&vma
->node
));
1691 list_for_each_entry_safe(obj
, on
, &objects
, st_link
) {
1692 i915_gem_object_unpin_pages(obj
);
1693 i915_gem_object_put(obj
);
1698 int i915_gem_gtt_mock_selftests(void)
1700 static const struct i915_subtest tests
[] = {
1701 SUBTEST(igt_mock_drunk
),
1702 SUBTEST(igt_mock_walk
),
1703 SUBTEST(igt_mock_pot
),
1704 SUBTEST(igt_mock_fill
),
1705 SUBTEST(igt_gtt_reserve
),
1706 SUBTEST(igt_gtt_insert
),
1708 struct drm_i915_private
*i915
;
1709 struct i915_ggtt
*ggtt
;
1712 i915
= mock_gem_device();
1716 ggtt
= kmalloc(sizeof(*ggtt
), GFP_KERNEL
);
1721 mock_init_ggtt(i915
, ggtt
);
1723 err
= i915_subtests(tests
, ggtt
);
1725 mock_device_flush(i915
);
1726 i915_gem_drain_freed_objects(i915
);
1727 mock_fini_ggtt(ggtt
);
1730 mock_destroy_device(i915
);
1734 static int context_sync(struct intel_context
*ce
)
1736 struct i915_request
*rq
;
1739 rq
= intel_context_create_request(ce
);
1743 i915_request_get(rq
);
1744 i915_request_add(rq
);
1746 timeout
= i915_request_wait(rq
, 0, HZ
/ 5);
1747 i915_request_put(rq
);
1749 return timeout
< 0 ? -EIO
: 0;
1752 static struct i915_request
*
1753 submit_batch(struct intel_context
*ce
, u64 addr
)
1755 struct i915_request
*rq
;
1758 rq
= intel_context_create_request(ce
);
1763 if (rq
->engine
->emit_init_breadcrumb
) /* detect a hang */
1764 err
= rq
->engine
->emit_init_breadcrumb(rq
);
1766 err
= rq
->engine
->emit_bb_start(rq
, addr
, 0, 0);
1769 i915_request_get(rq
);
1770 i915_request_add(rq
);
1772 return err
? ERR_PTR(err
) : rq
;
1775 static u32
*spinner(u32
*batch
, int i
)
1777 return batch
+ i
* 64 / sizeof(*batch
) + 4;
1780 static void end_spin(u32
*batch
, int i
)
1782 *spinner(batch
, i
) = MI_BATCH_BUFFER_END
;
1786 static int igt_cs_tlb(void *arg
)
1788 const unsigned int count
= PAGE_SIZE
/ 64;
1789 const unsigned int chunk_size
= count
* PAGE_SIZE
;
1790 struct drm_i915_private
*i915
= arg
;
1791 struct drm_i915_gem_object
*bbe
, *act
, *out
;
1792 struct i915_gem_engines_iter it
;
1793 struct i915_address_space
*vm
;
1794 struct i915_gem_context
*ctx
;
1795 struct intel_context
*ce
;
1796 struct i915_vma
*vma
;
1797 I915_RND_STATE(prng
);
1805 * Our mission here is to fool the hardware to execute something
1806 * from scratch as it has not seen the batch move (due to missing
1807 * the TLB invalidate).
1810 file
= mock_file(i915
);
1812 return PTR_ERR(file
);
1814 ctx
= live_context(i915
, file
);
1820 vm
= i915_gem_context_get_vm_rcu(ctx
);
1821 if (i915_is_ggtt(vm
))
1824 /* Create two pages; dummy we prefill the TLB, and intended */
1825 bbe
= i915_gem_object_create_internal(i915
, PAGE_SIZE
);
1831 batch
= i915_gem_object_pin_map(bbe
, I915_MAP_WC
);
1832 if (IS_ERR(batch
)) {
1833 err
= PTR_ERR(batch
);
1836 memset32(batch
, MI_BATCH_BUFFER_END
, PAGE_SIZE
/ sizeof(u32
));
1837 i915_gem_object_flush_map(bbe
);
1838 i915_gem_object_unpin_map(bbe
);
1840 act
= i915_gem_object_create_internal(i915
, PAGE_SIZE
);
1846 /* Track the execution of each request by writing into different slot */
1847 batch
= i915_gem_object_pin_map(act
, I915_MAP_WC
);
1848 if (IS_ERR(batch
)) {
1849 err
= PTR_ERR(batch
);
1852 for (i
= 0; i
< count
; i
++) {
1853 u32
*cs
= batch
+ i
* 64 / sizeof(*cs
);
1854 u64 addr
= (vm
->total
- PAGE_SIZE
) + i
* sizeof(u32
);
1856 GEM_BUG_ON(INTEL_GEN(i915
) < 6);
1857 cs
[0] = MI_STORE_DWORD_IMM_GEN4
;
1858 if (INTEL_GEN(i915
) >= 8) {
1859 cs
[1] = lower_32_bits(addr
);
1860 cs
[2] = upper_32_bits(addr
);
1863 cs
[5] = MI_BATCH_BUFFER_START_GEN8
;
1866 cs
[2] = lower_32_bits(addr
);
1869 cs
[5] = MI_BATCH_BUFFER_START
;
1873 out
= i915_gem_object_create_internal(i915
, PAGE_SIZE
);
1878 i915_gem_object_set_cache_coherency(out
, I915_CACHING_CACHED
);
1880 vma
= i915_vma_instance(out
, vm
, NULL
);
1886 err
= i915_vma_pin(vma
, 0, 0,
1889 (vm
->total
- PAGE_SIZE
));
1892 GEM_BUG_ON(vma
->node
.start
!= vm
->total
- PAGE_SIZE
);
1894 result
= i915_gem_object_pin_map(out
, I915_MAP_WB
);
1895 if (IS_ERR(result
)) {
1896 err
= PTR_ERR(result
);
1900 for_each_gem_engine(ce
, i915_gem_context_lock_engines(ctx
), it
) {
1901 IGT_TIMEOUT(end_time
);
1902 unsigned long pass
= 0;
1904 if (!intel_engine_can_store_dword(ce
->engine
))
1907 while (!__igt_timeout(end_time
, NULL
)) {
1908 struct i915_vm_pt_stash stash
= {};
1909 struct i915_request
*rq
;
1912 offset
= igt_random_offset(&prng
,
1913 0, vm
->total
- PAGE_SIZE
,
1914 chunk_size
, PAGE_SIZE
);
1916 memset32(result
, STACK_MAGIC
, PAGE_SIZE
/ sizeof(u32
));
1918 vma
= i915_vma_instance(bbe
, vm
, NULL
);
1924 err
= vma
->ops
->set_pages(vma
);
1928 err
= i915_vm_alloc_pt_stash(vm
, &stash
, chunk_size
);
1932 err
= i915_vm_pin_pt_stash(vm
, &stash
);
1934 i915_vm_free_pt_stash(vm
, &stash
);
1938 vm
->allocate_va_range(vm
, &stash
, offset
, chunk_size
);
1940 i915_vm_free_pt_stash(vm
, &stash
);
1942 /* Prime the TLB with the dummy pages */
1943 for (i
= 0; i
< count
; i
++) {
1944 vma
->node
.start
= offset
+ i
* PAGE_SIZE
;
1945 vm
->insert_entries(vm
, vma
, I915_CACHE_NONE
, 0);
1947 rq
= submit_batch(ce
, vma
->node
.start
);
1952 i915_request_put(rq
);
1955 vma
->ops
->clear_pages(vma
);
1957 err
= context_sync(ce
);
1959 pr_err("%s: dummy setup timed out\n",
1964 vma
= i915_vma_instance(act
, vm
, NULL
);
1970 err
= vma
->ops
->set_pages(vma
);
1974 /* Replace the TLB with target batches */
1975 for (i
= 0; i
< count
; i
++) {
1976 struct i915_request
*rq
;
1977 u32
*cs
= batch
+ i
* 64 / sizeof(*cs
);
1980 vma
->node
.start
= offset
+ i
* PAGE_SIZE
;
1981 vm
->insert_entries(vm
, vma
, I915_CACHE_NONE
, 0);
1983 addr
= vma
->node
.start
+ i
* 64;
1985 cs
[6] = lower_32_bits(addr
);
1986 cs
[7] = upper_32_bits(addr
);
1989 rq
= submit_batch(ce
, addr
);
1995 /* Wait until the context chain has started */
1997 while (READ_ONCE(result
[i
]) &&
1998 !i915_request_completed(rq
))
2001 end_spin(batch
, i
- 1);
2004 i915_request_put(rq
);
2006 end_spin(batch
, count
- 1);
2008 vma
->ops
->clear_pages(vma
);
2010 err
= context_sync(ce
);
2012 pr_err("%s: writes timed out\n",
2017 for (i
= 0; i
< count
; i
++) {
2018 if (result
[i
] != i
) {
2019 pr_err("%s: Write lost on pass %lu, at offset %llx, index %d, found %x, expected %x\n",
2020 ce
->engine
->name
, pass
,
2021 offset
, i
, result
[i
], i
);
2027 vm
->clear_range(vm
, offset
, chunk_size
);
2032 if (igt_flush_test(i915
))
2034 i915_gem_context_unlock_engines(ctx
);
2035 i915_gem_object_unpin_map(out
);
2037 i915_gem_object_put(out
);
2039 i915_gem_object_unpin_map(act
);
2041 i915_gem_object_put(act
);
2043 i915_gem_object_put(bbe
);
2051 int i915_gem_gtt_live_selftests(struct drm_i915_private
*i915
)
2053 static const struct i915_subtest tests
[] = {
2054 SUBTEST(igt_ppgtt_alloc
),
2055 SUBTEST(igt_ppgtt_lowlevel
),
2056 SUBTEST(igt_ppgtt_drunk
),
2057 SUBTEST(igt_ppgtt_walk
),
2058 SUBTEST(igt_ppgtt_pot
),
2059 SUBTEST(igt_ppgtt_fill
),
2060 SUBTEST(igt_ppgtt_shrink
),
2061 SUBTEST(igt_ppgtt_shrink_boom
),
2062 SUBTEST(igt_ggtt_lowlevel
),
2063 SUBTEST(igt_ggtt_drunk
),
2064 SUBTEST(igt_ggtt_walk
),
2065 SUBTEST(igt_ggtt_pot
),
2066 SUBTEST(igt_ggtt_fill
),
2067 SUBTEST(igt_ggtt_page
),
2068 SUBTEST(igt_cs_tlb
),
2071 GEM_BUG_ON(offset_in_page(i915
->ggtt
.vm
.total
));
2073 return i915_subtests(tests
, i915
);