• Viresh Kumar's avatar
    opp: Allocate the OPP table outside of opp_table_lock · 27c09484
    Viresh Kumar authored
    There is no critical section which needs protection with locks while
    allocating an OPP table, except while adding it to the opp_tables list.
    And taking the opp_table_lock for the entire duration causes circular
    dependency issues like the one mentioned below.  This patch takes
    another approach to reduce the size of the critical section to avoid
    such issues, the details of that are present within the patch.
    
     ======================================================
     WARNING: possible circular locking dependency detected
     5.4.72 #14 Not tainted
     ------------------------------------------------------
     chrome/1865 is trying to acquire lock:
     ffffffdd34921750 (opp_table_lock){+.+.}, at: _find_opp_table+0x34/0x74
    
     but task is already holding lock:
     ffffff81f0fc71a8 (reservation_ww_class_mutex){+.+.}, at: submit_lock_objects+0x70/0x1ec
    
     fscrypt: AES-256-CTS-CBC using implementation "cts-cbc-aes-ce"
     which lock already depends on the new lock.
    
     the existing dependency chain (in reverse order) is:
     -> #4 (reservation_ww_class_mutex){+.+.}:
            __mutex_lock_common+0xec/0xc0c
            ww_mutex_lock_interruptible+0x5c/0xc4
            msm_gem_fault+0x2c/0x124
            __do_fault+0x40/0x16c
            handle_mm_fault+0x7cc/0xd98
            do_page_fault+0x230/0x3b4
            do_translation_fault+0x5c/0x78
            do_mem_abort+0x4c/0xb4
            el0_da+0x1c/0x20
     -> #3 (&mm->mmap_sem){++++}:
            __might_fault+0x70/0x98
            compat_filldir+0xf8/0x48c
            dcache_readdir+0x70/0x1dc
            iterate_dir+0xd4/0x180
            __arm64_compat_sys_getdents+0xa0/0x19c
            el0_svc_common+0xa8/0x178
            el0_svc_compat_handler+0x2c/0x40
            el0_svc_compat+0x8/0x10
     -> #2 (&sb->s_type->i_mutex_key#3){++++}:
            down_write+0x54/0x16c
            start_creating+0x68/0x128
            debugfs_create_dir+0x28/0x114
            opp_debug_register+0x8c/0xc0
            _add_opp_dev_unlocked+0x5c/0x70
            _add_opp_dev+0x38/0x58
            _opp_get_opp_table+0xdc/0x1ac
            dev_pm_opp_get_opp_table_indexed+0x24/0x30
            dev_pm_opp_of_add_table_indexed+0x48/0x84
            of_genpd_add_provider_onecell+0xc0/0x1b8
            rpmhpd_probe+0x240/0x268
            platform_drv_probe+0x90/0xb0
            really_probe+0x134/0x2ec
            driver_probe_device+0x64/0xfc
            __device_attach_driver+0x8c/0xa4
            bus_for_each_drv+0x90/0xd8
            __device_attach+0xc0/0x148
            device_initial_probe+0x20/0x2c
            bus_probe_device+0x34/0x94
            device_add+0x1fc/0x3b0
            of_device_add+0x3c/0x4c
            of_platform_device_create_pdata+0xb8/0xfc
            of_platform_bus_create+0x1e4/0x368
            of_platform_populate+0x70/0xbc
            devm_of_platform_populate+0x58/0xa0
            rpmh_rsc_probe+0x36c/0x3cc
            platform_drv_probe+0x90/0xb0
            really_probe+0x134/0x2ec
            driver_probe_device+0x64/0xfc
            __device_attach_driver+0x8c/0xa4
            bus_for_each_drv+0x90/0xd8
            __device_attach+0xc0/0x148
            device_initial_probe+0x20/0x2c
            bus_probe_device+0x34/0x94
            device_add+0x1fc/0x3b0
            of_device_add+0x3c/0x4c
            of_platform_device_create_pdata+0xb8/0xfc
            of_platform_bus_create+0x1e4/0x368
            of_platform_bus_create+0x230/0x368
            of_platform_populate+0x70/0xbc
            of_platform_default_populate_init+0xa8/0xc0
            do_one_initcall+0x1c8/0x3fc
            do_initcall_level+0xb4/0x10c
            do_basic_setup+0x30/0x48
            kernel_init_freeable+0x124/0x1a4
            kernel_init+0x14/0x104
            ret_from_fork+0x10/0x18
     -> #1 (&opp_table->lock){+.+.}:
            __mutex_lock_common+0xec/0xc0c
            mutex_lock_nested+0x40/0x50
            _add_opp_dev+0x2c/0x58
            _opp_get_opp_table+0xdc/0x1ac
            dev_pm_opp_get_opp_table_indexed+0x24/0x30
            dev_pm_opp_of_add_table_indexed+0x48/0x84
            of_genpd_add_provider_onecell+0xc0/0x1b8
            rpmhpd_probe+0x240/0x268
            platform_drv_probe+0x90/0xb0
            really_probe+0x134/0x2ec
            driver_probe_device+0x64/0xfc
            __device_attach_driver+0x8c/0xa4
            bus_for_each_drv+0x90/0xd8
            __device_attach+0xc0/0x148
            device_initial_probe+0x20/0x2c
            bus_probe_device+0x34/0x94
            device_add+0x1fc/0x3b0
            of_device_add+0x3c/0x4c
            of_platform_device_create_pdata+0xb8/0xfc
            of_platform_bus_create+0x1e4/0x368
            of_platform_populate+0x70/0xbc
            devm_of_platform_populate+0x58/0xa0
            rpmh_rsc_probe+0x36c/0x3cc
            platform_drv_probe+0x90/0xb0
            really_probe+0x134/0x2ec
            driver_probe_device+0x64/0xfc
            __device_attach_driver+0x8c/0xa4
            bus_for_each_drv+0x90/0xd8
            __device_attach+0xc0/0x148
            device_initial_probe+0x20/0x2c
            bus_probe_device+0x34/0x94
            device_add+0x1fc/0x3b0
            of_device_add+0x3c/0x4c
            of_platform_device_create_pdata+0xb8/0xfc
            of_platform_bus_create+0x1e4/0x368
            of_platform_populate+0x70/0xbc
            devm_of_platform_populate+0x58/0xa0
            rpmh_rsc_probe+0x36c/0x3cc
            platform_drv_probe+0x90/0xb0
            really_probe+0x134/0x2ec
            driver_probe_device+0x64/0xfc
            __device_attach_driver+0x8c/0xa4
            bus_for_each_drv+0x90/0xd8
            __device_attach+0xc0/0x148
            device_initial_probe+0x20/0x2c
            bus_probe_device+0x34/0x94
            device_add+0x1fc/0x3b0
            of_device_add+0x3c/0x4c
            of_platform_device_create_pdata+0xb8/0xfc
            of_platform_bus_create+0x1e4/0x368
            of_platform_bus_create+0x230/0x368
            of_platform_populate+0x70/0xbc
            of_platform_default_populate_init+0xa8/0xc0
            do_one_initcall+0x1c8/0x3fc
            do_initcall_level+0xb4/0x10c
            do_basic_setup+0x30/0x48
            kernel_init_freeable+0x124/0x1a4
            kernel_init+0x14/0x104
            ret_from_fork+0x10/0x18
     -> #0 (opp_table_lock){+.+.}:
            __lock_acquire+0xee4/0x2450
            lock_acquire+0x1cc/0x210
            __mutex_lock_common+0xec/0xc0c
            mutex_lock_nested+0x40/0x50
            _find_opp_table+0x34/0x74
            dev_pm_opp_find_freq_exact+0x2c/0xdc
            a6xx_gmu_resume+0xc8/0xecc
            a6xx_pm_resume+0x148/0x200
            adreno_resume+0x28/0x34
            pm_generic_runtime_resume+0x34/0x48
            __rpm_callback+0x70/0x10c
            rpm_callback+0x34/0x8c
            rpm_resume+0x414/0x550
            __pm_runtime_resume+0x7c/0xa0
            msm_gpu_submit+0x60/0x1c0
            msm_ioctl_gem_submit+0xadc/0xb60
            drm_ioctl_kernel+0x9c/0x118
            drm_ioctl+0x27c/0x408
            drm_compat_ioctl+0xcc/0xdc
            __se_compat_sys_ioctl+0x100/0x206c
            __arm64_compat_sys_ioctl+0x20/0x2c
            el0_svc_common+0xa8/0x178
            el0_svc_compat_handler+0x2c/0x40
            el0_svc_compat+0x8/0x10
     other info that might help us debug this:
     Chain exists of: opp_table_lock --> &mm->mmap_sem --> reservation_ww_class_mutex
      Possible unsafe locking scenario:
            CPU0                    CPU1
            ----                    ----
       lock(reservation_ww_class_mutex);
                                    lock(&mm->mmap_sem);
                                    lock(reservation_ww_class_mutex);
       lock(opp_table_lock);
    
     *** DEADLOCK ***
    
     3 locks held by chrome/1865:
      #0: ffffff81edecc0d8 (&dev->struct_mutex){+.+.}, at: msm_ioctl_gem_submit+0x264/0xb60
      #1: ffffff81d0000870 (reservation_ww_class_acquire){+.+.}, at: msm_ioctl_gem_submit+0x8e8/0xb60
      #2: ffffff81f0fc71a8 (reservation_ww_class_mutex){+.+.}, at: submit_lock_objects+0x70/0x1ec
     stack backtrace:
     CPU: 0 PID: 1865 Comm: chrome Not tainted 5.4.72 #14
     Hardware name: Google Lazor (rev1+) with LTE (DT)
     Call trace:
      dump_backtrace+0x0/0x158
      show_stack+0x20/0x2c
      dump_stack+0xc8/0x160
      print_circular_bug+0x2c4/0x2c8
      check_noncircular+0x1a8/0x1b0
      __lock_acquire+0xee4/0x2450
      lock_acquire+0x1cc/0x210
      __mutex_lock_common+0xec/0xc0c
      mutex_lock_nested+0x40/0x50
      _find_opp_table+0x34/0x74
      dev_pm_opp_find_freq_exact+0x2c/0xdc
      a6xx_gmu_resume+0xc8/0xecc
      a6xx_pm_resume+0x148/0x200
      adreno_resume+0x28/0x34
      pm_generic_runtime_resume+0x34/0x48
      __rpm_callback+0x70/0x10c
      rpm_callback+0x34/0x8c
      rpm_resume+0x414/0x550
      __pm_runtime_resume+0x7c/0xa0
      msm_gpu_submit+0x60/0x1c0
      msm_ioctl_gem_submit+0xadc/0xb60
      drm_ioctl_kernel+0x9c/0x118
      drm_ioctl+0x27c/0x408
      drm_compat_ioctl+0xcc/0xdc
      __se_compat_sys_ioctl+0x100/0x206c
      __arm64_compat_sys_ioctl+0x20/0x2c
      el0_svc_common+0xa8/0x178
      el0_svc_compat_handler+0x2c/0x40
      el0_svc_compat+0x8/0x10
    Reported-by: default avatarRob Clark <robdclark@gmail.com>
    Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
    27c09484
core.c 64.7 KB