[Intel-gfx] [PATCH] drm/i915/display: Defer initial modeset until after GGTT is initialised

Matthew Auld matthew.william.auld at gmail.com
Thu Nov 26 10:11:10 UTC 2020


On Wed, 25 Nov 2020 at 19:30, Chris Wilson <chris at chris-wilson.co.uk> wrote:
>
> Prior to sanitizing the GGTT, the only operations around in
> intel_display_init_nogem() are those to reserve the preallocated (and
> active) regions in the GGTT leftover from the BIOS. Trying to allocate a
> GGTT vma (such as intel_pin_and_fence_fb_obj during the initial modeset)
> may then conflict with other preallocated regions that have not yet been
> protected.
>
> Move the initial modesetting from the end of init_nogem to the beginning
> of init so that any vma pinning (either framebuffers or DSB, for example),
> is after the GGTT is ready to handle it.
>
> This will prevent the DSB object from being destroyed too early:
>
> [   53.448973] ==================================================================
> [   53.449241] BUG: KASAN: use-after-free in i915_init_ggtt+0x324/0x9e0 [i915]
> [   53.449309] Read of size 8 at addr ffff88811b1e8070 by task systemd-udevd/345
>
> [   53.449399] CPU: 1 PID: 345 Comm: systemd-udevd Tainted: G        W         5.10.0-rc5+ #12
> [   53.449409] Call Trace:
> [   53.449418]  dump_stack+0x9a/0xcc
> [   53.449558]  ? i915_init_ggtt+0x324/0x9e0 [i915]
> [   53.449565]  print_address_description.constprop.0+0x3e/0x60
> [   53.449577]  ? _raw_spin_lock_irqsave+0x4e/0x50
> [   53.449718]  ? i915_init_ggtt+0x324/0x9e0 [i915]
> [   53.449849]  ? i915_init_ggtt+0x324/0x9e0 [i915]
> [   53.449857]  kasan_report.cold+0x1f/0x37
> [   53.449993]  ? i915_init_ggtt+0x324/0x9e0 [i915]
> [   53.450130]  i915_init_ggtt+0x324/0x9e0 [i915]
> [   53.450273]  ? i915_ggtt_suspend+0x1f0/0x1f0 [i915]
> [   53.450281]  ? static_obj+0x69/0x80
> [   53.450289]  ? lockdep_init_map_waits+0xa9/0x310
> [   53.450431]  ? intel_wopcm_init+0x96/0x3d0 [i915]
> [   53.450581]  ? i915_gem_init+0x75/0x2d0 [i915]
> [   53.450720]  i915_gem_init+0x75/0x2d0 [i915]
> [   53.450852]  i915_driver_probe+0x8c2/0x1210 [i915]
> [   53.450993]  ? i915_pm_prepare+0x630/0x630 [i915]
> [   53.451006]  ? check_chain_key+0x1e7/0x2e0
> [   53.451025]  ? __pm_runtime_resume+0x58/0xb0
> [   53.451157]  i915_pci_probe+0xa6/0x2b0 [i915]
> [   53.451285]  ? i915_pci_remove+0x40/0x40 [i915]
> [   53.451295]  ? lockdep_hardirqs_on_prepare+0x124/0x230
> [   53.451302]  ? _raw_spin_unlock_irqrestore+0x42/0x50
> [   53.451309]  ? lockdep_hardirqs_on+0xbf/0x130
> [   53.451315]  ? preempt_count_sub+0xf/0xb0
> [   53.451321]  ? _raw_spin_unlock_irqrestore+0x2f/0x50
> [   53.451335]  pci_device_probe+0xf9/0x190
> [   53.451350]  really_probe+0x17f/0x5b0
> [   53.451365]  driver_probe_device+0x13a/0x1c0
> [   53.451376]  device_driver_attach+0x82/0x90
> [   53.451386]  ? device_driver_attach+0x90/0x90
> [   53.451391]  __driver_attach+0xab/0x190
> [   53.451401]  ? device_driver_attach+0x90/0x90
> [   53.451407]  bus_for_each_dev+0xe4/0x140
> [   53.451414]  ? subsys_dev_iter_exit+0x10/0x10
> [   53.451423]  ? __list_add_valid+0x2b/0xa0
> [   53.451440]  bus_add_driver+0x227/0x2e0
> [   53.451454]  driver_register+0xd3/0x150
> [   53.451585]  i915_init+0x92/0xac [i915]
> [   53.451592]  ? 0xffffffffa0a20000
> [   53.451598]  do_one_initcall+0xb6/0x3b0
> [   53.451606]  ? trace_event_raw_event_initcall_finish+0x150/0x150
> [   53.451614]  ? __kasan_kmalloc.constprop.0+0xc2/0xd0
> [   53.451627]  ? kmem_cache_alloc_trace+0x4a4/0x8e0
> [   53.451634]  ? kasan_unpoison_shadow+0x33/0x40
> [   53.451649]  do_init_module+0xf8/0x350
> [   53.451662]  load_module+0x43de/0x47f0
> [   53.451716]  ? module_frob_arch_sections+0x20/0x20
> [   53.451731]  ? rw_verify_area+0x5f/0x130
> [   53.451780]  ? __do_sys_finit_module+0x10d/0x1a0
> [   53.451785]  __do_sys_finit_module+0x10d/0x1a0
> [   53.451792]  ? __ia32_sys_init_module+0x40/0x40
> [   53.451800]  ? seccomp_do_user_notification.isra.0+0x5c0/0x5c0
> [   53.451829]  ? rcu_read_lock_bh_held+0xb0/0xb0
> [   53.451835]  ? mark_held_locks+0x24/0x90
> [   53.451856]  do_syscall_64+0x33/0x80
> [   53.451863]  entry_SYSCALL_64_after_hwframe+0x44/0xa9
> [   53.451868] RIP: 0033:0x7fde09b4470d
> [   53.451875] Code: 00 c3 66 2e 0f 1f 84 00 00 00 00 00 90 f3 0f 1e fa 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 53 f7 0c 00 f7 d8 64 89 01 48
> [   53.451880] RSP: 002b:00007ffd6abc1718 EFLAGS: 00000246 ORIG_RAX: 0000000000000139
> [   53.451890] RAX: ffffffffffffffda RBX: 000056444e528150 RCX: 00007fde09b4470d
> [   53.451895] RDX: 0000000000000000 RSI: 00007fde09a21ded RDI: 000000000000000f
> [   53.451899] RBP: 0000000000020000 R08: 0000000000000000 R09: 0000000000000000
> [   53.451904] R10: 000000000000000f R11: 0000000000000246 R12: 00007fde09a21ded
> [   53.451909] R13: 0000000000000000 R14: 000056444e329200 R15: 000056444e528150
>
> [   53.451957] Allocated by task 345:
> [   53.451995]  kasan_save_stack+0x1b/0x40
> [   53.452001]  __kasan_kmalloc.constprop.0+0xc2/0xd0
> [   53.452006]  kmem_cache_alloc+0x1cd/0x8d0
> [   53.452146]  i915_vma_instance+0x126/0xb70 [i915]
> [   53.452304]  i915_gem_object_ggtt_pin_ww+0x222/0x3f0 [i915]
> [   53.452446]  intel_dsb_prepare+0x14f/0x230 [i915]
> [   53.452588]  intel_atomic_commit+0x183/0x690 [i915]
> [   53.452730]  intel_initial_commit+0x2bc/0x2f0 [i915]
> [   53.452871]  intel_modeset_init_nogem+0xa02/0x2af0 [i915]
> [   53.452995]  i915_driver_probe+0x8af/0x1210 [i915]
> [   53.453120]  i915_pci_probe+0xa6/0x2b0 [i915]
> [   53.453125]  pci_device_probe+0xf9/0x190
> [   53.453131]  really_probe+0x17f/0x5b0
> [   53.453136]  driver_probe_device+0x13a/0x1c0
> [   53.453142]  device_driver_attach+0x82/0x90
> [   53.453148]  __driver_attach+0xab/0x190
> [   53.453153]  bus_for_each_dev+0xe4/0x140
> [   53.453158]  bus_add_driver+0x227/0x2e0
> [   53.453164]  driver_register+0xd3/0x150
> [   53.453286]  i915_init+0x92/0xac [i915]
> [   53.453292]  do_one_initcall+0xb6/0x3b0
> [   53.453297]  do_init_module+0xf8/0x350
> [   53.453302]  load_module+0x43de/0x47f0
> [   53.453307]  __do_sys_finit_module+0x10d/0x1a0
> [   53.453312]  do_syscall_64+0x33/0x80
> [   53.453318]  entry_SYSCALL_64_after_hwframe+0x44/0xa9
>
> [   53.453345] Freed by task 82:
> [   53.453379]  kasan_save_stack+0x1b/0x40
> [   53.453384]  kasan_set_track+0x1c/0x30
> [   53.453389]  kasan_set_free_info+0x1b/0x30
> [   53.453394]  __kasan_slab_free+0x112/0x160
> [   53.453399]  kmem_cache_free+0xb2/0x3f0
> [   53.453536]  i915_gem_flush_free_objects+0x31a/0x3b0 [i915]
> [   53.453542]  process_one_work+0x519/0x9f0
> [   53.453547]  worker_thread+0x75/0x5c0
> [   53.453552]  kthread+0x1da/0x230
> [   53.453557]  ret_from_fork+0x22/0x30
>
> [   53.453584] The buggy address belongs to the object at ffff88811b1e8040
>                 which belongs to the cache i915_vma of size 968
> [   53.453692] The buggy address is located 48 bytes inside of
>                 968-byte region [ffff88811b1e8040, ffff88811b1e8408)
> [   53.453792] The buggy address belongs to the page:
> [   53.453842] page:00000000b35f7048 refcount:1 mapcount:0 mapping:0000000000000000 index:0xffff88811b1ef940 pfn:0x11b1e8
> [   53.453847] head:00000000b35f7048 order:3 compound_mapcount:0 compound_pincount:0
> [   53.453853] flags: 0x8000000000010200(slab|head)
> [   53.453860] raw: 8000000000010200 ffff888115596248 ffff888115596248 ffff8881155b6340
> [   53.453866] raw: ffff88811b1ef940 0000000000170001 00000001ffffffff 0000000000000000
> [   53.453870] page dumped because: kasan: bad access detected
>
> [   53.453895] Memory state around the buggy address:
> [   53.453944]  ffff88811b1e7f00: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
> [   53.454011]  ffff88811b1e7f80: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
> [   53.454079] >ffff88811b1e8000: fc fc fc fc fc fc fc fc fa fb fb fb fb fb fb fb
> [   53.454146]                                                              ^
> [   53.454211]  ffff88811b1e8080: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
> [   53.454279]  ffff88811b1e8100: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
> [   53.454347] ==================================================================
> [   53.454414] Disabling lock debugging due to kernel taint
> [   53.454434] general protection fault, probably for non-canonical address 0xdead0000000000d0: 0000 [#1] PREEMPT SMP KASAN PTI
> [   53.454446] CPU: 1 PID: 345 Comm: systemd-udevd Tainted: G    B   W         5.10.0-rc5+ #12
> [   53.454592] RIP: 0010:i915_init_ggtt+0x26f/0x9e0 [i915]
> [   53.454602] Code: 89 8d 48 ff ff ff 4c 8d 60 d0 49 39 c7 0f 84 37 02 00 00 4c 89 b5 40 ff ff ff 4d 8d bc 24 90 00 00 00 4c 89 ff e8 c1 97 f8 e0 <49> 83 bc 24 90 00 00 00 00 0f 84 0f 02 00 00 49 8d 7c 24 08 e8 a8
> [   53.454618] RSP: 0018:ffff88812247f430 EFLAGS: 00010286
> [   53.454625] RAX: 0000000000000000 RBX: ffff888136440000 RCX: ffffffffa03fb78f
> [   53.454633] RDX: 0000000000000000 RSI: 0000000000000008 RDI: dead000000000160
> [   53.454641] RBP: ffff88812247f500 R08: ffffffff8113589f R09: 0000000000000000
> [   53.454648] R10: ffffffff83063843 R11: fffffbfff060c708 R12: dead0000000000d0
> [   53.454656] R13: ffff888136449ba0 R14: 0000000000002000 R15: dead000000000160
> [   53.454664] FS:  00007fde095c4880(0000) GS:ffff88840c880000(0000) knlGS:0000000000000000
> [   53.454672] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> [   53.454679] CR2: 00007fef132b4f28 CR3: 000000012245c002 CR4: 00000000003706e0
> [   53.454686] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
> [   53.454693] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
> [   53.454700] Call Trace:
> [   53.454833]  ? i915_ggtt_suspend+0x1f0/0x1f0 [i915]
>
> Fixes: afeda4f3b1c8 ("drm/i915/dsb: Pre allocate and late cleanup of cmd buffer")
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Ville Syrjälä <ville.syrjala at linux.intel.com>
> Cc: Matthew Auld <matthew.auld at intel.com>
> Cc: Lucas De Marchi <lucas.demarchi at intel.com>
Tested-by: Matthew Auld <matthew.auld at intel.com>
Reviewed-by: Matthew Auld <matthew.auld at intel.com>


More information about the Intel-gfx mailing list