diff options
| -rw-r--r-- | 0007-drm_915_Serialise_i915_active_acquire_with__active_retire.patch | 78 | ||||
| -rw-r--r-- | 0008-drm_i915_gem_Take_runtime-pm_wakeref_prior_to_unbinding.patch | 129 | ||||
| -rw-r--r-- | 0009-drm-915-gem-Avoid-parking-the-vma-as-we-unbind.patch | 63 | ||||
| -rw-r--r-- | 0010-drm-i915-gem-Try-to-flush-pending-unbind-events.patch | 64 | ||||
| -rw-r--r-- | 0011-drm-i915-gem-Reinitialise-the-local-list-before-repeating.patch | 33 | ||||
| -rw-r--r-- | 0012-drm-i915-Add-a-simple-is-bound-check-before-unbinding.patch | 41 | ||||
| -rw-r--r-- | 0013-drm-i915-Introduce-a-vma.kref.patch | 252 | ||||
| -rw-r--r-- | PKGBUILD | 27 | ||||
| -rw-r--r-- | config | 4 | 
9 files changed, 686 insertions, 5 deletions
diff --git a/0007-drm_915_Serialise_i915_active_acquire_with__active_retire.patch b/0007-drm_915_Serialise_i915_active_acquire_with__active_retire.patch new file mode 100644 index 0000000..937adac --- /dev/null +++ b/0007-drm_915_Serialise_i915_active_acquire_with__active_retire.patch @@ -0,0 +1,78 @@ +From 167299b5c1cc6f0c1274271aec0ab2b9fec01594 Mon Sep 17 00:00:00 2001 +From: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu, 5 Dec 2019 18:33:32 +0000 +Subject: drm/i915: Serialise i915_active_acquire() with __active_retire() + +As __active_retire() does it's final atomic_dec() under the +ref->tree_lock spinlock, in order to prevent ourselves from reusing the +ref->cache and ref->tree as they are being destroyed, we need to +serialise with the retirement during i915_active_acquire(). + +[  +0.000005] kernel BUG at drivers/gpu/drm/i915/i915_active.c:157! +[  +0.000011] invalid opcode: 0000 [#1] SMP +[  +0.000004] CPU: 7 PID: 188 Comm: kworker/u16:4 Not tainted 5.4.0-rc8-03070-gac5e57322614 #89 +[  +0.000002] Hardware name: Razer Razer Blade Stealth 13 Late 2019/LY320, BIOS 1.02 09/10/2019 +[  +0.000082] Workqueue: events_unbound active_work [i915] +[  +0.000059] RIP: 0010:__active_retire+0x115/0x120 [i915] +[  +0.000003] Code: 75 28 48 8b 3d 8c 6e 1a 00 48 89 ee e8 e4 5f a5 c0 48 8b 44 24 10 65 48 33 04 25 28 00 00 00 75 0f 48 83 c4 18 5b 5d 41 5c c3 <0f> 0b 0f 0b 0f 0b e8 a0 90 87 c0 0f 1f 44 00 00 48 8b 3d 54 6e 1a +[  +0.000002] RSP: 0018:ffffb833003f7e48 EFLAGS: 00010286 +[  +0.000003] RAX: ffff8d6e8d726d00 RBX: ffff8d6f9db4e840 RCX: 0000000000000000 +[  +0.000001] RDX: ffffffff82605930 RSI: ffff8d6f9adc4908 RDI: ffff8d6e96cefe28 +[  +0.000002] RBP: ffff8d6e96cefe00 R08: 0000000000000000 R09: ffff8d6f9ffe9a50 +[  +0.000002] R10: 0000000000000048 R11: 0000000000000018 R12: ffff8d6f9adc4930 +[  +0.000001] R13: ffff8d6f9e04fb00 R14: 0000000000000000 R15: ffff8d6f9adc4988 +[  +0.000002] FS:  0000000000000000(0000) GS:ffff8d6f9ffc0000(0000) knlGS:0000000000000000 +[  +0.000002] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033 +[  +0.000002] CR2: 000055eb5a34cf10 CR3: 000000018d609002 CR4: 0000000000760ee0 +[  +0.000002] PKRU: 55555554 +[  +0.000001] Call Trace: +[  +0.000010]  process_one_work+0x1aa/0x350 +[  +0.000004]  worker_thread+0x4d/0x3a0 +[  +0.000004]  kthread+0xfb/0x130 +[  +0.000004]  ? process_one_work+0x350/0x350 +[  +0.000003]  ? kthread_park+0x90/0x90 +[  +0.000005]  ret_from_fork+0x1f/0x40 + +Reported-by: Kenneth Graunke <kenneth@whitecape.org> +Fixes: c9ad602feabe ("drm/i915: Split i915_active.mutex into an irq-safe spinlock for the rbtree") +Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> +Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com> +Cc: Kenneth Graunke <kenneth@whitecape.org> +Cc: Matthew Auld <matthew.auld@intel.com> +Tested-by: Kenneth Graunke <kenneth@whitecape.org> +Reviewed-by: Kenneth Graunke <kenneth@whitecape.org> +Link: https://patchwork.freedesktop.org/patch/msgid/20191205183332.801237-1-chris@chris-wilson.co.uk +--- + drivers/gpu/drm/i915/i915_active.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/drivers/gpu/drm/i915/i915_active.c b/drivers/gpu/drm/i915/i915_active.c +index a19e7d89bc8a..378b52d1ab74 100644 +--- a/drivers/gpu/drm/i915/i915_active.c ++++ b/drivers/gpu/drm/i915/i915_active.c +@@ -91,10 +91,9 @@ static void debug_active_init(struct i915_active *ref) +  + static void debug_active_activate(struct i915_active *ref) + { +-	spin_lock_irq(&ref->tree_lock); ++	lockdep_assert_held(&ref->tree_lock); + 	if (!atomic_read(&ref->count)) /* before the first inc */ + 		debug_object_activate(ref, &active_debug_desc); +-	spin_unlock_irq(&ref->tree_lock); + } +  + static void debug_active_deactivate(struct i915_active *ref) +@@ -407,8 +406,10 @@ int i915_active_acquire(struct i915_active *ref) + 	if (!atomic_read(&ref->count) && ref->active) + 		err = ref->active(ref); + 	if (!err) { ++		spin_lock_irq(&ref->tree_lock); /* vs __active_retire() */ + 		debug_active_activate(ref); + 		atomic_inc(&ref->count); ++		spin_unlock_irq(&ref->tree_lock); + 	} +  + 	mutex_unlock(&ref->mutex); +--  +cgit v1.2.2-1-gc45e + diff --git a/0008-drm_i915_gem_Take_runtime-pm_wakeref_prior_to_unbinding.patch b/0008-drm_i915_gem_Take_runtime-pm_wakeref_prior_to_unbinding.patch new file mode 100644 index 0000000..3afe243 --- /dev/null +++ b/0008-drm_i915_gem_Take_runtime-pm_wakeref_prior_to_unbinding.patch @@ -0,0 +1,129 @@ +From e3d3fd13d0ac1e12848b4f2a57e9e4bf2b557bf0 Mon Sep 17 00:00:00 2001 +From: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue, 3 Dec 2019 10:13:46 +0000 +Subject: drm/i915/gem: Take runtime-pm wakeref prior to unbinding + +Some machines require ACPI for runtime resume, and ACPI is quite kmalloc +happy. We cannot handle kmalloc from inside the vm->mutex, as they are +used by the shrinker, and so we must ensure the global runtime-pm is +awake prior to unbinding to avoid the potential inversion. + +<4> [57.121748] ====================================================== +<4> [57.121750] WARNING: possible circular locking dependency detected +<4> [57.121753] 5.4.0-rc8-CI-CI_DRM_7466+ #1 Tainted: G     U +<4> [57.121754] ------------------------------------------------------ +<4> [57.121756] i915_pm_rpm/1105 is trying to acquire lock: +<4> [57.121758] ffffffff82263a40 (fs_reclaim){+.+.}, at: fs_reclaim_acquire.part.117+0x0/0x30 +<4> [57.121766] +but task is already holding lock: +<4> [57.121768] ffff888475a593c0 (&vm->mutex){+.+.}, at: i915_vma_unbind+0x21/0x50 [i915] +<4> [57.121868] +which lock already depends on the new lock. + +<4> [57.121869] +the existing dependency chain (in reverse order) is: +<4> [57.121871] +-> #1 (&vm->mutex){+.+.}: +<4> [57.121951]        i915_gem_shrinker_taints_mutex+0xa2/0xd0 [i915] +<4> [57.122028]        i915_address_space_init+0xa9/0x170 [i915] +<4> [57.122104]        i915_ggtt_init_hw+0x47/0x130 [i915] +<4> [57.122150]        i915_driver_probe+0xbb4/0x15f0 [i915] +<4> [57.122197]        i915_pci_probe+0x43/0x1c0 [i915] +<4> [57.122202]        pci_device_probe+0x9e/0x120 +<4> [57.122206]        really_probe+0xea/0x420 +<4> [57.122209]        driver_probe_device+0x10b/0x120 +<4> [57.122212]        device_driver_attach+0x4a/0x50 +<4> [57.122214]        __driver_attach+0x97/0x130 +<4> [57.122217]        bus_for_each_dev+0x74/0xc0 +<4> [57.122220]        bus_add_driver+0x142/0x220 +<4> [57.122222]        driver_register+0x56/0xf0 +<4> [57.122226]        do_one_initcall+0x58/0x2ff +<4> [57.122230]        do_init_module+0x56/0x1f8 +<4> [57.122233]        load_module+0x243e/0x29f0 +<4> [57.122236]        __do_sys_finit_module+0xe9/0x110 +<4> [57.122239]        do_syscall_64+0x4f/0x210 +<4> [57.122242]        entry_SYSCALL_64_after_hwframe+0x49/0xbe +<4> [57.122244] +-> #0 (fs_reclaim){+.+.}: +<4> [57.122249]        __lock_acquire+0x1328/0x15d0 +<4> [57.122251]        lock_acquire+0xa7/0x1c0 +<4> [57.122254]        fs_reclaim_acquire.part.117+0x24/0x30 +<4> [57.122257]        __kmalloc+0x48/0x320 +<4> [57.122261]        acpi_ns_internalize_name+0x44/0x9b +<4> [57.122264]        acpi_ns_get_node_unlocked+0x6b/0xd3 +<4> [57.122267]        acpi_ns_get_node+0x3b/0x50 +<4> [57.122271]        acpi_get_handle+0x8a/0xb4 +<4> [57.122274]        acpi_has_method+0x1c/0x40 +<4> [57.122278]        acpi_pci_set_power_state+0x40/0xe0 +<4> [57.122281]        pci_platform_power_transition+0x3e/0x90 +<4> [57.122284]        pci_set_power_state+0x83/0xf0 +<4> [57.122287]        pci_restore_standard_config+0x22/0x40 +<4> [57.122289]        pci_pm_runtime_resume+0x23/0xc0 +<4> [57.122293]        __rpm_callback+0xb1/0x110 +<4> [57.122296]        rpm_callback+0x1a/0x70 +<4> [57.122299]        rpm_resume+0x50e/0x790 +<4> [57.122302]        __pm_runtime_resume+0x42/0x80 +<4> [57.122357]        __intel_runtime_pm_get+0x15/0x60 [i915] +<4> [57.122435]        ggtt_unbind_vma+0x24/0x60 [i915] +<4> [57.122514]        __i915_vma_unbind.part.39+0xb5/0x500 [i915] +<4> [57.122593]        i915_vma_unbind+0x2d/0x50 [i915] +<4> [57.122668]        i915_gem_object_unbind+0x11c/0x260 [i915] +<4> [57.122740]        i915_gem_object_set_cache_level+0x32/0x90 [i915] +<4> [57.122810]        i915_gem_set_caching_ioctl+0x1f7/0x2f0 [i915] +<4> [57.122815]        drm_ioctl_kernel+0xa7/0xf0 +<4> [57.122818]        drm_ioctl+0x2e1/0x390 +<4> [57.122822]        do_vfs_ioctl+0xa0/0x6f0 +<4> [57.122825]        ksys_ioctl+0x35/0x60 +<4> [57.122828]        __x64_sys_ioctl+0x11/0x20 +<4> [57.122830]        do_syscall_64+0x4f/0x210 +<4> [57.122833]        entry_SYSCALL_64_after_hwframe+0x49/0xbe + +Closes: https://gitlab.freedesktop.org/drm/intel/issues/711 +Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> +Reviewed-by: Matthew Auld <matthew.auld@intel.com> +Link: https://patchwork.freedesktop.org/patch/msgid/20191203101347.2836057-1-chris@chris-wilson.co.uk +--- + drivers/gpu/drm/i915/i915_gem.c | 17 ++++++++++++++++- + 1 file changed, 16 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c +index 3f07948ea4da..ed2436db5dd2 100644 +--- a/drivers/gpu/drm/i915/i915_gem.c ++++ b/drivers/gpu/drm/i915/i915_gem.c +@@ -119,10 +119,23 @@ i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data, + int i915_gem_object_unbind(struct drm_i915_gem_object *obj, + 			   unsigned long flags) + { +-	struct i915_vma *vma; ++	struct intel_runtime_pm *rpm = &to_i915(obj->base.dev)->runtime_pm; + 	LIST_HEAD(still_in_list); ++	intel_wakeref_t wakeref; ++	struct i915_vma *vma; + 	int ret = 0; +  ++	if (!atomic_read(&obj->bind_count)) ++		return 0; ++ ++	/* ++	 * As some machines use ACPI to handle runtime-resume callbacks, and ++	 * ACPI is quite kmalloc happy, we cannot resume beneath the vm->mutex ++	 * as they are required by the shrinker. Ergo, we wake the device up ++	 * first just in case. ++	 */ ++	wakeref = intel_runtime_pm_get(rpm); ++ + 	spin_lock(&obj->vma.lock); + 	while (!ret && (vma = list_first_entry_or_null(&obj->vma.list, + 						       struct i915_vma, +@@ -146,6 +159,8 @@ int i915_gem_object_unbind(struct drm_i915_gem_object *obj, + 	list_splice(&still_in_list, &obj->vma.list); + 	spin_unlock(&obj->vma.lock); +  ++	intel_runtime_pm_put(rpm, wakeref); ++ + 	return ret; + } +  +--  +cgit v1.2.2-1-gc45e + diff --git a/0009-drm-915-gem-Avoid-parking-the-vma-as-we-unbind.patch b/0009-drm-915-gem-Avoid-parking-the-vma-as-we-unbind.patch new file mode 100644 index 0000000..9887e67 --- /dev/null +++ b/0009-drm-915-gem-Avoid-parking-the-vma-as-we-unbind.patch @@ -0,0 +1,63 @@ +From 89678e8921d00143665237e719f96cfc8425f804 Mon Sep 17 00:00:00 2001 +From: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue, 3 Dec 2019 15:50:32 +0000 +Subject: drm/i915/gem: Avoid parking the vma as we unbind + +In order to avoid keeping a reference on the i915_vma (which is long +overdue!) we have to coordinate all the possible lifetimes and only use +the vma while we know it is alive. In this episode, we are reminded that +while idle, the closed vma are destroyed. So if the GT idles while we are +working with the vma, the vma itself becomes invalid. + +First class i915_vma here we come, but in the meantime keep piling on +the straw. + +Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> +Reviewed-by: Matthew Auld <matthew.auld@intel.com> +Link: https://patchwork.freedesktop.org/patch/msgid/20191203155032.3137263-1-chris@chris-wilson.co.uk +--- + drivers/gpu/drm/i915/i915_gem.c | 17 ++++++++++++++++- + 1 file changed, 16 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c +index ed2436db5dd2..739543812422 100644 +--- a/drivers/gpu/drm/i915/i915_gem.c ++++ b/drivers/gpu/drm/i915/i915_gem.c +@@ -141,18 +141,33 @@ int i915_gem_object_unbind(struct drm_i915_gem_object *obj, + 						       struct i915_vma, + 						       obj_link))) { + 		struct i915_address_space *vm = vma->vm; ++		bool awake = false; +  +-		ret = -EBUSY; ++		ret = -EAGAIN; + 		if (!i915_vm_tryopen(vm)) + 			break; +  ++		/* Prevent vma being freed by i915_vma_parked as we unbind */ ++		if (intel_gt_pm_get_if_awake(vm->gt)) { ++			awake = true; ++		} else { ++			if (i915_vma_is_closed(vma)) { ++				spin_unlock(&obj->vma.lock); ++				goto err_vm; ++			} ++		} ++ + 		list_move_tail(&vma->obj_link, &still_in_list); + 		spin_unlock(&obj->vma.lock); +  ++		ret = -EBUSY; + 		if (flags & I915_GEM_OBJECT_UNBIND_ACTIVE || + 		    !i915_vma_is_active(vma)) + 			ret = i915_vma_unbind(vma); +  ++		if (awake) ++			intel_gt_pm_put(vm->gt); ++err_vm: + 		i915_vm_close(vm); + 		spin_lock(&obj->vma.lock); + 	} +--  +cgit v1.2.2-1-gc45e + diff --git a/0010-drm-i915-gem-Try-to-flush-pending-unbind-events.patch b/0010-drm-i915-gem-Try-to-flush-pending-unbind-events.patch new file mode 100644 index 0000000..52196eb --- /dev/null +++ b/0010-drm-i915-gem-Try-to-flush-pending-unbind-events.patch @@ -0,0 +1,64 @@ +From bfe34ef7e07d52ada331df8e1c5938906693b950 Mon Sep 17 00:00:00 2001 +From: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed, 4 Dec 2019 12:35:56 +0000 +Subject: drm/i915/gem: Try to flush pending unbind events + +If we cannot handle a vma within the unbind loop, try to flush the +pending events (i915_vma_parked, i915_vm_release) and try again. This +avoids a round trip to userspace that is not guaranteed to make forward +progress, as the events we wait upon require being idle. + +References: cb6c3d45f948 ("drm/i915/gem: Avoid parking the vma as we unbind") +Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> +Cc: Matthew Auld <matthew.auld@intel.com> +Reviewed-by: Matthew Auld <matthew.auld@intel.com> +Link: https://patchwork.freedesktop.org/patch/msgid/20191204123556.3740002-1-chris@chris-wilson.co.uk +--- + drivers/gpu/drm/i915/i915_gem.c | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c +index 739543812422..85b12228c2cf 100644 +--- a/drivers/gpu/drm/i915/i915_gem.c ++++ b/drivers/gpu/drm/i915/i915_gem.c +@@ -123,7 +123,7 @@ int i915_gem_object_unbind(struct drm_i915_gem_object *obj, + 	LIST_HEAD(still_in_list); + 	intel_wakeref_t wakeref; + 	struct i915_vma *vma; +-	int ret = 0; ++	int ret; +  + 	if (!atomic_read(&obj->bind_count)) + 		return 0; +@@ -136,6 +136,8 @@ int i915_gem_object_unbind(struct drm_i915_gem_object *obj, + 	 */ + 	wakeref = intel_runtime_pm_get(rpm); +  ++try_again: ++	ret = 0; + 	spin_lock(&obj->vma.lock); + 	while (!ret && (vma = list_first_entry_or_null(&obj->vma.list, + 						       struct i915_vma, +@@ -153,6 +155,7 @@ int i915_gem_object_unbind(struct drm_i915_gem_object *obj, + 		} else { + 			if (i915_vma_is_closed(vma)) { + 				spin_unlock(&obj->vma.lock); ++				i915_vma_parked(vm->gt); + 				goto err_vm; + 			} + 		} +@@ -174,6 +177,11 @@ err_vm: + 	list_splice(&still_in_list, &obj->vma.list); + 	spin_unlock(&obj->vma.lock); +  ++	if (ret == -EAGAIN && flags & I915_GEM_OBJECT_UNBIND_ACTIVE) { ++		rcu_barrier(); /* flush the i915_vm_release() */ ++		goto try_again; ++	} ++ + 	intel_runtime_pm_put(rpm, wakeref); +  + 	return ret; +--  +cgit v1.2.2-1-gc45e + diff --git a/0011-drm-i915-gem-Reinitialise-the-local-list-before-repeating.patch b/0011-drm-i915-gem-Reinitialise-the-local-list-before-repeating.patch new file mode 100644 index 0000000..2719884 --- /dev/null +++ b/0011-drm-i915-gem-Reinitialise-the-local-list-before-repeating.patch @@ -0,0 +1,33 @@ +From 52bc26b084be047fbc485f711dc2b88c0a1b2923 Mon Sep 17 00:00:00 2001 +From: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu, 5 Dec 2019 13:29:12 +0000 +Subject: drm/i915/gem: Reinitialise the local list before repeating + +As we may start the loop again, we require our local list of i915_vma +we've processed to be reinitialised. + +Fixes: aa5e4453dc05 ("drm/i915/gem: Try to flush pending unbind events") +Closes: https://gitlab.freedesktop.org/drm/intel/issues/731 +Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> +Reviewed-by: Andi Shyti <andi.shyti@intel.com> +Link: https://patchwork.freedesktop.org/patch/msgid/20191205132912.606868-1-chris@chris-wilson.co.uk +--- + drivers/gpu/drm/i915/i915_gem.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c +index 85b12228c2cf..c2c025c4f4ad 100644 +--- a/drivers/gpu/drm/i915/i915_gem.c ++++ b/drivers/gpu/drm/i915/i915_gem.c +@@ -174,7 +174,7 @@ err_vm: + 		i915_vm_close(vm); + 		spin_lock(&obj->vma.lock); + 	} +-	list_splice(&still_in_list, &obj->vma.list); ++	list_splice_init(&still_in_list, &obj->vma.list); + 	spin_unlock(&obj->vma.lock); +  + 	if (ret == -EAGAIN && flags & I915_GEM_OBJECT_UNBIND_ACTIVE) { +--  +cgit v1.2.2-1-gc45e + diff --git a/0012-drm-i915-Add-a-simple-is-bound-check-before-unbinding.patch b/0012-drm-i915-Add-a-simple-is-bound-check-before-unbinding.patch new file mode 100644 index 0000000..9db4525 --- /dev/null +++ b/0012-drm-i915-Add-a-simple-is-bound-check-before-unbinding.patch @@ -0,0 +1,41 @@ +From 513cbef093293a7f0e331eb4fee8e6a1bb9bf5a2 Mon Sep 17 00:00:00 2001 +From: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun, 22 Dec 2019 21:02:54 +0000 +Subject: drm/i915: Add a simple is-bound check before unbinding + +Only acquire the various atomic references required to unbind the vma if +we do need to unbind the vma. + +Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> +Acked-by: Imre Deak <imre.deak@intel.com> +Link: https://patchwork.freedesktop.org/patch/msgid/20191222210256.2066451-1-chris@chris-wilson.co.uk +--- + drivers/gpu/drm/i915/i915_gem.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c +index c2c025c4f4ad..83eed642cbcd 100644 +--- a/drivers/gpu/drm/i915/i915_gem.c ++++ b/drivers/gpu/drm/i915/i915_gem.c +@@ -145,6 +145,10 @@ try_again: + 		struct i915_address_space *vm = vma->vm; + 		bool awake = false; +  ++		list_move_tail(&vma->obj_link, &still_in_list); ++		if (!i915_vma_is_bound(vma, I915_VMA_BIND_MASK)) ++			continue; ++ + 		ret = -EAGAIN; + 		if (!i915_vm_tryopen(vm)) + 			break; +@@ -160,7 +164,6 @@ try_again: + 			} + 		} +  +-		list_move_tail(&vma->obj_link, &still_in_list); + 		spin_unlock(&obj->vma.lock); +  + 		ret = -EBUSY; +--  +cgit v1.2.2-1-gc45e + diff --git a/0013-drm-i915-Introduce-a-vma.kref.patch b/0013-drm-i915-Introduce-a-vma.kref.patch new file mode 100644 index 0000000..2ad022b --- /dev/null +++ b/0013-drm-i915-Introduce-a-vma.kref.patch @@ -0,0 +1,252 @@ +From 2029f44eb483a6ab7c0bc017cb699b7084f5eab4 Mon Sep 17 00:00:00 2001 +From: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun, 22 Dec 2019 21:02:55 +0000 +Subject: drm/i915: Introduce a vma.kref + +Start introducing a kref on i915_vma in order to protect the vma unbind +(i915_gem_object_unbind) from a parallel destruction (i915_vma_parked). +Later, we will use the refcount to manage all access and turn i915_vma +into a first class container. + +Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> +Cc: Imre Deak <imre.deak@intel.com> +Acked-by: Imre Deak <imre.deak@intel.com> +Link: https://patchwork.freedesktop.org/patch/msgid/20191222210256.2066451-2-chris@chris-wilson.co.uk +--- + drivers/gpu/drm/i915/gem/i915_gem_object.c         |  2 +- + drivers/gpu/drm/i915/gem/selftests/huge_pages.c    |  3 +-- + drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c |  4 ++-- + drivers/gpu/drm/i915/i915_gem.c                    | 27 ++++++++-------------- + drivers/gpu/drm/i915/i915_gem_gtt.c                |  5 ++-- + drivers/gpu/drm/i915/i915_vma.c                    |  9 +++++--- + drivers/gpu/drm/i915/i915_vma.h                    | 25 +++++++++++++++++--- + 7 files changed, 44 insertions(+), 31 deletions(-) + +diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.c b/drivers/gpu/drm/i915/gem/i915_gem_object.c +index a596548c07bf..b6937469ffd3 100644 +--- a/drivers/gpu/drm/i915/gem/i915_gem_object.c ++++ b/drivers/gpu/drm/i915/gem/i915_gem_object.c +@@ -174,7 +174,7 @@ static void __i915_gem_free_objects(struct drm_i915_private *i915, + 				GEM_BUG_ON(vma->obj != obj); + 				spin_unlock(&obj->vma.lock); +  +-				i915_vma_destroy(vma); ++				__i915_vma_put(vma); +  + 				spin_lock(&obj->vma.lock); + 			} +diff --git a/drivers/gpu/drm/i915/gem/selftests/huge_pages.c b/drivers/gpu/drm/i915/gem/selftests/huge_pages.c +index 688c49a24f32..bd1e2c12de63 100644 +--- a/drivers/gpu/drm/i915/gem/selftests/huge_pages.c ++++ b/drivers/gpu/drm/i915/gem/selftests/huge_pages.c +@@ -1110,8 +1110,7 @@ static int __igt_write_huge(struct intel_context *ce, + out_vma_unpin: + 	i915_vma_unpin(vma); + out_vma_close: +-	i915_vma_destroy(vma); +- ++	__i915_vma_put(vma); + 	return err; + } +  +diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c +index 29b2077b73d2..d226e55df8b2 100644 +--- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c ++++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c +@@ -161,7 +161,7 @@ static int check_partial_mapping(struct drm_i915_gem_object *obj, + 	kunmap(p); +  + out: +-	i915_vma_destroy(vma); ++	__i915_vma_put(vma); + 	return err; + } +  +@@ -255,7 +255,7 @@ static int check_partial_mappings(struct drm_i915_gem_object *obj, + 		if (err) + 			return err; +  +-		i915_vma_destroy(vma); ++		__i915_vma_put(vma); +  + 		if (igt_timeout(end_time, + 				"%s: timed out after tiling=%d stride=%d\n", +diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c +index 83eed642cbcd..0475a0343487 100644 +--- a/drivers/gpu/drm/i915/i915_gem.c ++++ b/drivers/gpu/drm/i915/i915_gem.c +@@ -143,7 +143,6 @@ try_again: + 						       struct i915_vma, + 						       obj_link))) { + 		struct i915_address_space *vm = vma->vm; +-		bool awake = false; +  + 		list_move_tail(&vma->obj_link, &still_in_list); + 		if (!i915_vma_is_bound(vma, I915_VMA_BIND_MASK)) +@@ -154,26 +153,18 @@ try_again: + 			break; +  + 		/* Prevent vma being freed by i915_vma_parked as we unbind */ +-		if (intel_gt_pm_get_if_awake(vm->gt)) { +-			awake = true; +-		} else { +-			if (i915_vma_is_closed(vma)) { +-				spin_unlock(&obj->vma.lock); +-				i915_vma_parked(vm->gt); +-				goto err_vm; +-			} +-		} +- ++		vma = __i915_vma_get(vma); + 		spin_unlock(&obj->vma.lock); +  +-		ret = -EBUSY; +-		if (flags & I915_GEM_OBJECT_UNBIND_ACTIVE || +-		    !i915_vma_is_active(vma)) +-			ret = i915_vma_unbind(vma); ++		if (vma) { ++			ret = -EBUSY; ++			if (flags & I915_GEM_OBJECT_UNBIND_ACTIVE || ++			    !i915_vma_is_active(vma)) ++				ret = i915_vma_unbind(vma); ++ ++			__i915_vma_put(vma); ++		} +  +-		if (awake) +-			intel_gt_pm_put(vm->gt); +-err_vm: + 		i915_vm_close(vm); + 		spin_lock(&obj->vma.lock); + 	} +diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c +index 44727806dfd7..dd2c20f7d4d2 100644 +--- a/drivers/gpu/drm/i915/i915_gem_gtt.c ++++ b/drivers/gpu/drm/i915/i915_gem_gtt.c +@@ -522,7 +522,7 @@ void __i915_vm_close(struct i915_address_space *vm) +  + 		atomic_and(~I915_VMA_PIN_MASK, &vma->flags); + 		WARN_ON(__i915_vma_unbind(vma)); +-		i915_vma_destroy(vma); ++		__i915_vma_put(vma); +  + 		i915_gem_object_put(obj); + 	} +@@ -1790,7 +1790,7 @@ static void gen6_ppgtt_cleanup(struct i915_address_space *vm) + { + 	struct gen6_ppgtt *ppgtt = to_gen6_ppgtt(i915_vm_to_ppgtt(vm)); +  +-	i915_vma_destroy(ppgtt->vma); ++	__i915_vma_put(ppgtt->vma); +  + 	gen6_ppgtt_free_pd(ppgtt); + 	free_scratch(vm); +@@ -1878,6 +1878,7 @@ static struct i915_vma *pd_vma_create(struct gen6_ppgtt *ppgtt, int size) +  + 	i915_active_init(&vma->active, NULL, NULL); +  ++	kref_init(&vma->ref); + 	mutex_init(&vma->pages_mutex); + 	vma->vm = i915_vm_get(&ggtt->vm); + 	vma->ops = &pd_vma_ops; +diff --git a/drivers/gpu/drm/i915/i915_vma.c b/drivers/gpu/drm/i915/i915_vma.c +index 01c822256b39..00973017abba 100644 +--- a/drivers/gpu/drm/i915/i915_vma.c ++++ b/drivers/gpu/drm/i915/i915_vma.c +@@ -112,6 +112,7 @@ vma_create(struct drm_i915_gem_object *obj, + 	if (vma == NULL) + 		return ERR_PTR(-ENOMEM); +  ++	kref_init(&vma->ref); + 	mutex_init(&vma->pages_mutex); + 	vma->vm = i915_vm_get(vm); + 	vma->ops = &vm->vma_ops; +@@ -978,8 +979,10 @@ void i915_vma_reopen(struct i915_vma *vma) + 		__i915_vma_remove_closed(vma); + } +  +-void i915_vma_destroy(struct i915_vma *vma) ++void i915_vma_release(struct kref *ref) + { ++	struct i915_vma *vma = container_of(ref, typeof(*vma), ref); ++ + 	if (drm_mm_node_allocated(&vma->node)) { + 		mutex_lock(&vma->vm->mutex); + 		atomic_and(~I915_VMA_PIN_MASK, &vma->flags); +@@ -1027,7 +1030,7 @@ void i915_vma_parked(struct intel_gt *gt) + 		spin_unlock_irq(>->closed_lock); +  + 		if (obj) { +-			i915_vma_destroy(vma); ++			__i915_vma_put(vma); + 			i915_gem_object_put(obj); + 		} +  +@@ -1192,7 +1195,7 @@ int __i915_vma_unbind(struct i915_vma *vma) + 	i915_vma_detach(vma); + 	vma_unbind_pages(vma); +  +-	drm_mm_remove_node(&vma->node); /* pairs with i915_vma_destroy() */ ++	drm_mm_remove_node(&vma->node); /* pairs with i915_vma_release() */ + 	return 0; + } +  +diff --git a/drivers/gpu/drm/i915/i915_vma.h b/drivers/gpu/drm/i915/i915_vma.h +index 465932813bc5..ce1db908ad69 100644 +--- a/drivers/gpu/drm/i915/i915_vma.h ++++ b/drivers/gpu/drm/i915/i915_vma.h +@@ -51,14 +51,19 @@ enum i915_cache_level; +  */ + struct i915_vma { + 	struct drm_mm_node node; +-	struct drm_i915_gem_object *obj; ++ + 	struct i915_address_space *vm; + 	const struct i915_vma_ops *ops; +-	struct i915_fence_reg *fence; ++ ++	struct drm_i915_gem_object *obj; + 	struct dma_resv *resv; /** Alias of obj->resv */ ++ + 	struct sg_table *pages; + 	void __iomem *iomap; + 	void *private; /* owned by creator */ ++ ++	struct i915_fence_reg *fence; ++ + 	u64 size; + 	u64 display_alignment; + 	struct i915_page_sizes page_sizes; +@@ -71,6 +76,7 @@ struct i915_vma { + 	 * handles (but same file) for execbuf, i.e. the number of aliases + 	 * that exist in the ctx->handle_vmas LUT for this vma. + 	 */ ++	struct kref ref; + 	atomic_t open_count; + 	atomic_t flags; + 	/** +@@ -333,7 +339,20 @@ int __must_check i915_vma_unbind(struct i915_vma *vma); + void i915_vma_unlink_ctx(struct i915_vma *vma); + void i915_vma_close(struct i915_vma *vma); + void i915_vma_reopen(struct i915_vma *vma); +-void i915_vma_destroy(struct i915_vma *vma); ++ ++static inline struct i915_vma *__i915_vma_get(struct i915_vma *vma) ++{ ++	if (kref_get_unless_zero(&vma->ref)) ++		return vma; ++ ++	return NULL; ++} ++ ++void i915_vma_release(struct kref *ref); ++static inline void __i915_vma_put(struct i915_vma *vma) ++{ ++	kref_put(&vma->ref, i915_vma_release); ++} +  + #define assert_vma_held(vma) dma_resv_assert_held((vma)->resv) +  +--  +cgit v1.2.2-1-gc45e + @@ -19,7 +19,7 @@  pkgbase=linux-ck  _supver=5  _majver=5 -_minver=3 +_minver=4  _gccpatchver='20191217'  _gccpatchger='9.1'  _gccpatchker='5.5' @@ -49,6 +49,13 @@ source=(    0004-drm-i915-Wean-off-drm_pci_alloc-drm_pci_free.patch    0005-drm-Remove-PageReserved-manipulation-from-drm_pci_al.patch    0006-drm-i915-execlists-Always-force-a-context-reload-whe.patch +  0007-drm_915_Serialise_i915_active_acquire_with__active_retire.patch +  0008-drm_i915_gem_Take_runtime-pm_wakeref_prior_to_unbinding.patch +  0009-drm-915-gem-Avoid-parking-the-vma-as-we-unbind.patch +  0010-drm-i915-gem-Try-to-flush-pending-unbind-events.patch +  0011-drm-i915-gem-Reinitialise-the-local-list-before-repeating.patch +  0012-drm-i915-Add-a-simple-is-bound-check-before-unbinding.patch +  0013-drm-i915-Introduce-a-vma.kref.patch    linux-ck-patch-${_supver}.${_majver}-${_ckpatchversion}.xz::http://ck.kolivas.org/patches/${_supver}.0/${_supver}.${_majver}/${_supver}.${_majver}-${_ckpatchversion}/patch-${_supver}.${_majver}-${_ckpatchversion}.xz    graysky_bdver2-hotfix.patch    kernel_gcc_patch-${_gccpatchver}.tar.gz::https://github.com/graysky2/kernel_gcc_patch/archive/${_gccpatchver}.tar.gz @@ -61,7 +68,7 @@ validpgpkeys=(    '647F28654894E3BD457199BE38DBBDC86092693E'  # Greg Kroah-Hartman  )  # https://www.kernel.org/pub/linux/kernel/v5.x/sha256sums.asc -b2sums=('fee027190fec757fdda70f7ef302914420e99644fac151acd32f2c9e562ccfa866c6702a28db98e6df8947ec161d68165161516bad083f0de8f5b35fe82dab05' +b2sums=('508995a96406fd40b4f85873dff56c9a992937424f148cbbf7b85298955f0207f6ce2ad93b7c1f79ac563d0195145801d403a571521bb0be7eeed8a857295d89'          'SKIP'          'ab1fb19c67d4c107f75767581c33d9c1458b4d9fdb88f4adb41d30a36f5a2f95f1c48ef079eb87e1e6e8ce2f98b293195cb2c0f2a8ec975aa817453289158c6e'          '2e822cf7d4ff8b7458e22d3ce110fd8534e17a9aac2feace41c591f70697e1fab7bd9ce307c60a6361fbe525d10dab74c8b76fcb5276cd27f6e945f8fdfcc25c' @@ -69,12 +76,19 @@ b2sums=('fee027190fec757fdda70f7ef302914420e99644fac151acd32f2c9e562ccfa866c6702          '6018d823c70f6129b8b52c77f9308e90a83de575f2206a056d562469f227e7651815ff4ed9be484409ea2a109eb6743fb0c71067f237d714934bd02ea132973e'          'd8027cd96a447ea0987a67f3e65d157bb3d396069a944b140610f74c663677fe45e171e96a92dfd5eda8f71a5c715fd8114ee0e60b7620bc401a2a548bcf83cc'          '2d8579a1d27a0a40866b4f7f5c63ad5e402d919e21d09faf4cec14f3b19b8fc42b6fc3cb8d26dce3100a9e63ca21ab01519a0e804f34c35e4bda154fbe725602' +        'df41200d86f1fd493861d4b4a091ec5f853ce7668ec9712f57e574ce2c1a94c7054ec8abcdf947086e5f98b0cdde73523521552536c91373dacdd10c4ecf4c1a' +        'f4d5f82c5deb981f475fd18a408e23b5f170e23c7a49c3563171e55abd78c07c475a7a9c67850c4a3665ce3447cd7b5fb3171e47af8cd8077822f2a6679cfd9b' +        '70d02b7fc8b26c783eaabafb9bef5d3895c0031642dc8b71d8737762722695221340315576433d1544b79b37446212ce5e3d0936f695af307b3344a717274ba8' +        '5909775c40e31588072e052d28daa4472b7b0e0cb124d631bfa967ce398b9cf44afb6937f5f4ec709b0430f0a27262ce876c7d3ca71fae821138671bc492176f' +        'c1410e2d53dd7afb6d68f75c557774e37f466a5b5b7432ec6802b2c2a9644c8a6b5fcd38a76781b9229a9cb2cf4c0c55129ee050918577937d91dd7ee789f3b8' +        '63e9e6ceda80243910c073ec81555f2781d75ac4b3cb5000c1328f2624f7be840684b0f383768020e82bce502aa90a1c8729f7b3e91c099652075a42da2187cf' +        '078bb20a03b7e43ad0685b0c3f6a54f1c4bd32d25e0f6c6434100c6f5f5bc27cd6281bf2134b7c7034e6aa448d895d23c20d32f7d1cc40e55f0735af777694a3'          '54bdd9958d8fa9c3affa1972ca7d9821330394fbacf7ed25e098675d439764d0c918b4ee6554aaea23762bb90060cb2ee952bff569f54903e6b27fa10e8f4b09'          '1892bd22775eac3bcc4d37f4fd30c95346bf3a0888cbbff57fd614973b525390dff2e315ce35b2e498523cceaab94ff21a80475dee8df3de4dd8fc0fab07d74e'          'd76bd0bf237ea2bb7999fd3715cb664d89148cb0ade8057d57cdb40bc0a7954336e50ee077312e5e192398b0f35f055786deb98af9130d57e60f2ea040fbb66f'          '2e58bb89b247b1678355368956e67c1de51fcde97a227b2162f6771e30f17fa5520faafe7be4b6816a542e7ae10d05f64c6b6354f352c12746d4b8da632936dd'          'fde132f3705d908e6f2147c78a2193289916d72304ca5efa2229d79fc3e57a857314ce94e71425caef2f7f7b6cf87f05ef86335dc8bd4be78e7035afe608005a' -        '19636a1b390220cb60de35456bef0938f7d061d64ac89a1abf9eb3c1f3812a3768d80cb2a044a69ae4b67297a41c24bd68eaef57cf696bc1435dc22d39c7377e') +        '36c1fbfaffa23a5283523caf656689455d221778fff609816d9bbcc8cd63002c474ff42bc2d8114fbf2d73b859c6e952c9456b3fef46674eb51a24da92a21d52')  #export KBUILD_BUILD_HOST=arc4linux  export KBUILD_BUILD_USER=$pkgbase @@ -98,6 +112,13 @@ prepare() {    patch -p1 -i ../0004-drm-i915-Wean-off-drm_pci_alloc-drm_pci_free.patch    patch -p1 -i ../0005-drm-Remove-PageReserved-manipulation-from-drm_pci_al.patch    patch -p1 -i ../0006-drm-i915-execlists-Always-force-a-context-reload-whe.patch +  patch -p1 -i ../0007-drm_915_Serialise_i915_active_acquire_with__active_retire.patch +  patch -p1 -i ../0008-drm_i915_gem_Take_runtime-pm_wakeref_prior_to_unbinding.patch +  patch -p1 -i ../0009-drm-915-gem-Avoid-parking-the-vma-as-we-unbind.patch +  patch -p1 -i ../0010-drm-i915-gem-Try-to-flush-pending-unbind-events.patch +  patch -p1 -i ../0011-drm-i915-gem-Reinitialise-the-local-list-before-repeating.patch +  patch -p1 -i ../0012-drm-i915-Add-a-simple-is-bound-check-before-unbinding.patch +  patch -p1 -i ../0013-drm-i915-Introduce-a-vma.kref.patch    # fix naming schema in EXTRAVERSION of ck patch set @@ -4,10 +4,10 @@  #  # -# Compiler: gcc (GCC) 9.2.0 +# Compiler: gcc (GCC) 9.2.1  #  CONFIG_CC_IS_GCC=y -CONFIG_GCC_VERSION=90200 +CONFIG_GCC_VERSION=90201  CONFIG_CLANG_VERSION=0  CONFIG_CC_CAN_LINK=y  CONFIG_CC_HAS_ASM_GOTO=y  | 
