[Intel-gfx] [PATCH 01/11] drm/i915/selftests: Prevent background reaping of active objects

Chris Wilson chris at chris-wilson.co.uk
Mon Jul 9 13:54:47 UTC 2018


Quoting Mika Kuoppala (2018-07-09 14:48:31)
> Chris Wilson <chris at chris-wilson.co.uk> writes:
> 
> > igt_mmap_offset_exhaustion() wants to test what happens when the mmap
> > space is filled with zombie objects, objects discarded by userspace but
> > still active on the GPU. As they are only protected by the active
> > reference, we have to be certain that active reference is kept while we
> > peek into our dangling pointer. That active reference should not be
> > freed until we retire, but we do that retirement from a background
> > thread. This leaves us with a subtle timing problem, exacerbated and
> > highlighted by KASAN:
> >
> > <3>[  132.380399] BUG: KASAN: use-after-free in drm_gem_create_mmap_offset+0x8c/0xd0
> > <3>[  132.380430] Read of size 8 at addr ffff8801e13245f8 by task drv_selftest/5822
> >
> > <4>[  132.380470] CPU: 0 PID: 5822 Comm: drv_selftest Tainted: G     U            4.18.0-rc3-g7ae7763aa2be-kasan_48+ #1
> > <4>[  132.380473] Hardware name: Dell Inc. XPS 8300  /0Y2MRG, BIOS A06 10/17/2011
> > <4>[  132.380475] Call Trace:
> > <4>[  132.380481]  dump_stack+0x7c/0xbb
> > <4>[  132.380487]  print_address_description+0x65/0x270
> > <4>[  132.380493]  kasan_report+0x25b/0x380
> > <4>[  132.380497]  ? drm_gem_create_mmap_offset+0x8c/0xd0
> > <4>[  132.380503]  drm_gem_create_mmap_offset+0x8c/0xd0
> > <4>[  132.380584]  i915_gem_object_create_mmap_offset+0x6d/0x100 [i915]
> > <4>[  132.380650]  igt_mmap_offset_exhaustion+0x462/0x940 [i915]
> > <4>[  132.380714]  ? i915_gem_close_object+0x740/0x740 [i915]
> > <4>[  132.380784]  ? igt_gem_huge+0x269/0x3d0 [i915]
> > <4>[  132.380865]  __i915_subtests+0x5a/0x160 [i915]
> > <4>[  132.380936]  __run_selftests+0x1a2/0x2f0 [i915]
> > <4>[  132.381008]  i915_live_selftests+0x4e/0x80 [i915]
> > <4>[  132.381071]  i915_pci_probe+0xd8/0x1b0 [i915]
> > <4>[  132.381077]  pci_device_probe+0x1c5/0x3a0
> > <4>[  132.381087]  driver_probe_device+0x6b6/0xcb0
> > <4>[  132.381094]  __driver_attach+0x22d/0x2c0
> > <4>[  132.381100]  ? driver_probe_device+0xcb0/0xcb0
> > <4>[  132.381103]  bus_for_each_dev+0x113/0x1a0
> > <4>[  132.381108]  ? check_flags.part.24+0x450/0x450
> > <4>[  132.381112]  ? subsys_dev_iter_exit+0x10/0x10
> > <4>[  132.381123]  bus_add_driver+0x38b/0x6e0
> > <4>[  132.381131]  driver_register+0x189/0x400
> > <4>[  132.381136]  ? 0xffffffffc12d8000
> > <4>[  132.381140]  do_one_initcall+0xa0/0x4c0
> > <4>[  132.381145]  ? initcall_blacklisted+0x180/0x180
> > <4>[  132.381152]  ? do_init_module+0x4a/0x54c
> > <4>[  132.381156]  ? rcu_lockdep_current_cpu_online+0xdc/0x130
> > <4>[  132.381161]  ? kasan_unpoison_shadow+0x30/0x40
> > <4>[  132.381169]  do_init_module+0x1b5/0x54c
> > <4>[  132.381177]  load_module+0x619e/0x9b70
> > <4>[  132.381202]  ? module_frob_arch_sections+0x20/0x20
> > <4>[  132.381211]  ? vfs_read+0x257/0x2f0
> > <4>[  132.381214]  ? vfs_read+0x257/0x2f0
> > <4>[  132.381221]  ? kernel_read+0x8b/0x130
> > <4>[  132.381231]  ? copy_strings_kernel+0x120/0x120
> > <4>[  132.381244]  ? __se_sys_finit_module+0x17c/0x1a0
> > <4>[  132.381248]  __se_sys_finit_module+0x17c/0x1a0
> > <4>[  132.381252]  ? __ia32_sys_init_module+0xa0/0xa0
> > <4>[  132.381261]  ? __se_sys_newstat+0x77/0xd0
> > <4>[  132.381265]  ? cp_new_stat+0x590/0x590
> > <4>[  132.381269]  ? kmem_cache_free+0x2f0/0x340
> > <4>[  132.381285]  do_syscall_64+0x97/0x400
> > <4>[  132.381292]  entry_SYSCALL_64_after_hwframe+0x49/0xbe
> > <4>[  132.381295] RIP: 0033:0x7eff4af46839
> > <4>[  132.381297] Code: 00 f3 c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 40 00 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 1f f6 2c 00 f7 d8 64 89 01 48
> > <4>[  132.381426] RSP: 002b:00007ffcd84f4cf8 EFLAGS: 00000246 ORIG_RAX: 0000000000000139
> > <4>[  132.381432] RAX: ffffffffffffffda RBX: 000055dfdeb429a0 RCX: 00007eff4af46839
> > <4>[  132.381435] RDX: 0000000000000000 RSI: 000055dfdeb43670 RDI: 0000000000000004
> > <4>[  132.381437] RBP: 000055dfdeb43670 R08: 0000000000000004 R09: 0000000000000000
> > <4>[  132.381440] R10: 00007ffcd84f4e60 R11: 0000000000000246 R12: 0000000000000000
> > <4>[  132.381442] R13: 000055dfdeb3bec0 R14: 0000000000000000 R15: 000000000000003b
> >
> > <3>[  132.381466] Allocated by task 5822:
> > <4>[  132.381485]  kmem_cache_alloc+0xdf/0x2e0
> > <4>[  132.381546]  i915_gem_object_create_internal+0x24/0x1e0 [i915]
> > <4>[  132.381609]  igt_mmap_offset_exhaustion+0x257/0x940 [i915]
> > <4>[  132.381677]  __i915_subtests+0x5a/0x160 [i915]
> > <4>[  132.381742]  __run_selftests+0x1a2/0x2f0 [i915]
> > <4>[  132.381806]  i915_live_selftests+0x4e/0x80 [i915]
> > <4>[  132.381865]  i915_pci_probe+0xd8/0x1b0 [i915]
> > <4>[  132.381868]  pci_device_probe+0x1c5/0x3a0
> > <4>[  132.381871]  driver_probe_device+0x6b6/0xcb0
> > <4>[  132.381874]  __driver_attach+0x22d/0x2c0
> > <4>[  132.381877]  bus_for_each_dev+0x113/0x1a0
> > <4>[  132.381880]  bus_add_driver+0x38b/0x6e0
> > <4>[  132.381884]  driver_register+0x189/0x400
> > <4>[  132.381886]  do_one_initcall+0xa0/0x4c0
> > <4>[  132.381889]  do_init_module+0x1b5/0x54c
> > <4>[  132.381892]  load_module+0x619e/0x9b70
> > <4>[  132.381895]  __se_sys_finit_module+0x17c/0x1a0
> > <4>[  132.381898]  do_syscall_64+0x97/0x400
> > <4>[  132.381901]  entry_SYSCALL_64_after_hwframe+0x49/0xbe
> >
> > <3>[  132.381914] Freed by task 150:
> > <4>[  132.381931]  kmem_cache_free+0xb7/0x340
> > <4>[  132.381995]  __i915_gem_free_objects+0x875/0xf50 [i915]
> > <4>[  132.382054]  __i915_gem_free_work+0x69/0xb0 [i915]
> > <4>[  132.382058]  process_one_work+0x78b/0x1740
> > <4>[  132.382061]  worker_thread+0x82/0xb80
> > <4>[  132.382064]  kthread+0x30c/0x3d0
> > <4>[  132.382067]  ret_from_fork+0x3a/0x50
> >
> > <3>[  132.382081] The buggy address belongs to the object at ffff8801e1324500
> >                    which belongs to the cache drm_i915_gem_object of size 1168
> > <3>[  132.382133] The buggy address is located 248 bytes inside of
> >                    1168-byte region [ffff8801e1324500, ffff8801e1324990)
> > <3>[  132.382179] The buggy address belongs to the page:
> > <0>[  132.382202] page:ffffea000784c800 count:1 mapcount:0 mapping:ffff8801dedf6500 index:0xffff8801e1323ec0 compound_mapcount: 0
> > <0>[  132.382251] flags: 0x8000000000008100(slab|head)
> > <1>[  132.382274] raw: 8000000000008100 ffff8801d6317440 ffff8801d6317440 ffff8801dedf6500
> > <1>[  132.382307] raw: ffff8801e1323ec0 0000000000140013 00000001ffffffff 0000000000000000
> > <1>[  132.382339] page dumped because: kasan: bad access detected
> >
> > <3>[  132.382373] Memory state around the buggy address:
> > <3>[  132.382395]  ffff8801e1324480: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
> > <3>[  132.382426]  ffff8801e1324500: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
> > <3>[  132.382457] >ffff8801e1324580: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
> > <3>[  132.382488]                                                                 ^
> > <3>[  132.382517]  ffff8801e1324600: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
> > <3>[  132.382548]  ffff8801e1324680: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
> >
> > This patch tricks the system into running without the background retire
> > thread, until after we finish the test. The only reaping should then be
> > performed by the mmap offset routine to reclaim the space as required.
> >
> > Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> > ---
> >  .../gpu/drm/i915/selftests/i915_gem_object.c  | 19 ++++++++++++++++++-
> >  1 file changed, 18 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_object.c b/drivers/gpu/drm/i915/selftests/i915_gem_object.c
> > index f4a5099c75b5..d77acf4cc439 100644
> > --- a/drivers/gpu/drm/i915/selftests/i915_gem_object.c
> > +++ b/drivers/gpu/drm/i915/selftests/i915_gem_object.c
> > @@ -507,6 +507,15 @@ static int igt_mmap_offset_exhaustion(void *arg)
> >       u64 hole_start, hole_end;
> >       int loop, err;
> >  
> > +     /* Disable background reaper */
> 
> disable|enable_reaper, but I have cream in my coffee
> and perhaps we do it if another test ever wants this.

I am hoping we never do. I already dread how to fix this on removing
struct_mutex - but hopefully that's just renaming the mutex ~o~. I fear
it may not be quite so simple.
-Chris


More information about the Intel-gfx mailing list