From f1072a28be09dc7f5433b5e1013a76d8a87c2505 Mon Sep 17 00:00:00 2001 From: Konsta Holtta Date: Wed, 1 Feb 2017 10:28:38 +0200 Subject: gpu: nvgpu: add worker for watchdog and job cleanup Implement a worker thread to replace the delayed works in channel watchdog and job cleanups. Watchdog runs by polling the channel states periodically, and job cleanup is performed on channels that are appended on a work queue consumed by the worker thread. Handling both of these two in the same thread makes it impossible for them to cause a deadlock, as has previously happened. The watchdog takes references to channels during checking and possibly recovering channels. Jobs in the cleanup queue have an additional reference taken which is released after the channel is processed. The worker is woken up from periodic sleep when channels are added to the queue. Currently, the queue is only used for job cleanups, but it is extendable for other per-channel works too. The worker can also process other periodic actions dependent on channels. Neither the semantics of timeout handling or of job cleanups are yet significantly changed - this patch only serializes them into one background thread. Each job that needs cleanup is tracked and holds a reference to its channel and a power reference, and timeouts can only be processed on channels that are tracked, so the thread will always be idle if the system is going to be suspended, so there is currently no need to explicitly suspend or stop it. Bug 1848834 Bug 1851689 Bug 1814773 Bug 200270332 Jira NVGPU-21 Change-Id: I355101802f50841ea9bd8042a017f91c931d2dc7 Signed-off-by: Konsta Holtta Reviewed-on: http://git-master/r/1297183 Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/gk20a/gk20a.h | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'drivers/gpu/nvgpu/gk20a/gk20a.h') diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.h b/drivers/gpu/nvgpu/gk20a/gk20a.h index c30a8eaf..c79cc6c8 100644 --- a/drivers/gpu/nvgpu/gk20a/gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/gk20a.h @@ -874,8 +874,6 @@ struct gk20a { bool timeouts_enabled; #endif - struct nvgpu_mutex ch_wdt_lock; - struct nvgpu_mutex poweroff_lock; /* Channel priorities */ @@ -1008,6 +1006,14 @@ struct gk20a { atomic_t sw_irq_nonstall_last_handled; wait_queue_head_t sw_irq_nonstall_last_handled_wq; + struct gk20a_channel_worker { + struct task_struct *poll_task; + atomic_t put; + wait_queue_head_t wq; + struct list_head items; + struct nvgpu_spinlock items_lock; + } channel_worker; + struct devfreq *devfreq; struct gk20a_scale_profile *scale_profile; -- cgit v1.2.2