Merge "msm: kgsl: Fix possible NULL pointer dereference"

This commit is contained in:
qctecmdr 2021-04-26 08:46:45 -07:00 • committed by Gerrit - the friendly Code Review server
commit e11e35ec91
2 changed files with 46 additions and 7 deletions

View file

@ -4389,6 +4389,15 @@ int kgsl_device_platform_probe(struct kgsl_device *device)
idr_init(&device->timelines);
spin_lock_init(&device->timelines_lock);
device->events_wq = alloc_workqueue("kgsl-events",
WQ_UNBOUND | WQ_MEM_RECLAIM | WQ_SYSFS | WQ_HIGHPRI, 0);
if (!device->events_wq) {
dev_err(device->dev, "Failed to allocate events workqueue\n");
status = -ENOMEM;
goto error_pwrctrl_close;
}
kgsl_device_debugfs_init(device);
dma_set_coherent_mask(&pdev->dev, KGSL_DMA_BIT_MASK);
@ -4396,9 +4405,6 @@ int kgsl_device_platform_probe(struct kgsl_device *device)
/* Set up the GPU events for the device */
kgsl_device_events_probe(device);
device->events_wq = alloc_workqueue("kgsl-events",
WQ_UNBOUND | WQ_MEM_RECLAIM | WQ_SYSFS | WQ_HIGHPRI, 0);
/* Initialize common sysfs entries */
kgsl_pwrctrl_init_sysfs(device);
@ -4413,7 +4419,10 @@ error:
void kgsl_device_platform_remove(struct kgsl_device *device)
{
destroy_workqueue(device->events_wq);
if (device->events_wq) {
destroy_workqueue(device->events_wq);
device->events_wq = NULL;
}
kgsl_device_snapshot_close(device);
@ -4443,6 +4452,16 @@ void kgsl_core_exit(void)
{
kgsl_exit_page_pools();
if (kgsl_driver.workqueue) {
destroy_workqueue(kgsl_driver.workqueue);
kgsl_driver.workqueue = NULL;
}
if (kgsl_driver.mem_workqueue) {
destroy_workqueue(kgsl_driver.mem_workqueue);
kgsl_driver.mem_workqueue = NULL;
}
kgsl_events_exit();
kgsl_core_debugfs_close();
@ -4542,9 +4561,21 @@ int __init kgsl_core_init(void)
kgsl_driver.workqueue = alloc_workqueue("kgsl-workqueue",
WQ_UNBOUND | WQ_MEM_RECLAIM | WQ_SYSFS, 0);
if (!kgsl_driver.workqueue) {
pr_err("kgsl: Failed to allocate kgsl workqueue\n");
result = -ENOMEM;
goto err;
}
kgsl_driver.mem_workqueue = alloc_workqueue("kgsl-mementry",
WQ_UNBOUND | WQ_MEM_RECLAIM, 0);
if (!kgsl_driver.mem_workqueue) {
pr_err("kgsl: Failed to allocate mem workqueue\n");
result = -ENOMEM;
goto err;
}
kthread_init_worker(&kgsl_driver.worker);
kgsl_driver.worker_thread = kthread_run(kthread_worker_fn,

View file

@ -856,6 +856,10 @@ int kgsl_pwrscale_init(struct kgsl_device *device, struct platform_device *pdev,
adreno_tz_data.bus.floating = false;
}
pwrscale->devfreq_wq = create_freezable_workqueue("kgsl_devfreq_wq");
if (!pwrscale->devfreq_wq)
return -ENOMEM;
devfreq = devfreq_add_device(&pdev->dev, &gpu_profile->profile,
governor, &adreno_tz_data);
if (IS_ERR(devfreq)) {
@ -877,7 +881,6 @@ int kgsl_pwrscale_init(struct kgsl_device *device, struct platform_device *pdev,
ret = sysfs_create_link(&device->dev->kobj,
&devfreq->dev.kobj, "devfreq");
pwrscale->devfreq_wq = create_freezable_workqueue("kgsl_devfreq_wq");
INIT_WORK(&pwrscale->devfreq_suspend_ws, do_devfreq_suspend);
INIT_WORK(&pwrscale->devfreq_resume_ws, do_devfreq_resume);
INIT_WORK(&pwrscale->devfreq_notify_ws, do_devfreq_notify);
@ -924,8 +927,13 @@ void kgsl_pwrscale_close(struct kgsl_device *device)
devfreq_cooling_unregister(pwrscale->cooling_dev);
kgsl_pwrscale_midframe_timer_cancel(device);
flush_workqueue(pwrscale->devfreq_wq);
destroy_workqueue(pwrscale->devfreq_wq);
if (pwrscale->devfreq_wq) {
flush_workqueue(pwrscale->devfreq_wq);
destroy_workqueue(pwrscale->devfreq_wq);
pwrscale->devfreq_wq = NULL;
}
devfreq_remove_device(device->pwrscale.devfreqptr);
kfree(kgsl_midframe);
kgsl_midframe = NULL;