Skip to content

Commit 7259bb3

Browse files
committed
Merge remote-tracking branch 'lineage-sm8250/lineage-20' into android16
2 parents a31f4d3 + b25c4f3 commit 7259bb3

5 files changed

Lines changed: 64 additions & 20 deletions

File tree

drivers/gpu/msm/kgsl.c

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -609,11 +609,11 @@ int kgsl_context_init(struct kgsl_device_private *dev_priv,
609609
if (id == -ENOSPC) {
610610
/*
611611
* Before declaring that there are no contexts left try
612-
* flushing the event workqueue just in case there are
612+
* flushing the event worker just in case there are
613613
* detached contexts waiting to finish
614614
*/
615615

616-
flush_workqueue(device->events_wq);
616+
kthread_flush_worker(device->events_worker);
617617
id = _kgsl_get_context_id(device);
618618
}
619619

@@ -5334,6 +5334,16 @@ int kgsl_device_platform_probe(struct kgsl_device *device)
53345334
if (status)
53355335
goto error;
53365336

5337+
device->events_worker = kthread_create_worker(0, "kgsl-events");
5338+
5339+
if (IS_ERR(device->events_worker)) {
5340+
status = PTR_ERR(device->events_worker);
5341+
dev_err(device->dev, "Failed to create events worker ret=%d\n", status);
5342+
goto error_pwrctrl_close;
5343+
}
5344+
5345+
sched_set_fifo(device->events_worker->task);
5346+
53375347
if (!devm_request_mem_region(device->dev, device->reg_phys,
53385348
device->reg_len, device->name)) {
53395349
dev_err(device->dev, "request_mem_region failed\n");
@@ -5422,9 +5432,6 @@ int kgsl_device_platform_probe(struct kgsl_device *device)
54225432
PM_QOS_DEFAULT_VALUE);
54235433
}
54245434

5425-
device->events_wq = alloc_workqueue("kgsl-events",
5426-
WQ_UNBOUND | WQ_MEM_RECLAIM | WQ_SYSFS | WQ_HIGHPRI, 0);
5427-
54285435
/* Initialize the snapshot engine */
54295436
kgsl_device_snapshot_init(device);
54305437

@@ -5436,6 +5443,9 @@ int kgsl_device_platform_probe(struct kgsl_device *device)
54365443
error_close_mmu:
54375444
kgsl_mmu_close(device);
54385445
error_pwrctrl_close:
5446+
if (!IS_ERR(device->events_worker))
5447+
kthread_destroy_worker(device->events_worker);
5448+
54395449
kgsl_pwrctrl_close(device);
54405450
error:
54415451
kgsl_device_debugfs_close(device);
@@ -5446,7 +5456,7 @@ EXPORT_SYMBOL(kgsl_device_platform_probe);
54465456

54475457
void kgsl_device_platform_remove(struct kgsl_device *device)
54485458
{
5449-
destroy_workqueue(device->events_wq);
5459+
kthread_destroy_worker(device->events_worker);
54505460

54515461
kfree(device->dev->dma_parms);
54525462
device->dev->dma_parms = NULL;
@@ -5481,6 +5491,16 @@ _flush_mem_workqueue(struct work_struct *work)
54815491

54825492
static void kgsl_core_exit(void)
54835493
{
5494+
if (kgsl_driver.workqueue) {
5495+
destroy_workqueue(kgsl_driver.workqueue);
5496+
kgsl_driver.workqueue = NULL;
5497+
}
5498+
5499+
if (kgsl_driver.mem_workqueue) {
5500+
destroy_workqueue(kgsl_driver.mem_workqueue);
5501+
kgsl_driver.mem_workqueue = NULL;
5502+
}
5503+
54845504
kgsl_events_exit();
54855505
kgsl_core_debugfs_close();
54865506

@@ -5579,9 +5599,21 @@ static int __init kgsl_core_init(void)
55795599
kgsl_driver.workqueue = alloc_workqueue("kgsl-workqueue",
55805600
WQ_UNBOUND | WQ_MEM_RECLAIM | WQ_SYSFS, 0);
55815601

5602+
if (!kgsl_driver.workqueue) {
5603+
pr_err("kgsl: Failed to allocate kgsl workqueue\n");
5604+
result = -ENOMEM;
5605+
goto err;
5606+
}
5607+
55825608
kgsl_driver.mem_workqueue = alloc_workqueue("kgsl-mementry",
55835609
WQ_UNBOUND | WQ_MEM_RECLAIM, 0);
55845610

5611+
if (!kgsl_driver.mem_workqueue) {
5612+
pr_err("kgsl: Failed to allocate mem workqueue\n");
5613+
result = -ENOMEM;
5614+
goto err;
5615+
}
5616+
55855617
INIT_WORK(&kgsl_driver.mem_work, _flush_mem_workqueue);
55865618

55875619
kthread_init_worker(&kgsl_driver.worker);

drivers/gpu/msm/kgsl.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,7 @@ typedef void (*kgsl_event_func)(struct kgsl_device *, struct kgsl_event_group *,
316316
* @priv: Private data passed to the callback function
317317
* @node: List node for the kgsl_event_group list
318318
* @created: Jiffies when the event was created
319-
* @work: Work struct for dispatching the callback
319+
* @work: kthread_work struct for dispatching the callback
320320
* @result: KGSL event result type to pass to the callback
321321
* group: The event group this event belongs to
322322
*/
@@ -328,7 +328,7 @@ struct kgsl_event {
328328
void *priv;
329329
struct list_head node;
330330
unsigned int created;
331-
struct work_struct work;
331+
struct kthread_work work;
332332
int result;
333333
struct kgsl_event_group *group;
334334
};

drivers/gpu/msm/kgsl_device.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/* SPDX-License-Identifier: GPL-2.0-only */
22
/*
33
* Copyright (c) 2002,2007-2021, The Linux Foundation. All rights reserved.
4-
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
4+
* Copyright (c) 2022-2024, Qualcomm Innovation Center, Inc. All rights reserved.
55
*/
66
#ifndef __KGSL_DEVICE_H
77
#define __KGSL_DEVICE_H
@@ -311,7 +311,7 @@ struct kgsl_device {
311311
struct kgsl_pwrscale pwrscale;
312312

313313
int reset_counter; /* Track how many GPU core resets have occurred */
314-
struct workqueue_struct *events_wq;
314+
struct kthread_worker *events_worker;
315315

316316
struct device *busmondev; /* pseudo dev for GPU BW voting governor */
317317

drivers/gpu/msm/kgsl_events.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// SPDX-License-Identifier: GPL-2.0-only
22
/*
33
* Copyright (c) 2011-2019, The Linux Foundation. All rights reserved.
4+
* Copyright (c) 2022, 2024 Qualcomm Innovation Center, Inc. All rights reserved.
45
*/
56

67
#include <linux/debugfs.h>
@@ -21,17 +22,17 @@ static inline void signal_event(struct kgsl_device *device,
2122
{
2223
list_del(&event->node);
2324
event->result = result;
24-
queue_work(device->events_wq, &event->work);
25+
kthread_queue_work(device->events_worker, &event->work);
2526
}
2627

2728
/**
2829
* _kgsl_event_worker() - Work handler for processing GPU event callbacks
29-
* @work: Pointer to the work_struct for the event
30+
* @work: Pointer to the kthread_work for the event
3031
*
31-
* Each event callback has its own work struct and is run on a event specific
32-
* workqeuue. This is the worker that queues up the event callback function.
32+
* Each event callback has its own kthread_work struct and is run on a event specific
33+
* worker thread. This is the worker that queues up the event callback function.
3334
*/
34-
static void _kgsl_event_worker(struct work_struct *work)
35+
static void _kgsl_event_worker(struct kthread_work *work)
3536
{
3637
struct kgsl_event *event = container_of(work, struct kgsl_event, work);
3738
int id = KGSL_CONTEXT_ID(event->context);
@@ -273,7 +274,7 @@ int kgsl_add_event(struct kgsl_device *device, struct kgsl_event_group *group,
273274
event->created = jiffies;
274275
event->group = group;
275276

276-
INIT_WORK(&event->work, _kgsl_event_worker);
277+
kthread_init_work(&event->work, _kgsl_event_worker);
277278

278279
trace_kgsl_register_event(KGSL_CONTEXT_ID(context), timestamp, func);
279280

@@ -288,7 +289,7 @@ int kgsl_add_event(struct kgsl_device *device, struct kgsl_event_group *group,
288289

289290
if (timestamp_cmp(retired, timestamp) >= 0) {
290291
event->result = KGSL_EVENT_RETIRED;
291-
queue_work(device->events_wq, &event->work);
292+
kthread_queue_work(device->events_worker, &event->work);
292293
spin_unlock(&group->lock);
293294
return 0;
294295
}

drivers/gpu/msm/kgsl_pwrscale.c

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -803,6 +803,13 @@ int kgsl_pwrscale_init(struct device *dev, const char *governor)
803803
} else
804804
data->bus.num = 0;
805805

806+
pwrscale->devfreq_wq = create_freezable_workqueue("kgsl_devfreq_wq");
807+
if (!pwrscale->devfreq_wq) {
808+
dev_err(device->dev, "Failed to allocate kgsl devfreq workqueue\n");
809+
device->pwrscale.enabled = false;
810+
return -ENOMEM;
811+
}
812+
806813
devfreq = devfreq_add_device(dev, &pwrscale->gpu_profile.profile,
807814
governor, pwrscale->gpu_profile.private_data);
808815
if (IS_ERR(devfreq)) {
@@ -849,7 +856,6 @@ int kgsl_pwrscale_init(struct device *dev, const char *governor)
849856
ret = sysfs_create_link(&device->dev->kobj,
850857
&devfreq->dev.kobj, "devfreq");
851858

852-
pwrscale->devfreq_wq = create_freezable_workqueue("kgsl_devfreq_wq");
853859
INIT_WORK(&pwrscale->devfreq_suspend_ws, do_devfreq_suspend);
854860
INIT_WORK(&pwrscale->devfreq_resume_ws, do_devfreq_resume);
855861
INIT_WORK(&pwrscale->devfreq_notify_ws, do_devfreq_notify);
@@ -900,8 +906,13 @@ void kgsl_pwrscale_close(struct kgsl_device *device)
900906
devfreq_cooling_unregister(pwrscale->cooling_dev);
901907

902908
kgsl_pwrscale_midframe_timer_cancel(device);
903-
flush_workqueue(pwrscale->devfreq_wq);
904-
destroy_workqueue(pwrscale->devfreq_wq);
909+
910+
if (pwrscale->devfreq_wq) {
911+
flush_workqueue(pwrscale->devfreq_wq);
912+
destroy_workqueue(pwrscale->devfreq_wq);
913+
pwrscale->devfreq_wq = NULL;
914+
}
915+
905916
devfreq_remove_device(device->pwrscale.devfreqptr);
906917
kfree(kgsl_midframe);
907918
kgsl_midframe = NULL;

0 commit comments

Comments
 (0)