1/*
2 * Copyright �� 2016 Intel Corporation
3 *
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:
10 *
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
13 * Software.
14 *
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
21 * IN THE SOFTWARE.
22 *
23 */
24
25#include <linux/list_sort.h>
26#include <linux/prime_numbers.h>
27
28#include "gem/i915_gem_context.h"
29#include "gem/i915_gem_internal.h"
30#include "gem/i915_gem_lmem.h"
31#include "gem/i915_gem_region.h"
32#include "gem/selftests/mock_context.h"
33#include "gt/intel_context.h"
34#include "gt/intel_gpu_commands.h"
35#include "gt/intel_gtt.h"
36
37#include "i915_random.h"
38#include "i915_selftest.h"
39#include "i915_vma_resource.h"
40
41#include "mock_drm.h"
42#include "mock_gem_device.h"
43#include "mock_gtt.h"
44#include "igt_flush_test.h"
45
46static void cleanup_freed_objects(struct drm_i915_private *i915)
47{
48	i915_gem_drain_freed_objects(i915);
49}
50
51static void fake_free_pages(struct drm_i915_gem_object *obj,
52			    struct sg_table *pages)
53{
54	sg_free_table(pages);
55	kfree(pages);
56}
57
58static int fake_get_pages(struct drm_i915_gem_object *obj)
59{
60#define GFP (GFP_KERNEL | __GFP_NOWARN | __GFP_NORETRY)
61#define PFN_BIAS 0x1000
62	struct sg_table *pages;
63	struct scatterlist *sg;
64	typeof(obj->base.size) rem;
65
66	pages = kmalloc(sizeof(*pages), GFP);
67	if (!pages)
68		return -ENOMEM;
69
70	rem = round_up(obj->base.size, BIT(31)) >> 31;
71	/* restricted by sg_alloc_table */
72	if (overflows_type(rem, unsigned int)) {
73		kfree(pages);
74		return -E2BIG;
75	}
76
77	if (sg_alloc_table(pages, rem, GFP)) {
78		kfree(pages);
79		return -ENOMEM;
80	}
81
82	rem = obj->base.size;
83	for (sg = pages->sgl; sg; sg = sg_next(sg)) {
84		unsigned long len = min_t(typeof(rem), rem, BIT(31));
85
86		GEM_BUG_ON(!len);
87		sg_set_page(sg, pfn_to_page(PFN_BIAS), len, 0);
88		sg_dma_address(sg) = page_to_phys(sg_page(sg));
89		sg_dma_len(sg) = len;
90
91		rem -= len;
92	}
93	GEM_BUG_ON(rem);
94
95	__i915_gem_object_set_pages(obj, pages);
96
97	return 0;
98#undef GFP
99}
100
101static void fake_put_pages(struct drm_i915_gem_object *obj,
102			   struct sg_table *pages)
103{
104	fake_free_pages(obj, pages);
105	obj->mm.dirty = false;
106}
107
108static const struct drm_i915_gem_object_ops fake_ops = {
109	.name = "fake-gem",
110	.flags = I915_GEM_OBJECT_IS_SHRINKABLE,
111	.get_pages = fake_get_pages,
112	.put_pages = fake_put_pages,
113};
114
115static struct drm_i915_gem_object *
116fake_dma_object(struct drm_i915_private *i915, u64 size)
117{
118	static struct lock_class_key lock_class;
119	struct drm_i915_gem_object *obj;
120
121	GEM_BUG_ON(!size);
122	GEM_BUG_ON(!IS_ALIGNED(size, I915_GTT_PAGE_SIZE));
123
124	if (overflows_type(size, obj->base.size))
125		return ERR_PTR(-E2BIG);
126
127	obj = i915_gem_object_alloc();
128	if (!obj)
129		goto err;
130
131	drm_gem_private_object_init(&i915->drm, &obj->base, size);
132	i915_gem_object_init(obj, &fake_ops, &lock_class, 0);
133
134	i915_gem_object_set_volatile(obj);
135
136	obj->write_domain = I915_GEM_DOMAIN_CPU;
137	obj->read_domains = I915_GEM_DOMAIN_CPU;
138	obj->pat_index = i915_gem_get_pat_index(i915, I915_CACHE_NONE);
139
140	/* Preallocate the "backing storage" */
141	if (i915_gem_object_pin_pages_unlocked(obj))
142		goto err_obj;
143
144	i915_gem_object_unpin_pages(obj);
145	return obj;
146
147err_obj:
148	i915_gem_object_put(obj);
149err:
150	return ERR_PTR(-ENOMEM);
151}
152
153static int igt_ppgtt_alloc(void *arg)
154{
155	struct drm_i915_private *dev_priv = arg;
156	struct i915_ppgtt *ppgtt;
157	struct i915_gem_ww_ctx ww;
158	u64 size, last, limit;
159	int err = 0;
160
161	/* Allocate a ppggt and try to fill the entire range */
162
163	if (!HAS_PPGTT(dev_priv))
164		return 0;
165
166	ppgtt = i915_ppgtt_create(to_gt(dev_priv), 0);
167	if (IS_ERR(ppgtt))
168		return PTR_ERR(ppgtt);
169
170	if (!ppgtt->vm.allocate_va_range)
171		goto err_ppgtt_cleanup;
172
173	/*
174	 * While we only allocate the page tables here and so we could
175	 * address a much larger GTT than we could actually fit into
176	 * RAM, a practical limit is the amount of physical pages in the system.
177	 * This should ensure that we do not run into the oomkiller during
178	 * the test and take down the machine wilfully.
179	 */
180	limit = totalram_pages() << PAGE_SHIFT;
181	limit = min(ppgtt->vm.total, limit);
182
183	i915_gem_ww_ctx_init(&ww, false);
184retry:
185	err = i915_vm_lock_objects(&ppgtt->vm, &ww);
186	if (err)
187		goto err_ppgtt_cleanup;
188
189	/* Check we can allocate the entire range */
190	for (size = 4096; size <= limit; size <<= 2) {
191		struct i915_vm_pt_stash stash = {};
192
193		err = i915_vm_alloc_pt_stash(&ppgtt->vm, &stash, size);
194		if (err)
195			goto err_ppgtt_cleanup;
196
197		err = i915_vm_map_pt_stash(&ppgtt->vm, &stash);
198		if (err) {
199			i915_vm_free_pt_stash(&ppgtt->vm, &stash);
200			goto err_ppgtt_cleanup;
201		}
202
203		ppgtt->vm.allocate_va_range(&ppgtt->vm, &stash, 0, size);
204		cond_resched();
205
206		ppgtt->vm.clear_range(&ppgtt->vm, 0, size);
207
208		i915_vm_free_pt_stash(&ppgtt->vm, &stash);
209	}
210
211	/* Check we can incrementally allocate the entire range */
212	for (last = 0, size = 4096; size <= limit; last = size, size <<= 2) {
213		struct i915_vm_pt_stash stash = {};
214
215		err = i915_vm_alloc_pt_stash(&ppgtt->vm, &stash, size - last);
216		if (err)
217			goto err_ppgtt_cleanup;
218
219		err = i915_vm_map_pt_stash(&ppgtt->vm, &stash);
220		if (err) {
221			i915_vm_free_pt_stash(&ppgtt->vm, &stash);
222			goto err_ppgtt_cleanup;
223		}
224
225		ppgtt->vm.allocate_va_range(&ppgtt->vm, &stash,
226					    last, size - last);
227		cond_resched();
228
229		i915_vm_free_pt_stash(&ppgtt->vm, &stash);
230	}
231
232err_ppgtt_cleanup:
233	if (err == -EDEADLK) {
234		err = i915_gem_ww_ctx_backoff(&ww);
235		if (!err)
236			goto retry;
237	}
238	i915_gem_ww_ctx_fini(&ww);
239
240	i915_vm_put(&ppgtt->vm);
241	return err;
242}
243
244static int lowlevel_hole(struct i915_address_space *vm,
245			 u64 hole_start, u64 hole_end,
246			 unsigned long end_time)
247{
248	const unsigned int min_alignment =
249		i915_vm_min_alignment(vm, INTEL_MEMORY_SYSTEM);
250	I915_RND_STATE(seed_prng);
251	struct i915_vma_resource *mock_vma_res;
252	unsigned int size;
253
254	mock_vma_res = kzalloc(sizeof(*mock_vma_res), GFP_KERNEL);
255	if (!mock_vma_res)
256		return -ENOMEM;
257
258	/* Keep creating larger objects until one cannot fit into the hole */
259	for (size = 12; (hole_end - hole_start) >> size; size++) {
260		I915_RND_SUBSTATE(prng, seed_prng);
261		struct drm_i915_gem_object *obj;
262		unsigned int *order, count, n;
263		u64 hole_size, aligned_size;
264
265		aligned_size = max_t(u32, ilog2(min_alignment), size);
266		hole_size = (hole_end - hole_start) >> aligned_size;
267		if (hole_size > KMALLOC_MAX_SIZE / sizeof(u32))
268			hole_size = KMALLOC_MAX_SIZE / sizeof(u32);
269		count = hole_size >> 1;
270		if (!count) {
271			pr_debug("%s: hole is too small [%llx - %llx] >> %d: %lld\n",
272				 __func__, hole_start, hole_end, size, hole_size);
273			break;
274		}
275
276		do {
277			order = i915_random_order(count, &prng);
278			if (order)
279				break;
280		} while (count >>= 1);
281		if (!count) {
282			kfree(mock_vma_res);
283			return -ENOMEM;
284		}
285		GEM_BUG_ON(!order);
286
287		GEM_BUG_ON(count * BIT_ULL(aligned_size) > vm->total);
288		GEM_BUG_ON(hole_start + count * BIT_ULL(aligned_size) > hole_end);
289
290		/* Ignore allocation failures (i.e. don't report them as
291		 * a test failure) as we are purposefully allocating very
292		 * large objects without checking that we have sufficient
293		 * memory. We expect to hit -ENOMEM.
294		 */
295
296		obj = fake_dma_object(vm->i915, BIT_ULL(size));
297		if (IS_ERR(obj)) {
298			kfree(order);
299			break;
300		}
301
302		GEM_BUG_ON(obj->base.size != BIT_ULL(size));
303
304		if (i915_gem_object_pin_pages_unlocked(obj)) {
305			i915_gem_object_put(obj);
306			kfree(order);
307			break;
308		}
309
310		for (n = 0; n < count; n++) {
311			u64 addr = hole_start + order[n] * BIT_ULL(aligned_size);
312			intel_wakeref_t wakeref;
313
314			GEM_BUG_ON(addr + BIT_ULL(aligned_size) > vm->total);
315
316			if (igt_timeout(end_time,
317					"%s timed out before %d/%d\n",
318					__func__, n, count)) {
319				hole_end = hole_start; /* quit */
320				break;
321			}
322
323			if (vm->allocate_va_range) {
324				struct i915_vm_pt_stash stash = {};
325				struct i915_gem_ww_ctx ww;
326				int err;
327
328				i915_gem_ww_ctx_init(&ww, false);
329retry:
330				err = i915_vm_lock_objects(vm, &ww);
331				if (err)
332					goto alloc_vm_end;
333
334				err = -ENOMEM;
335				if (i915_vm_alloc_pt_stash(vm, &stash,
336							   BIT_ULL(size)))
337					goto alloc_vm_end;
338
339				err = i915_vm_map_pt_stash(vm, &stash);
340				if (!err)
341					vm->allocate_va_range(vm, &stash,
342							      addr, BIT_ULL(size));
343				i915_vm_free_pt_stash(vm, &stash);
344alloc_vm_end:
345				if (err == -EDEADLK) {
346					err = i915_gem_ww_ctx_backoff(&ww);
347					if (!err)
348						goto retry;
349				}
350				i915_gem_ww_ctx_fini(&ww);
351
352				if (err)
353					break;
354			}
355
356			mock_vma_res->bi.pages = obj->mm.pages;
357			mock_vma_res->node_size = BIT_ULL(aligned_size);
358			mock_vma_res->start = addr;
359
360			with_intel_runtime_pm(vm->gt->uncore->rpm, wakeref)
361			  vm->insert_entries(vm, mock_vma_res,
362					     i915_gem_get_pat_index(vm->i915,
363								    I915_CACHE_NONE),
364					     0);
365		}
366		count = n;
367
368		i915_random_reorder(order, count, &prng);
369		for (n = 0; n < count; n++) {
370			u64 addr = hole_start + order[n] * BIT_ULL(aligned_size);
371			intel_wakeref_t wakeref;
372
373			GEM_BUG_ON(addr + BIT_ULL(size) > vm->total);
374			with_intel_runtime_pm(vm->gt->uncore->rpm, wakeref)
375				vm->clear_range(vm, addr, BIT_ULL(size));
376		}
377
378		i915_gem_object_unpin_pages(obj);
379		i915_gem_object_put(obj);
380
381		kfree(order);
382
383		cleanup_freed_objects(vm->i915);
384	}
385
386	kfree(mock_vma_res);
387	return 0;
388}
389
390static void close_object_list(struct list_head *objects,
391			      struct i915_address_space *vm)
392{
393	struct drm_i915_gem_object *obj, *on;
394	int __maybe_unused ignored;
395
396	list_for_each_entry_safe(obj, on, objects, st_link) {
397		struct i915_vma *vma;
398
399		vma = i915_vma_instance(obj, vm, NULL);
400		if (!IS_ERR(vma))
401			ignored = i915_vma_unbind_unlocked(vma);
402
403		list_del(&obj->st_link);
404		i915_gem_object_put(obj);
405	}
406}
407
408static int fill_hole(struct i915_address_space *vm,
409		     u64 hole_start, u64 hole_end,
410		     unsigned long end_time)
411{
412	const u64 hole_size = hole_end - hole_start;
413	struct drm_i915_gem_object *obj;
414	const unsigned int min_alignment =
415		i915_vm_min_alignment(vm, INTEL_MEMORY_SYSTEM);
416	const unsigned long max_pages =
417		min_t(u64, ULONG_MAX - 1, (hole_size / 2) >> ilog2(min_alignment));
418	const unsigned long max_step = max(int_sqrt(max_pages), 2UL);
419	unsigned long npages, prime, flags;
420	struct i915_vma *vma;
421	LIST_HEAD(objects);
422	int err;
423
424	/* Try binding many VMA working inwards from either edge */
425
426	flags = PIN_OFFSET_FIXED | PIN_USER;
427	if (i915_is_ggtt(vm))
428		flags |= PIN_GLOBAL;
429
430	for_each_prime_number_from(prime, 2, max_step) {
431		for (npages = 1; npages <= max_pages; npages *= prime) {
432			const u64 full_size = npages << PAGE_SHIFT;
433			const struct {
434				const char *name;
435				u64 offset;
436				int step;
437			} phases[] = {
438				{ "top-down", hole_end, -1, },
439				{ "bottom-up", hole_start, 1, },
440				{ }
441			}, *p;
442
443			obj = fake_dma_object(vm->i915, full_size);
444			if (IS_ERR(obj))
445				break;
446
447			list_add(&obj->st_link, &objects);
448
449			/* Align differing sized objects against the edges, and
450			 * check we don't walk off into the void when binding
451			 * them into the GTT.
452			 */
453			for (p = phases; p->name; p++) {
454				u64 offset;
455
456				offset = p->offset;
457				list_for_each_entry(obj, &objects, st_link) {
458					u64 aligned_size = round_up(obj->base.size,
459								    min_alignment);
460
461					vma = i915_vma_instance(obj, vm, NULL);
462					if (IS_ERR(vma))
463						continue;
464
465					if (p->step < 0) {
466						if (offset < hole_start + aligned_size)
467							break;
468						offset -= aligned_size;
469					}
470
471					err = i915_vma_pin(vma, 0, 0, offset | flags);
472					if (err) {
473						pr_err("%s(%s) pin (forward) failed with err=%d on size=%lu pages (prime=%lu), offset=%llx\n",
474						       __func__, p->name, err, npages, prime, offset);
475						goto err;
476					}
477
478					if (!drm_mm_node_allocated(&vma->node) ||
479					    i915_vma_misplaced(vma, 0, 0, offset | flags)) {
480						pr_err("%s(%s) (forward) insert failed: vma.node=%llx + %llx [allocated? %d], expected offset %llx\n",
481						       __func__, p->name, vma->node.start, vma->node.size, drm_mm_node_allocated(&vma->node),
482						       offset);
483						err = -EINVAL;
484						goto err;
485					}
486
487					i915_vma_unpin(vma);
488
489					if (p->step > 0) {
490						if (offset + aligned_size > hole_end)
491							break;
492						offset += aligned_size;
493					}
494				}
495
496				offset = p->offset;
497				list_for_each_entry(obj, &objects, st_link) {
498					u64 aligned_size = round_up(obj->base.size,
499								    min_alignment);
500
501					vma = i915_vma_instance(obj, vm, NULL);
502					if (IS_ERR(vma))
503						continue;
504
505					if (p->step < 0) {
506						if (offset < hole_start + aligned_size)
507							break;
508						offset -= aligned_size;
509					}
510
511					if (!drm_mm_node_allocated(&vma->node) ||
512					    i915_vma_misplaced(vma, 0, 0, offset | flags)) {
513						pr_err("%s(%s) (forward) moved vma.node=%llx + %llx, expected offset %llx\n",
514						       __func__, p->name, vma->node.start, vma->node.size,
515						       offset);
516						err = -EINVAL;
517						goto err;
518					}
519
520					err = i915_vma_unbind_unlocked(vma);
521					if (err) {
522						pr_err("%s(%s) (forward) unbind of vma.node=%llx + %llx failed with err=%d\n",
523						       __func__, p->name, vma->node.start, vma->node.size,
524						       err);
525						goto err;
526					}
527
528					if (p->step > 0) {
529						if (offset + aligned_size > hole_end)
530							break;
531						offset += aligned_size;
532					}
533				}
534
535				offset = p->offset;
536				list_for_each_entry_reverse(obj, &objects, st_link) {
537					u64 aligned_size = round_up(obj->base.size,
538								    min_alignment);
539
540					vma = i915_vma_instance(obj, vm, NULL);
541					if (IS_ERR(vma))
542						continue;
543
544					if (p->step < 0) {
545						if (offset < hole_start + aligned_size)
546							break;
547						offset -= aligned_size;
548					}
549
550					err = i915_vma_pin(vma, 0, 0, offset | flags);
551					if (err) {
552						pr_err("%s(%s) pin (backward) failed with err=%d on size=%lu pages (prime=%lu), offset=%llx\n",
553						       __func__, p->name, err, npages, prime, offset);
554						goto err;
555					}
556
557					if (!drm_mm_node_allocated(&vma->node) ||
558					    i915_vma_misplaced(vma, 0, 0, offset | flags)) {
559						pr_err("%s(%s) (backward) insert failed: vma.node=%llx + %llx [allocated? %d], expected offset %llx\n",
560						       __func__, p->name, vma->node.start, vma->node.size, drm_mm_node_allocated(&vma->node),
561						       offset);
562						err = -EINVAL;
563						goto err;
564					}
565
566					i915_vma_unpin(vma);
567
568					if (p->step > 0) {
569						if (offset + aligned_size > hole_end)
570							break;
571						offset += aligned_size;
572					}
573				}
574
575				offset = p->offset;
576				list_for_each_entry_reverse(obj, &objects, st_link) {
577					u64 aligned_size = round_up(obj->base.size,
578								    min_alignment);
579
580					vma = i915_vma_instance(obj, vm, NULL);
581					if (IS_ERR(vma))
582						continue;
583
584					if (p->step < 0) {
585						if (offset < hole_start + aligned_size)
586							break;
587						offset -= aligned_size;
588					}
589
590					if (!drm_mm_node_allocated(&vma->node) ||
591					    i915_vma_misplaced(vma, 0, 0, offset | flags)) {
592						pr_err("%s(%s) (backward) moved vma.node=%llx + %llx [allocated? %d], expected offset %llx\n",
593						       __func__, p->name, vma->node.start, vma->node.size, drm_mm_node_allocated(&vma->node),
594						       offset);
595						err = -EINVAL;
596						goto err;
597					}
598
599					err = i915_vma_unbind_unlocked(vma);
600					if (err) {
601						pr_err("%s(%s) (backward) unbind of vma.node=%llx + %llx failed with err=%d\n",
602						       __func__, p->name, vma->node.start, vma->node.size,
603						       err);
604						goto err;
605					}
606
607					if (p->step > 0) {
608						if (offset + aligned_size > hole_end)
609							break;
610						offset += aligned_size;
611					}
612				}
613			}
614
615			if (igt_timeout(end_time, "%s timed out (npages=%lu, prime=%lu)\n",
616					__func__, npages, prime)) {
617				err = -EINTR;
618				goto err;
619			}
620		}
621
622		close_object_list(&objects, vm);
623		cleanup_freed_objects(vm->i915);
624	}
625
626	return 0;
627
628err:
629	close_object_list(&objects, vm);
630	return err;
631}
632
633static int walk_hole(struct i915_address_space *vm,
634		     u64 hole_start, u64 hole_end,
635		     unsigned long end_time)
636{
637	const u64 hole_size = hole_end - hole_start;
638	const unsigned long max_pages =
639		min_t(u64, ULONG_MAX - 1, hole_size >> PAGE_SHIFT);
640	unsigned long min_alignment;
641	unsigned long flags;
642	u64 size;
643
644	/* Try binding a single VMA in different positions within the hole */
645
646	flags = PIN_OFFSET_FIXED | PIN_USER;
647	if (i915_is_ggtt(vm))
648		flags |= PIN_GLOBAL;
649
650	min_alignment = i915_vm_min_alignment(vm, INTEL_MEMORY_SYSTEM);
651
652	for_each_prime_number_from(size, 1, max_pages) {
653		struct drm_i915_gem_object *obj;
654		struct i915_vma *vma;
655		u64 addr;
656		int err = 0;
657
658		obj = fake_dma_object(vm->i915, size << PAGE_SHIFT);
659		if (IS_ERR(obj))
660			break;
661
662		vma = i915_vma_instance(obj, vm, NULL);
663		if (IS_ERR(vma)) {
664			err = PTR_ERR(vma);
665			goto err_put;
666		}
667
668		for (addr = hole_start;
669		     addr + obj->base.size < hole_end;
670		     addr += round_up(obj->base.size, min_alignment)) {
671			err = i915_vma_pin(vma, 0, 0, addr | flags);
672			if (err) {
673				pr_err("%s bind failed at %llx + %llx [hole %llx- %llx] with err=%d\n",
674				       __func__, addr, vma->size,
675				       hole_start, hole_end, err);
676				goto err_put;
677			}
678			i915_vma_unpin(vma);
679
680			if (!drm_mm_node_allocated(&vma->node) ||
681			    i915_vma_misplaced(vma, 0, 0, addr | flags)) {
682				pr_err("%s incorrect at %llx + %llx\n",
683				       __func__, addr, vma->size);
684				err = -EINVAL;
685				goto err_put;
686			}
687
688			err = i915_vma_unbind_unlocked(vma);
689			if (err) {
690				pr_err("%s unbind failed at %llx + %llx  with err=%d\n",
691				       __func__, addr, vma->size, err);
692				goto err_put;
693			}
694
695			GEM_BUG_ON(drm_mm_node_allocated(&vma->node));
696
697			if (igt_timeout(end_time,
698					"%s timed out at %llx\n",
699					__func__, addr)) {
700				err = -EINTR;
701				goto err_put;
702			}
703		}
704
705err_put:
706		i915_gem_object_put(obj);
707		if (err)
708			return err;
709
710		cleanup_freed_objects(vm->i915);
711	}
712
713	return 0;
714}
715
716static int pot_hole(struct i915_address_space *vm,
717		    u64 hole_start, u64 hole_end,
718		    unsigned long end_time)
719{
720	struct drm_i915_gem_object *obj;
721	struct i915_vma *vma;
722	unsigned int min_alignment;
723	unsigned long flags;
724	unsigned int pot;
725	int err = 0;
726
727	flags = PIN_OFFSET_FIXED | PIN_USER;
728	if (i915_is_ggtt(vm))
729		flags |= PIN_GLOBAL;
730
731	min_alignment = i915_vm_min_alignment(vm, INTEL_MEMORY_SYSTEM);
732
733	obj = i915_gem_object_create_internal(vm->i915, 2 * I915_GTT_PAGE_SIZE);
734	if (IS_ERR(obj))
735		return PTR_ERR(obj);
736
737	vma = i915_vma_instance(obj, vm, NULL);
738	if (IS_ERR(vma)) {
739		err = PTR_ERR(vma);
740		goto err_obj;
741	}
742
743	/* Insert a pair of pages across every pot boundary within the hole */
744	for (pot = fls64(hole_end - 1) - 1;
745	     pot > ilog2(2 * min_alignment);
746	     pot--) {
747		u64 step = BIT_ULL(pot);
748		u64 addr;
749
750		for (addr = round_up(hole_start + min_alignment, step) - min_alignment;
751		     hole_end > addr && hole_end - addr >= 2 * min_alignment;
752		     addr += step) {
753			err = i915_vma_pin(vma, 0, 0, addr | flags);
754			if (err) {
755				pr_err("%s failed to pin object at %llx in hole [%llx - %llx], with err=%d\n",
756				       __func__,
757				       addr,
758				       hole_start, hole_end,
759				       err);
760				goto err_obj;
761			}
762
763			if (!drm_mm_node_allocated(&vma->node) ||
764			    i915_vma_misplaced(vma, 0, 0, addr | flags)) {
765				pr_err("%s incorrect at %llx + %llx\n",
766				       __func__, addr, vma->size);
767				i915_vma_unpin(vma);
768				err = i915_vma_unbind_unlocked(vma);
769				err = -EINVAL;
770				goto err_obj;
771			}
772
773			i915_vma_unpin(vma);
774			err = i915_vma_unbind_unlocked(vma);
775			GEM_BUG_ON(err);
776		}
777
778		if (igt_timeout(end_time,
779				"%s timed out after %d/%d\n",
780				__func__, pot, fls64(hole_end - 1) - 1)) {
781			err = -EINTR;
782			goto err_obj;
783		}
784	}
785
786err_obj:
787	i915_gem_object_put(obj);
788	return err;
789}
790
791static int drunk_hole(struct i915_address_space *vm,
792		      u64 hole_start, u64 hole_end,
793		      unsigned long end_time)
794{
795	I915_RND_STATE(prng);
796	unsigned int min_alignment;
797	unsigned int size;
798	unsigned long flags;
799
800	flags = PIN_OFFSET_FIXED | PIN_USER;
801	if (i915_is_ggtt(vm))
802		flags |= PIN_GLOBAL;
803
804	min_alignment = i915_vm_min_alignment(vm, INTEL_MEMORY_SYSTEM);
805
806	/* Keep creating larger objects until one cannot fit into the hole */
807	for (size = 12; (hole_end - hole_start) >> size; size++) {
808		struct drm_i915_gem_object *obj;
809		unsigned int *order, count, n;
810		struct i915_vma *vma;
811		u64 hole_size, aligned_size;
812		int err = -ENODEV;
813
814		aligned_size = max_t(u32, ilog2(min_alignment), size);
815		hole_size = (hole_end - hole_start) >> aligned_size;
816		if (hole_size > KMALLOC_MAX_SIZE / sizeof(u32))
817			hole_size = KMALLOC_MAX_SIZE / sizeof(u32);
818		count = hole_size >> 1;
819		if (!count) {
820			pr_debug("%s: hole is too small [%llx - %llx] >> %d: %lld\n",
821				 __func__, hole_start, hole_end, size, hole_size);
822			break;
823		}
824
825		do {
826			order = i915_random_order(count, &prng);
827			if (order)
828				break;
829		} while (count >>= 1);
830		if (!count)
831			return -ENOMEM;
832		GEM_BUG_ON(!order);
833
834		/* Ignore allocation failures (i.e. don't report them as
835		 * a test failure) as we are purposefully allocating very
836		 * large objects without checking that we have sufficient
837		 * memory. We expect to hit -ENOMEM.
838		 */
839
840		obj = fake_dma_object(vm->i915, BIT_ULL(size));
841		if (IS_ERR(obj)) {
842			kfree(order);
843			break;
844		}
845
846		vma = i915_vma_instance(obj, vm, NULL);
847		if (IS_ERR(vma)) {
848			err = PTR_ERR(vma);
849			goto err_obj;
850		}
851
852		GEM_BUG_ON(vma->size != BIT_ULL(size));
853
854		for (n = 0; n < count; n++) {
855			u64 addr = hole_start + order[n] * BIT_ULL(aligned_size);
856
857			err = i915_vma_pin(vma, 0, 0, addr | flags);
858			if (err) {
859				pr_err("%s failed to pin object at %llx + %llx in hole [%llx - %llx], with err=%d\n",
860				       __func__,
861				       addr, BIT_ULL(size),
862				       hole_start, hole_end,
863				       err);
864				goto err_obj;
865			}
866
867			if (!drm_mm_node_allocated(&vma->node) ||
868			    i915_vma_misplaced(vma, 0, 0, addr | flags)) {
869				pr_err("%s incorrect at %llx + %llx\n",
870				       __func__, addr, BIT_ULL(size));
871				i915_vma_unpin(vma);
872				err = i915_vma_unbind_unlocked(vma);
873				err = -EINVAL;
874				goto err_obj;
875			}
876
877			i915_vma_unpin(vma);
878			err = i915_vma_unbind_unlocked(vma);
879			GEM_BUG_ON(err);
880
881			if (igt_timeout(end_time,
882					"%s timed out after %d/%d\n",
883					__func__, n, count)) {
884				err = -EINTR;
885				goto err_obj;
886			}
887		}
888
889err_obj:
890		i915_gem_object_put(obj);
891		kfree(order);
892		if (err)
893			return err;
894
895		cleanup_freed_objects(vm->i915);
896	}
897
898	return 0;
899}
900
901static int __shrink_hole(struct i915_address_space *vm,
902			 u64 hole_start, u64 hole_end,
903			 unsigned long end_time)
904{
905	struct drm_i915_gem_object *obj;
906	unsigned long flags = PIN_OFFSET_FIXED | PIN_USER;
907	unsigned int min_alignment;
908	unsigned int order = 12;
909	LIST_HEAD(objects);
910	int err = 0;
911	u64 addr;
912
913	min_alignment = i915_vm_min_alignment(vm, INTEL_MEMORY_SYSTEM);
914
915	/* Keep creating larger objects until one cannot fit into the hole */
916	for (addr = hole_start; addr < hole_end; ) {
917		struct i915_vma *vma;
918		u64 size = BIT_ULL(order++);
919
920		size = min(size, hole_end - addr);
921		obj = fake_dma_object(vm->i915, size);
922		if (IS_ERR(obj)) {
923			err = PTR_ERR(obj);
924			break;
925		}
926
927		list_add(&obj->st_link, &objects);
928
929		vma = i915_vma_instance(obj, vm, NULL);
930		if (IS_ERR(vma)) {
931			err = PTR_ERR(vma);
932			break;
933		}
934
935		GEM_BUG_ON(vma->size != size);
936
937		err = i915_vma_pin(vma, 0, 0, addr | flags);
938		if (err) {
939			pr_err("%s failed to pin object at %llx + %llx in hole [%llx - %llx], with err=%d\n",
940			       __func__, addr, size, hole_start, hole_end, err);
941			break;
942		}
943
944		if (!drm_mm_node_allocated(&vma->node) ||
945		    i915_vma_misplaced(vma, 0, 0, addr | flags)) {
946			pr_err("%s incorrect at %llx + %llx\n",
947			       __func__, addr, size);
948			i915_vma_unpin(vma);
949			err = i915_vma_unbind_unlocked(vma);
950			err = -EINVAL;
951			break;
952		}
953
954		i915_vma_unpin(vma);
955		addr += round_up(size, min_alignment);
956
957		/*
958		 * Since we are injecting allocation faults at random intervals,
959		 * wait for this allocation to complete before we change the
960		 * faultinjection.
961		 */
962		err = i915_vma_sync(vma);
963		if (err)
964			break;
965
966		if (igt_timeout(end_time,
967				"%s timed out at ofset %llx [%llx - %llx]\n",
968				__func__, addr, hole_start, hole_end)) {
969			err = -EINTR;
970			break;
971		}
972	}
973
974	close_object_list(&objects, vm);
975	cleanup_freed_objects(vm->i915);
976	return err;
977}
978
979static int shrink_hole(struct i915_address_space *vm,
980		       u64 hole_start, u64 hole_end,
981		       unsigned long end_time)
982{
983	unsigned long prime;
984	int err;
985
986	vm->fault_attr.probability = 999;
987	atomic_set(&vm->fault_attr.times, -1);
988
989	for_each_prime_number_from(prime, 0, ULONG_MAX - 1) {
990		vm->fault_attr.interval = prime;
991		err = __shrink_hole(vm, hole_start, hole_end, end_time);
992		if (err)
993			break;
994	}
995
996	memset(&vm->fault_attr, 0, sizeof(vm->fault_attr));
997
998	return err;
999}
1000
1001static int shrink_boom(struct i915_address_space *vm,
1002		       u64 hole_start, u64 hole_end,
1003		       unsigned long end_time)
1004{
1005	unsigned int sizes[] = { SZ_2M, SZ_1G };
1006	struct drm_i915_gem_object *purge;
1007	struct drm_i915_gem_object *explode;
1008	int err;
1009	int i;
1010
1011	/*
1012	 * Catch the case which shrink_hole seems to miss. The setup here
1013	 * requires invoking the shrinker as we do the alloc_pt/alloc_pd, while
1014	 * ensuring that all vma assiocated with the respective pd/pdp are
1015	 * unpinned at the time.
1016	 */
1017
1018	for (i = 0; i < ARRAY_SIZE(sizes); ++i) {
1019		unsigned int flags = PIN_USER | PIN_OFFSET_FIXED;
1020		unsigned int size = sizes[i];
1021		struct i915_vma *vma;
1022
1023		purge = fake_dma_object(vm->i915, size);
1024		if (IS_ERR(purge))
1025			return PTR_ERR(purge);
1026
1027		vma = i915_vma_instance(purge, vm, NULL);
1028		if (IS_ERR(vma)) {
1029			err = PTR_ERR(vma);
1030			goto err_purge;
1031		}
1032
1033		err = i915_vma_pin(vma, 0, 0, flags);
1034		if (err)
1035			goto err_purge;
1036
1037		/* Should now be ripe for purging */
1038		i915_vma_unpin(vma);
1039
1040		explode = fake_dma_object(vm->i915, size);
1041		if (IS_ERR(explode)) {
1042			err = PTR_ERR(explode);
1043			goto err_purge;
1044		}
1045
1046		vm->fault_attr.probability = 100;
1047		vm->fault_attr.interval = 1;
1048		atomic_set(&vm->fault_attr.times, -1);
1049
1050		vma = i915_vma_instance(explode, vm, NULL);
1051		if (IS_ERR(vma)) {
1052			err = PTR_ERR(vma);
1053			goto err_explode;
1054		}
1055
1056		err = i915_vma_pin(vma, 0, 0, flags | size);
1057		if (err)
1058			goto err_explode;
1059
1060		i915_vma_unpin(vma);
1061
1062		i915_gem_object_put(purge);
1063		i915_gem_object_put(explode);
1064
1065		memset(&vm->fault_attr, 0, sizeof(vm->fault_attr));
1066		cleanup_freed_objects(vm->i915);
1067	}
1068
1069	return 0;
1070
1071err_explode:
1072	i915_gem_object_put(explode);
1073err_purge:
1074	i915_gem_object_put(purge);
1075	memset(&vm->fault_attr, 0, sizeof(vm->fault_attr));
1076	return err;
1077}
1078
1079static int misaligned_case(struct i915_address_space *vm, struct intel_memory_region *mr,
1080			   u64 addr, u64 size, unsigned long flags)
1081{
1082	struct drm_i915_gem_object *obj;
1083	struct i915_vma *vma;
1084	int err = 0;
1085	u64 expected_vma_size, expected_node_size;
1086	bool is_stolen = mr->type == INTEL_MEMORY_STOLEN_SYSTEM ||
1087			 mr->type == INTEL_MEMORY_STOLEN_LOCAL;
1088
1089	obj = i915_gem_object_create_region(mr, size, 0, I915_BO_ALLOC_GPU_ONLY);
1090	if (IS_ERR(obj)) {
1091		/* if iGVT-g or DMAR is active, stolen mem will be uninitialized */
1092		if (PTR_ERR(obj) == -ENODEV && is_stolen)
1093			return 0;
1094		return PTR_ERR(obj);
1095	}
1096
1097	vma = i915_vma_instance(obj, vm, NULL);
1098	if (IS_ERR(vma)) {
1099		err = PTR_ERR(vma);
1100		goto err_put;
1101	}
1102
1103	err = i915_vma_pin(vma, 0, 0, addr | flags);
1104	if (err)
1105		goto err_put;
1106	i915_vma_unpin(vma);
1107
1108	if (!drm_mm_node_allocated(&vma->node)) {
1109		err = -EINVAL;
1110		goto err_put;
1111	}
1112
1113	if (i915_vma_misplaced(vma, 0, 0, addr | flags)) {
1114		err = -EINVAL;
1115		goto err_put;
1116	}
1117
1118	expected_vma_size = round_up(size, 1 << (ffs(vma->resource->page_sizes_gtt) - 1));
1119	expected_node_size = expected_vma_size;
1120
1121	if (HAS_64K_PAGES(vm->i915) && i915_gem_object_is_lmem(obj)) {
1122		expected_vma_size = round_up(size, I915_GTT_PAGE_SIZE_64K);
1123		expected_node_size = round_up(size, I915_GTT_PAGE_SIZE_64K);
1124	}
1125
1126	if (vma->size != expected_vma_size || vma->node.size != expected_node_size) {
1127		err = i915_vma_unbind_unlocked(vma);
1128		err = -EBADSLT;
1129		goto err_put;
1130	}
1131
1132	err = i915_vma_unbind_unlocked(vma);
1133	if (err)
1134		goto err_put;
1135
1136	GEM_BUG_ON(drm_mm_node_allocated(&vma->node));
1137
1138err_put:
1139	i915_gem_object_put(obj);
1140	cleanup_freed_objects(vm->i915);
1141	return err;
1142}
1143
1144static int misaligned_pin(struct i915_address_space *vm,
1145			  u64 hole_start, u64 hole_end,
1146			  unsigned long end_time)
1147{
1148	struct intel_memory_region *mr;
1149	enum intel_region_id id;
1150	unsigned long flags = PIN_OFFSET_FIXED | PIN_USER;
1151	int err = 0;
1152	u64 hole_size = hole_end - hole_start;
1153
1154	if (i915_is_ggtt(vm))
1155		flags |= PIN_GLOBAL;
1156
1157	for_each_memory_region(mr, vm->i915, id) {
1158		u64 min_alignment = i915_vm_min_alignment(vm, mr->type);
1159		u64 size = min_alignment;
1160		u64 addr = round_down(hole_start + (hole_size / 2), min_alignment);
1161
1162		/* avoid -ENOSPC on very small hole setups */
1163		if (hole_size < 3 * min_alignment)
1164			continue;
1165
1166		/* we can't test < 4k alignment due to flags being encoded in lower bits */
1167		if (min_alignment != I915_GTT_PAGE_SIZE_4K) {
1168			err = misaligned_case(vm, mr, addr + (min_alignment / 2), size, flags);
1169			/* misaligned should error with -EINVAL*/
1170			if (!err)
1171				err = -EBADSLT;
1172			if (err != -EINVAL)
1173				return err;
1174		}
1175
1176		/* test for vma->size expansion to min page size */
1177		err = misaligned_case(vm, mr, addr, PAGE_SIZE, flags);
1178		if (err)
1179			return err;
1180
1181		/* test for intermediate size not expanding vma->size for large alignments */
1182		err = misaligned_case(vm, mr, addr, size / 2, flags);
1183		if (err)
1184			return err;
1185	}
1186
1187	return 0;
1188}
1189
1190static int exercise_ppgtt(struct drm_i915_private *dev_priv,
1191			  int (*func)(struct i915_address_space *vm,
1192				      u64 hole_start, u64 hole_end,
1193				      unsigned long end_time))
1194{
1195	struct i915_ppgtt *ppgtt;
1196	IGT_TIMEOUT(end_time);
1197	struct file *file;
1198	int err;
1199
1200	if (!HAS_FULL_PPGTT(dev_priv))
1201		return 0;
1202
1203	file = mock_file(dev_priv);
1204	if (IS_ERR(file))
1205		return PTR_ERR(file);
1206
1207	ppgtt = i915_ppgtt_create(to_gt(dev_priv), 0);
1208	if (IS_ERR(ppgtt)) {
1209		err = PTR_ERR(ppgtt);
1210		goto out_free;
1211	}
1212	GEM_BUG_ON(offset_in_page(ppgtt->vm.total));
1213	assert_vm_alive(&ppgtt->vm);
1214
1215	err = func(&ppgtt->vm, 0, ppgtt->vm.total, end_time);
1216
1217	i915_vm_put(&ppgtt->vm);
1218
1219out_free:
1220	fput(file);
1221	return err;
1222}
1223
1224static int igt_ppgtt_fill(void *arg)
1225{
1226	return exercise_ppgtt(arg, fill_hole);
1227}
1228
1229static int igt_ppgtt_walk(void *arg)
1230{
1231	return exercise_ppgtt(arg, walk_hole);
1232}
1233
1234static int igt_ppgtt_pot(void *arg)
1235{
1236	return exercise_ppgtt(arg, pot_hole);
1237}
1238
1239static int igt_ppgtt_drunk(void *arg)
1240{
1241	return exercise_ppgtt(arg, drunk_hole);
1242}
1243
1244static int igt_ppgtt_lowlevel(void *arg)
1245{
1246	return exercise_ppgtt(arg, lowlevel_hole);
1247}
1248
1249static int igt_ppgtt_shrink(void *arg)
1250{
1251	return exercise_ppgtt(arg, shrink_hole);
1252}
1253
1254static int igt_ppgtt_shrink_boom(void *arg)
1255{
1256	return exercise_ppgtt(arg, shrink_boom);
1257}
1258
1259static int igt_ppgtt_misaligned_pin(void *arg)
1260{
1261	return exercise_ppgtt(arg, misaligned_pin);
1262}
1263
1264static int sort_holes(void *priv, const struct list_head *A,
1265		      const struct list_head *B)
1266{
1267	struct drm_mm_node *a = list_entry(A, typeof(*a), hole_stack);
1268	struct drm_mm_node *b = list_entry(B, typeof(*b), hole_stack);
1269
1270	if (a->start < b->start)
1271		return -1;
1272	else
1273		return 1;
1274}
1275
1276static int exercise_ggtt(struct drm_i915_private *i915,
1277			 int (*func)(struct i915_address_space *vm,
1278				     u64 hole_start, u64 hole_end,
1279				     unsigned long end_time))
1280{
1281	struct i915_ggtt *ggtt = to_gt(i915)->ggtt;
1282	u64 hole_start, hole_end, last = 0;
1283	struct drm_mm_node *node;
1284	IGT_TIMEOUT(end_time);
1285	int err = 0;
1286
1287restart:
1288	list_sort(NULL, &ggtt->vm.mm.hole_stack, sort_holes);
1289	drm_mm_for_each_hole(node, &ggtt->vm.mm, hole_start, hole_end) {
1290		if (hole_start < last)
1291			continue;
1292
1293		if (ggtt->vm.mm.color_adjust)
1294			ggtt->vm.mm.color_adjust(node, 0,
1295						 &hole_start, &hole_end);
1296		if (hole_start >= hole_end)
1297			continue;
1298
1299		err = func(&ggtt->vm, hole_start, hole_end, end_time);
1300		if (err)
1301			break;
1302
1303		/* As we have manipulated the drm_mm, the list may be corrupt */
1304		last = hole_end;
1305		goto restart;
1306	}
1307
1308	return err;
1309}
1310
1311static int igt_ggtt_fill(void *arg)
1312{
1313	return exercise_ggtt(arg, fill_hole);
1314}
1315
1316static int igt_ggtt_walk(void *arg)
1317{
1318	return exercise_ggtt(arg, walk_hole);
1319}
1320
1321static int igt_ggtt_pot(void *arg)
1322{
1323	return exercise_ggtt(arg, pot_hole);
1324}
1325
1326static int igt_ggtt_drunk(void *arg)
1327{
1328	return exercise_ggtt(arg, drunk_hole);
1329}
1330
1331static int igt_ggtt_lowlevel(void *arg)
1332{
1333	return exercise_ggtt(arg, lowlevel_hole);
1334}
1335
1336static int igt_ggtt_misaligned_pin(void *arg)
1337{
1338	return exercise_ggtt(arg, misaligned_pin);
1339}
1340
1341static int igt_ggtt_page(void *arg)
1342{
1343	const unsigned int count = PAGE_SIZE/sizeof(u32);
1344	I915_RND_STATE(prng);
1345	struct drm_i915_private *i915 = arg;
1346	struct i915_ggtt *ggtt = to_gt(i915)->ggtt;
1347	struct drm_i915_gem_object *obj;
1348	intel_wakeref_t wakeref;
1349	struct drm_mm_node tmp;
1350	unsigned int *order, n;
1351	int err;
1352
1353	if (!i915_ggtt_has_aperture(ggtt))
1354		return 0;
1355
1356	obj = i915_gem_object_create_internal(i915, PAGE_SIZE);
1357	if (IS_ERR(obj))
1358		return PTR_ERR(obj);
1359
1360	err = i915_gem_object_pin_pages_unlocked(obj);
1361	if (err)
1362		goto out_free;
1363
1364	memset(&tmp, 0, sizeof(tmp));
1365	mutex_lock(&ggtt->vm.mutex);
1366	err = drm_mm_insert_node_in_range(&ggtt->vm.mm, &tmp,
1367					  count * PAGE_SIZE, 0,
1368					  I915_COLOR_UNEVICTABLE,
1369					  0, ggtt->mappable_end,
1370					  DRM_MM_INSERT_LOW);
1371	mutex_unlock(&ggtt->vm.mutex);
1372	if (err)
1373		goto out_unpin;
1374
1375	wakeref = intel_runtime_pm_get(&i915->runtime_pm);
1376
1377	for (n = 0; n < count; n++) {
1378		u64 offset = tmp.start + n * PAGE_SIZE;
1379
1380		ggtt->vm.insert_page(&ggtt->vm,
1381				     i915_gem_object_get_dma_address(obj, 0),
1382				     offset,
1383				     i915_gem_get_pat_index(i915,
1384							    I915_CACHE_NONE),
1385				     0);
1386	}
1387
1388	order = i915_random_order(count, &prng);
1389	if (!order) {
1390		err = -ENOMEM;
1391		goto out_remove;
1392	}
1393
1394	for (n = 0; n < count; n++) {
1395		u64 offset = tmp.start + order[n] * PAGE_SIZE;
1396		u32 __iomem *vaddr;
1397
1398		vaddr = io_mapping_map_atomic_wc(&ggtt->iomap, offset);
1399		iowrite32(n, vaddr + n);
1400		io_mapping_unmap_atomic(vaddr);
1401	}
1402	intel_gt_flush_ggtt_writes(ggtt->vm.gt);
1403
1404	i915_random_reorder(order, count, &prng);
1405	for (n = 0; n < count; n++) {
1406		u64 offset = tmp.start + order[n] * PAGE_SIZE;
1407		u32 __iomem *vaddr;
1408		u32 val;
1409
1410		vaddr = io_mapping_map_atomic_wc(&ggtt->iomap, offset);
1411		val = ioread32(vaddr + n);
1412		io_mapping_unmap_atomic(vaddr);
1413
1414		if (val != n) {
1415			pr_err("insert page failed: found %d, expected %d\n",
1416			       val, n);
1417			err = -EINVAL;
1418			break;
1419		}
1420	}
1421
1422	kfree(order);
1423out_remove:
1424	ggtt->vm.clear_range(&ggtt->vm, tmp.start, tmp.size);
1425	intel_runtime_pm_put(&i915->runtime_pm, wakeref);
1426	mutex_lock(&ggtt->vm.mutex);
1427	drm_mm_remove_node(&tmp);
1428	mutex_unlock(&ggtt->vm.mutex);
1429out_unpin:
1430	i915_gem_object_unpin_pages(obj);
1431out_free:
1432	i915_gem_object_put(obj);
1433	return err;
1434}
1435
1436static void track_vma_bind(struct i915_vma *vma)
1437{
1438	struct drm_i915_gem_object *obj = vma->obj;
1439
1440	__i915_gem_object_pin_pages(obj);
1441
1442	GEM_BUG_ON(atomic_read(&vma->pages_count));
1443	atomic_set(&vma->pages_count, I915_VMA_PAGES_ACTIVE);
1444	__i915_gem_object_pin_pages(obj);
1445	vma->pages = obj->mm.pages;
1446	vma->resource->bi.pages = vma->pages;
1447
1448	mutex_lock(&vma->vm->mutex);
1449	list_move_tail(&vma->vm_link, &vma->vm->bound_list);
1450	mutex_unlock(&vma->vm->mutex);
1451}
1452
1453static int exercise_mock(struct drm_i915_private *i915,
1454			 int (*func)(struct i915_address_space *vm,
1455				     u64 hole_start, u64 hole_end,
1456				     unsigned long end_time))
1457{
1458	const u64 limit = totalram_pages() << PAGE_SHIFT;
1459	struct i915_address_space *vm;
1460	struct i915_gem_context *ctx;
1461	IGT_TIMEOUT(end_time);
1462	int err;
1463
1464	ctx = mock_context(i915, "mock");
1465	if (!ctx)
1466		return -ENOMEM;
1467
1468	vm = i915_gem_context_get_eb_vm(ctx);
1469	err = func(vm, 0, min(vm->total, limit), end_time);
1470	i915_vm_put(vm);
1471
1472	mock_context_close(ctx);
1473	return err;
1474}
1475
1476static int igt_mock_fill(void *arg)
1477{
1478	struct i915_ggtt *ggtt = arg;
1479
1480	return exercise_mock(ggtt->vm.i915, fill_hole);
1481}
1482
1483static int igt_mock_walk(void *arg)
1484{
1485	struct i915_ggtt *ggtt = arg;
1486
1487	return exercise_mock(ggtt->vm.i915, walk_hole);
1488}
1489
1490static int igt_mock_pot(void *arg)
1491{
1492	struct i915_ggtt *ggtt = arg;
1493
1494	return exercise_mock(ggtt->vm.i915, pot_hole);
1495}
1496
1497static int igt_mock_drunk(void *arg)
1498{
1499	struct i915_ggtt *ggtt = arg;
1500
1501	return exercise_mock(ggtt->vm.i915, drunk_hole);
1502}
1503
1504static int reserve_gtt_with_resource(struct i915_vma *vma, u64 offset)
1505{
1506	struct i915_address_space *vm = vma->vm;
1507	struct i915_vma_resource *vma_res;
1508	struct drm_i915_gem_object *obj = vma->obj;
1509	int err;
1510
1511	vma_res = i915_vma_resource_alloc();
1512	if (IS_ERR(vma_res))
1513		return PTR_ERR(vma_res);
1514
1515	mutex_lock(&vm->mutex);
1516	err = i915_gem_gtt_reserve(vm, NULL, &vma->node, obj->base.size,
1517				   offset,
1518				   obj->pat_index,
1519				   0);
1520	if (!err) {
1521		i915_vma_resource_init_from_vma(vma_res, vma);
1522		vma->resource = vma_res;
1523	} else {
1524		kfree(vma_res);
1525	}
1526	mutex_unlock(&vm->mutex);
1527
1528	return err;
1529}
1530
1531static int igt_gtt_reserve(void *arg)
1532{
1533	struct i915_ggtt *ggtt = arg;
1534	struct drm_i915_gem_object *obj, *on;
1535	I915_RND_STATE(prng);
1536	LIST_HEAD(objects);
1537	u64 total;
1538	int err = -ENODEV;
1539
1540	/* i915_gem_gtt_reserve() tries to reserve the precise range
1541	 * for the node, and evicts if it has to. So our test checks that
1542	 * it can give us the requsted space and prevent overlaps.
1543	 */
1544
1545	/* Start by filling the GGTT */
1546	for (total = 0;
1547	     total + 2 * I915_GTT_PAGE_SIZE <= ggtt->vm.total;
1548	     total += 2 * I915_GTT_PAGE_SIZE) {
1549		struct i915_vma *vma;
1550
1551		obj = i915_gem_object_create_internal(ggtt->vm.i915,
1552						      2 * PAGE_SIZE);
1553		if (IS_ERR(obj)) {
1554			err = PTR_ERR(obj);
1555			goto out;
1556		}
1557
1558		err = i915_gem_object_pin_pages_unlocked(obj);
1559		if (err) {
1560			i915_gem_object_put(obj);
1561			goto out;
1562		}
1563
1564		list_add(&obj->st_link, &objects);
1565		vma = i915_vma_instance(obj, &ggtt->vm, NULL);
1566		if (IS_ERR(vma)) {
1567			err = PTR_ERR(vma);
1568			goto out;
1569		}
1570
1571		err = reserve_gtt_with_resource(vma, total);
1572		if (err) {
1573			pr_err("i915_gem_gtt_reserve (pass 1) failed at %llu/%llu with err=%d\n",
1574			       total, ggtt->vm.total, err);
1575			goto out;
1576		}
1577		track_vma_bind(vma);
1578
1579		GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
1580		if (vma->node.start != total ||
1581		    vma->node.size != 2*I915_GTT_PAGE_SIZE) {
1582			pr_err("i915_gem_gtt_reserve (pass 1) placement failed, found (%llx + %llx), expected (%llx + %llx)\n",
1583			       vma->node.start, vma->node.size,
1584			       total, 2*I915_GTT_PAGE_SIZE);
1585			err = -EINVAL;
1586			goto out;
1587		}
1588	}
1589
1590	/* Now we start forcing evictions */
1591	for (total = I915_GTT_PAGE_SIZE;
1592	     total + 2 * I915_GTT_PAGE_SIZE <= ggtt->vm.total;
1593	     total += 2 * I915_GTT_PAGE_SIZE) {
1594		struct i915_vma *vma;
1595
1596		obj = i915_gem_object_create_internal(ggtt->vm.i915,
1597						      2 * PAGE_SIZE);
1598		if (IS_ERR(obj)) {
1599			err = PTR_ERR(obj);
1600			goto out;
1601		}
1602
1603		err = i915_gem_object_pin_pages_unlocked(obj);
1604		if (err) {
1605			i915_gem_object_put(obj);
1606			goto out;
1607		}
1608
1609		list_add(&obj->st_link, &objects);
1610
1611		vma = i915_vma_instance(obj, &ggtt->vm, NULL);
1612		if (IS_ERR(vma)) {
1613			err = PTR_ERR(vma);
1614			goto out;
1615		}
1616
1617		err = reserve_gtt_with_resource(vma, total);
1618		if (err) {
1619			pr_err("i915_gem_gtt_reserve (pass 2) failed at %llu/%llu with err=%d\n",
1620			       total, ggtt->vm.total, err);
1621			goto out;
1622		}
1623		track_vma_bind(vma);
1624
1625		GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
1626		if (vma->node.start != total ||
1627		    vma->node.size != 2*I915_GTT_PAGE_SIZE) {
1628			pr_err("i915_gem_gtt_reserve (pass 2) placement failed, found (%llx + %llx), expected (%llx + %llx)\n",
1629			       vma->node.start, vma->node.size,
1630			       total, 2*I915_GTT_PAGE_SIZE);
1631			err = -EINVAL;
1632			goto out;
1633		}
1634	}
1635
1636	/* And then try at random */
1637	list_for_each_entry_safe(obj, on, &objects, st_link) {
1638		struct i915_vma *vma;
1639		u64 offset;
1640
1641		vma = i915_vma_instance(obj, &ggtt->vm, NULL);
1642		if (IS_ERR(vma)) {
1643			err = PTR_ERR(vma);
1644			goto out;
1645		}
1646
1647		err = i915_vma_unbind_unlocked(vma);
1648		if (err) {
1649			pr_err("i915_vma_unbind failed with err=%d!\n", err);
1650			goto out;
1651		}
1652
1653		offset = igt_random_offset(&prng,
1654					   0, ggtt->vm.total,
1655					   2 * I915_GTT_PAGE_SIZE,
1656					   I915_GTT_MIN_ALIGNMENT);
1657
1658		err = reserve_gtt_with_resource(vma, offset);
1659		if (err) {
1660			pr_err("i915_gem_gtt_reserve (pass 3) failed at %llu/%llu with err=%d\n",
1661			       total, ggtt->vm.total, err);
1662			goto out;
1663		}
1664		track_vma_bind(vma);
1665
1666		GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
1667		if (vma->node.start != offset ||
1668		    vma->node.size != 2*I915_GTT_PAGE_SIZE) {
1669			pr_err("i915_gem_gtt_reserve (pass 3) placement failed, found (%llx + %llx), expected (%llx + %llx)\n",
1670			       vma->node.start, vma->node.size,
1671			       offset, 2*I915_GTT_PAGE_SIZE);
1672			err = -EINVAL;
1673			goto out;
1674		}
1675	}
1676
1677out:
1678	list_for_each_entry_safe(obj, on, &objects, st_link) {
1679		i915_gem_object_unpin_pages(obj);
1680		i915_gem_object_put(obj);
1681	}
1682	return err;
1683}
1684
1685static int insert_gtt_with_resource(struct i915_vma *vma)
1686{
1687	struct i915_address_space *vm = vma->vm;
1688	struct i915_vma_resource *vma_res;
1689	struct drm_i915_gem_object *obj = vma->obj;
1690	int err;
1691
1692	vma_res = i915_vma_resource_alloc();
1693	if (IS_ERR(vma_res))
1694		return PTR_ERR(vma_res);
1695
1696	mutex_lock(&vm->mutex);
1697	err = i915_gem_gtt_insert(vm, NULL, &vma->node, obj->base.size, 0,
1698				  obj->pat_index, 0, vm->total, 0);
1699	if (!err) {
1700		i915_vma_resource_init_from_vma(vma_res, vma);
1701		vma->resource = vma_res;
1702	} else {
1703		kfree(vma_res);
1704	}
1705	mutex_unlock(&vm->mutex);
1706
1707	return err;
1708}
1709
1710static int igt_gtt_insert(void *arg)
1711{
1712	struct i915_ggtt *ggtt = arg;
1713	struct drm_i915_gem_object *obj, *on;
1714	struct drm_mm_node tmp = {};
1715	const struct invalid_insert {
1716		u64 size;
1717		u64 alignment;
1718		u64 start, end;
1719	} invalid_insert[] = {
1720		{
1721			ggtt->vm.total + I915_GTT_PAGE_SIZE, 0,
1722			0, ggtt->vm.total,
1723		},
1724		{
1725			2*I915_GTT_PAGE_SIZE, 0,
1726			0, I915_GTT_PAGE_SIZE,
1727		},
1728		{
1729			-(u64)I915_GTT_PAGE_SIZE, 0,
1730			0, 4*I915_GTT_PAGE_SIZE,
1731		},
1732		{
1733			-(u64)2*I915_GTT_PAGE_SIZE, 2*I915_GTT_PAGE_SIZE,
1734			0, 4*I915_GTT_PAGE_SIZE,
1735		},
1736		{
1737			I915_GTT_PAGE_SIZE, I915_GTT_MIN_ALIGNMENT << 1,
1738			I915_GTT_MIN_ALIGNMENT, I915_GTT_MIN_ALIGNMENT << 1,
1739		},
1740		{}
1741	}, *ii;
1742	LIST_HEAD(objects);
1743	u64 total;
1744	int err = -ENODEV;
1745
1746	/* i915_gem_gtt_insert() tries to allocate some free space in the GTT
1747	 * to the node, evicting if required.
1748	 */
1749
1750	/* Check a couple of obviously invalid requests */
1751	for (ii = invalid_insert; ii->size; ii++) {
1752		mutex_lock(&ggtt->vm.mutex);
1753		err = i915_gem_gtt_insert(&ggtt->vm, NULL, &tmp,
1754					  ii->size, ii->alignment,
1755					  I915_COLOR_UNEVICTABLE,
1756					  ii->start, ii->end,
1757					  0);
1758		mutex_unlock(&ggtt->vm.mutex);
1759		if (err != -ENOSPC) {
1760			pr_err("Invalid i915_gem_gtt_insert(.size=%llx, .alignment=%llx, .start=%llx, .end=%llx) succeeded (err=%d)\n",
1761			       ii->size, ii->alignment, ii->start, ii->end,
1762			       err);
1763			return -EINVAL;
1764		}
1765	}
1766
1767	/* Start by filling the GGTT */
1768	for (total = 0;
1769	     total + I915_GTT_PAGE_SIZE <= ggtt->vm.total;
1770	     total += I915_GTT_PAGE_SIZE) {
1771		struct i915_vma *vma;
1772
1773		obj = i915_gem_object_create_internal(ggtt->vm.i915,
1774						      I915_GTT_PAGE_SIZE);
1775		if (IS_ERR(obj)) {
1776			err = PTR_ERR(obj);
1777			goto out;
1778		}
1779
1780		err = i915_gem_object_pin_pages_unlocked(obj);
1781		if (err) {
1782			i915_gem_object_put(obj);
1783			goto out;
1784		}
1785
1786		list_add(&obj->st_link, &objects);
1787
1788		vma = i915_vma_instance(obj, &ggtt->vm, NULL);
1789		if (IS_ERR(vma)) {
1790			err = PTR_ERR(vma);
1791			goto out;
1792		}
1793
1794		err = insert_gtt_with_resource(vma);
1795		if (err == -ENOSPC) {
1796			/* maxed out the GGTT space */
1797			i915_gem_object_put(obj);
1798			break;
1799		}
1800		if (err) {
1801			pr_err("i915_gem_gtt_insert (pass 1) failed at %llu/%llu with err=%d\n",
1802			       total, ggtt->vm.total, err);
1803			goto out;
1804		}
1805		track_vma_bind(vma);
1806		__i915_vma_pin(vma);
1807
1808		GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
1809	}
1810
1811	list_for_each_entry(obj, &objects, st_link) {
1812		struct i915_vma *vma;
1813
1814		vma = i915_vma_instance(obj, &ggtt->vm, NULL);
1815		if (IS_ERR(vma)) {
1816			err = PTR_ERR(vma);
1817			goto out;
1818		}
1819
1820		if (!drm_mm_node_allocated(&vma->node)) {
1821			pr_err("VMA was unexpectedly evicted!\n");
1822			err = -EINVAL;
1823			goto out;
1824		}
1825
1826		__i915_vma_unpin(vma);
1827	}
1828
1829	/* If we then reinsert, we should find the same hole */
1830	list_for_each_entry_safe(obj, on, &objects, st_link) {
1831		struct i915_vma *vma;
1832		u64 offset;
1833
1834		vma = i915_vma_instance(obj, &ggtt->vm, NULL);
1835		if (IS_ERR(vma)) {
1836			err = PTR_ERR(vma);
1837			goto out;
1838		}
1839
1840		GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
1841		offset = vma->node.start;
1842
1843		err = i915_vma_unbind_unlocked(vma);
1844		if (err) {
1845			pr_err("i915_vma_unbind failed with err=%d!\n", err);
1846			goto out;
1847		}
1848
1849		err = insert_gtt_with_resource(vma);
1850		if (err) {
1851			pr_err("i915_gem_gtt_insert (pass 2) failed at %llu/%llu with err=%d\n",
1852			       total, ggtt->vm.total, err);
1853			goto out;
1854		}
1855		track_vma_bind(vma);
1856
1857		GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
1858		if (vma->node.start != offset) {
1859			pr_err("i915_gem_gtt_insert did not return node to its previous location (the only hole), expected address %llx, found %llx\n",
1860			       offset, vma->node.start);
1861			err = -EINVAL;
1862			goto out;
1863		}
1864	}
1865
1866	/* And then force evictions */
1867	for (total = 0;
1868	     total + 2 * I915_GTT_PAGE_SIZE <= ggtt->vm.total;
1869	     total += 2 * I915_GTT_PAGE_SIZE) {
1870		struct i915_vma *vma;
1871
1872		obj = i915_gem_object_create_internal(ggtt->vm.i915,
1873						      2 * I915_GTT_PAGE_SIZE);
1874		if (IS_ERR(obj)) {
1875			err = PTR_ERR(obj);
1876			goto out;
1877		}
1878
1879		err = i915_gem_object_pin_pages_unlocked(obj);
1880		if (err) {
1881			i915_gem_object_put(obj);
1882			goto out;
1883		}
1884
1885		list_add(&obj->st_link, &objects);
1886
1887		vma = i915_vma_instance(obj, &ggtt->vm, NULL);
1888		if (IS_ERR(vma)) {
1889			err = PTR_ERR(vma);
1890			goto out;
1891		}
1892
1893		err = insert_gtt_with_resource(vma);
1894		if (err) {
1895			pr_err("i915_gem_gtt_insert (pass 3) failed at %llu/%llu with err=%d\n",
1896			       total, ggtt->vm.total, err);
1897			goto out;
1898		}
1899		track_vma_bind(vma);
1900
1901		GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
1902	}
1903
1904out:
1905	list_for_each_entry_safe(obj, on, &objects, st_link) {
1906		i915_gem_object_unpin_pages(obj);
1907		i915_gem_object_put(obj);
1908	}
1909	return err;
1910}
1911
1912int i915_gem_gtt_mock_selftests(void)
1913{
1914	static const struct i915_subtest tests[] = {
1915		SUBTEST(igt_mock_drunk),
1916		SUBTEST(igt_mock_walk),
1917		SUBTEST(igt_mock_pot),
1918		SUBTEST(igt_mock_fill),
1919		SUBTEST(igt_gtt_reserve),
1920		SUBTEST(igt_gtt_insert),
1921	};
1922	struct drm_i915_private *i915;
1923	struct intel_gt *gt;
1924	int err;
1925
1926	i915 = mock_gem_device();
1927	if (!i915)
1928		return -ENOMEM;
1929
1930	/* allocate the ggtt */
1931	err = intel_gt_assign_ggtt(to_gt(i915));
1932	if (err)
1933		goto out_put;
1934
1935	gt = to_gt(i915);
1936
1937	mock_init_ggtt(gt);
1938
1939	err = i915_subtests(tests, gt->ggtt);
1940
1941	mock_device_flush(i915);
1942	i915_gem_drain_freed_objects(i915);
1943	mock_fini_ggtt(gt->ggtt);
1944
1945out_put:
1946	mock_destroy_device(i915);
1947	return err;
1948}
1949
1950int i915_gem_gtt_live_selftests(struct drm_i915_private *i915)
1951{
1952	static const struct i915_subtest tests[] = {
1953		SUBTEST(igt_ppgtt_alloc),
1954		SUBTEST(igt_ppgtt_lowlevel),
1955		SUBTEST(igt_ppgtt_drunk),
1956		SUBTEST(igt_ppgtt_walk),
1957		SUBTEST(igt_ppgtt_pot),
1958		SUBTEST(igt_ppgtt_fill),
1959		SUBTEST(igt_ppgtt_shrink),
1960		SUBTEST(igt_ppgtt_shrink_boom),
1961		SUBTEST(igt_ppgtt_misaligned_pin),
1962		SUBTEST(igt_ggtt_lowlevel),
1963		SUBTEST(igt_ggtt_drunk),
1964		SUBTEST(igt_ggtt_walk),
1965		SUBTEST(igt_ggtt_pot),
1966		SUBTEST(igt_ggtt_fill),
1967		SUBTEST(igt_ggtt_page),
1968		SUBTEST(igt_ggtt_misaligned_pin),
1969	};
1970
1971	GEM_BUG_ON(offset_in_page(to_gt(i915)->ggtt->vm.total));
1972
1973	return i915_live_subtests(tests, i915);
1974}
1975