Is there a potential race condition when drm resume?

Andy Yan andyshrk at 163.com
Thu Nov 23 10:23:06 UTC 2023


From: Andy Yan <andy.yan at rock-chips.com>

Hi:
I get a use-after-free KASAN report on a psr enabled system as bellow:

It seems there is a race happens like this:

task 6074:                                                 userspace                                         
 suspend_devices_and_enter+0xa20/0xba0                     drm_ioctl
 dpm_resume_end+0x20/0x3c                                  drm_mode_atomic_ioctl
 dpm_resume+0x254/0x744                                    drm_atomic_helper_check
 device_resume+0x348/0x5d4                                 drm_self_refresh_helper_alter_state(state);
 platform_pm_resume+0xb4/0xd4                              drm_ioctldrm_self_refresh_helper_entry_work+0xd0/0x354
 rockchip_drm_sys_resume+0x3c/0x50                         drm_atomic_get_crtc_state
 drm_mode_config_helper_resume+0x54/0xdc                   vop2_crtc_duplicate_state
 drm_atomic_helper_resume+0x44/0x2cc                       kmemdup(vcstate)
 drm_mode_config_reset+0x12c/0x280
 vop2_crtc_reset+0x58/0x1cc
 kfree(vcstate)

After read the drm code, I found there is no lock or sync between
drm_ioctl and drm_atomic_helper_resume-->drm_mode_config_reset

So it seems that there are potential race condition between
drm_atomic_helper_resume-->drm_mode_config_reset(reset/free plane/crtc state) and
drm_ioctl->drm_mode_atomic_ioctl->drm_atomic_get_crtc/plane_state ?
Or i missed something ? Any suggestions here would be much appreciated.
 
==================================================================
[    6.767310][T10055] BUG: KASAN: use-after-free in kmemdup+0xa0/0xbc
[    6.767343][T10055] Read of size 680 at addr ffffff81929e1000 by task kworker/1:2/10055
[    6.767365][T10055] 
[    6.767402][T10055] CPU: 1 PID: 10055 Comm: kworker/1:2 Not tainted 5.10.66-abeng..20231117.183336 #2
[    6.767428][T10055] Hardware name: Rockchip RK3588S TABLET CTG30 SSD V11 Board (DT)
[    6.767471][T10055] Workqueue: events drm_self_refresh_helper_entry_work
[    6.767514][T10055] Call trace:
[    6.767548][T10055]  dump_backtrace+0x0/0x3c0
[    6.767575][T10055]  show_stack+0x1c/0x2c
[    6.767609][T10055]  dump_stack_lvl+0x14c/0x1bc
[    6.767641][T10055]  print_address_description+0x88/0x38c
[    6.767670][T10055]  kasan_report+0x180/0x230
[    6.767698][T10055]  kasan_check_range+0x200/0x208
[    6.767727][T10055]  memcpy+0x94/0xf0
[    6.767753][T10055]  kmemdup+0xa0/0xbc
[    6.767787][T10055]  vop2_crtc_duplicate_state+0x4c/0xdc
[    6.767817][T10055]  drm_atomic_get_crtc_state+0x124/0x2e4
[    6.767848][T10055]  drm_self_refresh_helper_entry_work+0xd0/0x354
[    6.767878][T10055]  process_one_work+0x5dc/0xcb4
[    6.767907][T10055]  worker_thread+0x7f0/0xfd8
[    6.767937][T10055]  kthread+0x2fc/0x3bc
[    6.767967][T10055]  ret_from_fork+0x10/0x30
[    6.767990][T10055] 
[    6.768016][T10055] Allocated by task 42:
[    6.768047][T10055]  ____kasan_kmalloc+0xc8/0x10c
[    6.768074][T10055]  __kasan_kmalloc+0x14/0x24
[    6.768103][T10055]  kmem_cache_alloc_trace+0x104/0x474
[    6.768136][T10055]  register_sched_domain_sysctl+0x400/0xd38
[    6.768165][T10055]  partition_sched_domains_locked+0xfc8/0x10cc
[    6.768193][T10055]  partition_sched_domains+0x48/0x68
[    6.768224][T10055]  sched_cpu_activate+0xec/0x340
[    6.768256][T10055]  cpuhp_invoke_callback+0x26c/0x5f4
[    6.768285][T10055]  cpuhp_thread_fun+0x264/0x560
[    6.768315][T10055]  smpboot_thread_fn+0x540/0x95c
[    6.768342][T10055]  kthread+0x2fc/0x3bc
[    6.768370][T10055]  ret_from_fork+0x10/0x30
[    6.768392][T10055] 
[    6.768415][T10055] Freed by task 6074:
[    6.768444][T10055]  kasan_set_track+0x40/0x7c
[    6.768473][T10055]  kasan_set_free_info+0x2c/0x54
[    6.768501][T10055]  ____kasan_slab_free+0x124/0x164
[    6.768528][T10055]  __kasan_slab_free+0x1c/0x30
[    6.768556][T10055]  slab_free_freelist_hook+0x1d4/0x2d4
[    6.768582][T10055]  kfree+0x100/0x2ec
[    6.768610][T10055]  vop2_crtc_reset+0x58/0x1cc
[    6.768641][T10055]  drm_mode_config_reset+0x12c/0x280
[    6.768669][T10055]  drm_atomic_helper_resume+0x44/0x2cc
[    6.768698][T10055]  drm_mode_config_helper_resume+0x54/0xdc
[    6.768727][T10055]  rockchip_drm_sys_resume+0x3c/0x50
[    6.768760][T10055]  platform_pm_resume+0xb4/0xd4
[    6.768788][T10055]  device_resume+0x348/0x5d4
[    6.768815][T10055]  dpm_resume+0x254/0x744
[    6.768842][T10055]  dpm_resume_end+0x20/0x3c
[    6.768873][T10055]  suspend_devices_and_enter+0xa20/0xba0
[    6.768900][T10055]  pm_suspend+0x4d8/0x66c
[    6.768928][T10055]  state_store+0x14c/0x1dc
[    6.768959][T10055]  kobj_attr_store+0x68/0x8c
[    6.768991][T10055]  sysfs_kf_write+0x1c0/0x23c
[    6.769019][T10055]  kernfs_fop_write_iter+0x280/0x3bc
[    6.769049][T10055]  vfs_write+0x5f0/0x7a8
[    6.769077][T10055]  ksys_write+0xc0/0x178
[    6.769104][T10055]  __arm64_sys_write+0x7c/0x94
[    6.769134][T10055]  el0_svc_common+0x168/0x448
[    6.769159][T10055]  do_el0_svc+0x50/0xe8
[    6.769188][T10055]  el0_svc+0x24/0x38
[    6.769214][T10055]  el0_sync_handler+0x88/0xec
[    6.769240][T10055]  el0_sync+0x1a8/0x1c0
[    6.769261][T10055] 
-- 
2.34.1



More information about the dri-devel mailing list