diff mbox

[11/11] drm/radeon: update the VM after setting BO address v3

Message ID 1416402089-2366-11-git-send-email-deathsimple@vodafone.de (mailing list archive)
State New, archived
Headers show

Commit Message

Christian König Nov. 19, 2014, 1:01 p.m. UTC
From: Christian König <christian.koenig@amd.com>

This way the necessary VM update is kicked off immediately
if all BOs involved are in GPU accessible memory.

v2: fix vm lock
v3: immediately update unmaps as well

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/radeon/radeon_gem.c | 64 +++++++++++++++++++++++++++++++++++++
 1 file changed, 64 insertions(+)

Comments

Kai Wasserbäch Nov. 19, 2014, 1:16 p.m. UTC | #1
Dear Christian,
Christian König wrote on 19.11.2014 14:01:
> From: Christian König <christian.koenig@amd.com>
> 
> This way the necessary VM update is kicked off immediately
> if all BOs involved are in GPU accessible memory.
> 
> v2: fix vm lock
> v3: immediately update unmaps as well
> 
> Signed-off-by: Christian König <christian.koenig@amd.com>
> ---
>  drivers/gpu/drm/radeon/radeon_gem.c | 64 +++++++++++++++++++++++++++++++++++++
>  1 file changed, 64 insertions(+)

Is this a fix for <http://thread.gmane.org/gmane.comp.video.dri.devel/118415>
which I bisected to the v2 of this patch
(<http://thread.gmane.org/gmane.comp.video.dri.devel/118415/focus=118425>) as
present on the drm-next-3.19-wip branch?

Cheers,
Kai
Christian König Nov. 19, 2014, 1:35 p.m. UTC | #2
Am 19.11.2014 um 14:16 schrieb Kai Wasserbäch:
> Dear Christian,
> Christian König wrote on 19.11.2014 14:01:
>> From: Christian König <christian.koenig@amd.com>
>>
>> This way the necessary VM update is kicked off immediately
>> if all BOs involved are in GPU accessible memory.
>>
>> v2: fix vm lock
>> v3: immediately update unmaps as well
>>
>> Signed-off-by: Christian König <christian.koenig@amd.com>
>> ---
>>   drivers/gpu/drm/radeon/radeon_gem.c | 64 +++++++++++++++++++++++++++++++++++++
>>   1 file changed, 64 insertions(+)
> Is this a fix for <http://thread.gmane.org/gmane.comp.video.dri.devel/118415>
> which I bisected to the v2 of this patch
> (<http://thread.gmane.org/gmane.comp.video.dri.devel/118415/focus=118425>) as
> present on the drm-next-3.19-wip branch?

Yes and no, it was actually the patch before this one which triggered 
the problem. The last one just made it much more likely to appear.

Please test the whole patchset on top of Dave's drm-next tree if your 
problem still exists.

Thanks,
Christian.

>
> Cheers,
> Kai
>
Kai Wasserbäch Nov. 19, 2014, 3:43 p.m. UTC | #3
Dear Christian,
Christian König wrote on 19.11.2014 14:35:
> Am 19.11.2014 um 14:16 schrieb Kai Wasserbäch:
>> Dear Christian,
>> Christian König wrote on 19.11.2014 14:01:
>>> From: Christian König <christian.koenig@amd.com>
>>>
>>> This way the necessary VM update is kicked off immediately
>>> if all BOs involved are in GPU accessible memory.
>>>
>>> v2: fix vm lock
>>> v3: immediately update unmaps as well
>>>
>>> Signed-off-by: Christian König <christian.koenig@amd.com>
>>> ---
>>>   drivers/gpu/drm/radeon/radeon_gem.c | 64 +++++++++++++++++++++++++++++++++++++
>>>   1 file changed, 64 insertions(+)
>> Is this a fix for <http://thread.gmane.org/gmane.comp.video.dri.devel/118415>
>> which I bisected to the v2 of this patch
>> (<http://thread.gmane.org/gmane.comp.video.dri.devel/118415/focus=118425>) as
>> present on the drm-next-3.19-wip branch?
> 
> Yes and no, it was actually the patch before this one which triggered the
> problem. The last one just made it much more likely to appear.
> 
> Please test the whole patchset on top of Dave's drm-next tree if your problem
> still exists.

this is still bad:

[  117.818981] BUG: unable to handle kernel paging request at ffffeae3801564d8
[  117.819019] IP: [<ffffffff8111e6b1>] virt_to_head_page+0x33/0x4a
[  117.819049] PGD 0
[  117.819059] Oops: 0000 [#1] SMP
[  117.819077] Modules linked in: serpent_avx_x86_64 serpent_sse2_x86_64
serpent_generic blowfish_x86_64 blowfish_common ecb cmac sha512_ssse3
sha512_generic sha256_ssse3 sha256_generic nfsd auth_rpcgss oid_registry nfs_acl
nfs lockd grace fscache sunrpc nls_utf8 nls_cp437 vfat fat snd_hda_codec_realtek
snd_hda_codec_generic snd_hda_codec_hdmi iTCO_wdt iTCO_vendor_support radeon
snd_hda_intel x86_pkg_temp_thermal snd_hda_controller drm_kms_helper ttm
snd_hda_codec snd_hwdep snd_pcm_oss mei_me video snd_mixer_oss i2c_i801 coretemp
snd_pcm mei lpc_ich mfd_core evdev joydev processor snd_timer snd soundcore
button serio_raw kvm_intel kvm pcspkr efivars fuse parport_pc ppdev lp parport
ext4 crc16 mbcache jbd2 btrfs xor raid6_pq twofish_generic twofish_avx_x86_64
twofish_x86_64_3way twofish_x86_64 twofish_common
[  117.819454]  xts af_alg hid_generic usbhid dm_crypt dm_mod microcode
hid_lg_g710_plus(O) hid sg sr_mod sd_mod cdrom crct10dif_pclmul crc32c_intel
ghash_clmulni_intel aesni_intel aes_x86_64 lrw gf128mul glue_helper ablk_helper
cryptd ahci libahci libata atl1c thermal fan thermal_sys
[  117.819587] CPU: 1 PID: 1959 Comm: Dreamfall Chapt Tainted: G           O
3.18.0-rc4-citadel-airlied-drm-next-with-ck-patches.0.1 #1
[  117.819634] Hardware name: Gigabyte Technology Co., Ltd. To be filled by
O.E.M./Z77-DS3H, BIOS F11a 11/13/2013
[  117.819673] task: ffff8800d4417650 ti: ffff8800d21a0000 task.ti: ffff8800d21a0000
[  117.819702] RIP: 0010:[<ffffffff8111e6b1>]  [<ffffffff8111e6b1>]
virt_to_head_page+0x33/0x4a
[  117.819737] RSP: 0018:ffff8800d21a3cf0  EFLAGS: 00010086
[  117.819758] RAX: ffffeae3801564d8 RBX: 0000000000000286 RCX: 000077ff80000000
[  117.819787] RDX: ffffea0000000000 RSI: ffff8800d21a3d30 RDI: ffffc900061cd000
[  117.819815] RBP: ffffc900061cd000 R08: 0000000000000000 R09: ffff880407859008
[  117.819843] R10: ffff880407858fe0 R11: 000000000007ffff R12: ffffffffa0602de8
[  117.819870] R13: ffff880407858000 R14: ffff88039f261ac0 R15: ffff880403d876c0
[  117.819898] FS:  00007f10c309b780(0000) GS:ffff88041ec40000(0000)
knlGS:0000000000000000
[  117.819930] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[  117.819952] CR2: ffffeae3801564d8 CR3: 00000000dcad1000 CR4: 00000000001407e0
[  117.819979] Stack:
[  117.819988]  ffffffff8111eda1 ffff8800d21a3de0 0000000000000000 ffff8800d21a3d30
[  117.820022]  ffffffffa0602de8 ffffc900061cd000 00000000a060245a 0000000000000000
[  117.820055]  ffffc900061ce0a8 ffff8800d21a3d58 ffff8800d4417650 0000000000001e7d
[  117.820089] Call Trace:
[  117.820101]  [<ffffffff8111eda1>] ? kfree+0x2e/0x6d
[  117.820137]  [<ffffffffa0602de8>] ? radeon_gem_va_ioctl+0x28c/0x2d3 [radeon]
[  117.820176]  [<ffffffffa0602601>] ? radeon_gem_create_ioctl+0xa4/0xc3 [radeon]
[  117.820207]  [<ffffffff812be431>] ? drm_ioctl+0x35b/0x3e1
[  117.820238]  [<ffffffffa0602b5c>] ? radeon_gem_get_tiling_ioctl+0x8e/0x8e
[radeon]
[  117.820270]  [<ffffffff81440f2c>] ? _raw_spin_unlock_irqrestore+0xc/0xd
[  117.820303]  [<ffffffffa05de04b>] ? radeon_drm_ioctl+0x4b/0x7a [radeon]
[  117.820331]  [<ffffffff8113e795>] ? do_vfs_ioctl+0x34e/0x404
[  117.820355]  [<ffffffff811312a4>] ? vfs_read+0xbc/0xea
[  117.820377]  [<ffffffff8113e89c>] ? SyS_ioctl+0x51/0x77
[  117.820398]  [<ffffffff814414e9>] ? system_call_fastpath+0x12/0x17
[  117.820423] Code: 00 00 80 ff 77 00 00 48 01 fa 48 0f 42 0d 78 99 6f 00 48 8d
04 11 48 ba 00 00 00 00 00 ea ff ff 48 c1 e8 0c 48 6b c0 38 48 01 d0 <48> 8b 10
80 e6 80 74 0e 48 8b 50 30 48 8b 08 80 e5 80 48 0f 45
[  117.820582] RIP  [<ffffffff8111e6b1>] virt_to_head_page+0x33/0x4a
[  117.820608]  RSP <ffff8800d21a3cf0>
[  117.820622] CR2: ffffeae3801564d8
[  117.838461] ---[ end trace a6e2a6aa1df3196f ]---

I've used Dave Airlie's drm-next as a base (commit
d0d6c524bf1d72e6d64134c3a315b77deecc9252) and "git am"-applied your series (no
issues, applied cleanly) on top. Steam games are still entering the defunct
state as soon as the 3D engines are fired up on a kernel built from that source
tree.

This is with (Debian testing as a base):
GPU: Hawaii PRO [Radeon R9 290] (ChipID = 0x67b1)
Mesa: Git:master/b69c7c5dac
libdrm: Git:master/00847fa48b
LLVM: SVN:trunk/r222254 (3.6 devel)
X.Org: 2:1.16.1-1
Firmware: <http://people.freedesktop.org/~agd5f/radeon_ucode/>
# 9e05820da42549ce9c89d147cf1f8e19  hawaii_ce.bin
# c8bab593090fc54f239c8d7596c8d846  hawaii_mc.bin
# 3618dbb955d8a84970e262bb2e6d2a16  hawaii_me.bin
# c000b0fc9ff6582145f66504b0ec9597  hawaii_mec.bin
# 0643ad24b3beff2214cce533e094c1b7  hawaii_pfp.bin
# ba6054b7d78184a74602fd81607e1386  hawaii_rlc.bin
# 11288f635737331b69de9ee82fe04898  hawaii_sdma.bin
# 284429675a5560e0fad42aa982965fc2  hawaii_smc.bin
libclc: Git:master/7f6f5bff1f
DDX: 1:7.5.0-1

Let me know, if you need something else; see also the original thread
<http://thread.gmane.org/gmane.comp.video.dri.devel/118415> for further information.

Cheers,
Kai
diff mbox

Patch

diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c
index f752c7f..2e0e370 100644
--- a/drivers/gpu/drm/radeon/radeon_gem.c
+++ b/drivers/gpu/drm/radeon/radeon_gem.c
@@ -518,6 +518,68 @@  out:
 	return r;
 }
 
+/**
+ * radeon_gem_va_update_vm -update the bo_va in its VM
+ *
+ * @rdev: radeon_device pointer
+ * @bo_va: bo_va to update
+ *
+ * Update the bo_va directly after setting it's address. Errors are not
+ * vital here, so they are not reported back to userspace.
+ */
+static void radeon_gem_va_update_vm(struct radeon_device *rdev,
+				    struct radeon_bo_va *bo_va)
+{
+	struct ttm_validate_buffer tv, *entry;
+	struct radeon_cs_reloc *vm_bos;
+	struct ww_acquire_ctx ticket;
+	struct list_head list;
+	unsigned domain;
+	int r;
+
+	INIT_LIST_HEAD(&list);
+
+	tv.bo = &bo_va->bo->tbo;
+	tv.shared = true;
+	list_add(&tv.head, &list);
+
+	vm_bos = radeon_vm_get_bos(rdev, bo_va->vm, &list);
+	if (!vm_bos)
+		return;
+
+	r = ttm_eu_reserve_buffers(&ticket, &list, true);
+	if (r)
+		goto error_free;
+
+	list_for_each_entry(entry, &list, head) {
+		domain = radeon_mem_type_to_domain(entry->bo->mem.mem_type);
+		/* if anything is swapped out don't swap it in here,
+		   just abort and wait for the next CS */
+		if (domain == RADEON_GEM_DOMAIN_CPU)
+			goto error_unreserve;
+	}
+
+	mutex_lock(&bo_va->vm->mutex);
+	r = radeon_vm_clear_freed(rdev, bo_va->vm);
+	if (r)
+		goto error_unlock;
+
+	if (bo_va->it.start)
+		r = radeon_vm_bo_update(rdev, bo_va, &bo_va->bo->tbo.mem);
+
+error_unlock:
+	mutex_unlock(&bo_va->vm->mutex);
+
+error_unreserve:
+	ttm_eu_backoff_reservation(&ticket, &list);
+
+error_free:
+	kfree(vm_bos);
+
+	if (r)
+		DRM_ERROR("Couldn't update BO_VA (%d)\n", r);
+}
+
 int radeon_gem_va_ioctl(struct drm_device *dev, void *data,
 			  struct drm_file *filp)
 {
@@ -612,6 +674,8 @@  int radeon_gem_va_ioctl(struct drm_device *dev, void *data,
 	default:
 		break;
 	}
+	if (!r)
+		radeon_gem_va_update_vm(rdev, bo_va);
 	args->operation = RADEON_VA_RESULT_OK;
 	if (r) {
 		args->operation = RADEON_VA_RESULT_ERROR;