• Sudeep Holla's avatar
    cpufreq: Cancel policy update work scheduled before freeing · 6941051d
    Sudeep Holla authored
    Scheduled policy update work may end up racing with the freeing of the
    policy and unregistering the driver.
    
    One possible race is as below, where the cpufreq_driver is unregistered,
    but the scheduled work gets executed at later stage when, cpufreq_driver
    is NULL (i.e. after freeing the policy and driver).
    
    Unable to handle kernel NULL pointer dereference at virtual address 0000001c
    pgd = (ptrval)
    [0000001c] *pgd=80000080204003, *pmd=00000000
    Internal error: Oops: 206 [#1] SMP THUMB2
    Modules linked in:
    CPU: 0 PID: 34 Comm: kworker/0:1 Not tainted 5.4.0-rc3-00006-g67f5a8081a4b #86
    Hardware name: ARM-Versatile Express
    Workqueue: events handle_update
    PC is at cpufreq_set_policy+0x58/0x228
    LR is at dev_pm_qos_read_value+0x77/0xac
    Control: 70c5387d  Table: 80203000  DAC: fffffffd
    Process kworker/0:1 (pid: 34, stack limit = 0x(ptrval))
    	(cpufreq_set_policy) from (refresh_frequency_limits.part.24+0x37/0x48)
    	(refresh_frequency_limits.part.24) from (handle_update+0x2f/0x38)
    	(handle_update) from (process_one_work+0x16d/0x3cc)
    	(process_one_work) from (worker_thread+0xff/0x414)
    	(worker_thread) from (kthread+0xff/0x100)
    	(kthread) from (ret_from_fork+0x11/0x28)
    
    Fixes: 67d874c3 ("cpufreq: Register notifiers with the PM QoS framework")
    Signed-off-by: default avatarSudeep Holla <sudeep.holla@arm.com>
    [ rjw: Cancel the work before dropping the QoS requests ]
    Acked-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    6941051d
cpufreq.c 70.8 KB