summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/gk20a.h
diff options
context:
space:
mode:
authorKonsta Holtta <kholtta@nvidia.com>2017-02-01 03:28:38 -0500
committermobile promotions <svcmobile_promotions@nvidia.com>2017-03-02 20:51:03 -0500
commitf1072a28be09dc7f5433b5e1013a76d8a87c2505 (patch)
tree68d1a5b5123834859f8ae8c4481b886b49364811 /drivers/gpu/nvgpu/gk20a/gk20a.h
parent0c155313e75a82a409d3438cc982ee30bb453d16 (diff)
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 <kholtta@nvidia.com> Reviewed-on: http://git-master/r/1297183 Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/gk20a.h')
-rw-r--r--drivers/gpu/nvgpu/gk20a/gk20a.h10
1 files changed, 8 insertions, 2 deletions
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 {
874 bool timeouts_enabled; 874 bool timeouts_enabled;
875#endif 875#endif
876 876
877 struct nvgpu_mutex ch_wdt_lock;
878
879 struct nvgpu_mutex poweroff_lock; 877 struct nvgpu_mutex poweroff_lock;
880 878
881 /* Channel priorities */ 879 /* Channel priorities */
@@ -1008,6 +1006,14 @@ struct gk20a {
1008 atomic_t sw_irq_nonstall_last_handled; 1006 atomic_t sw_irq_nonstall_last_handled;
1009 wait_queue_head_t sw_irq_nonstall_last_handled_wq; 1007 wait_queue_head_t sw_irq_nonstall_last_handled_wq;
1010 1008
1009 struct gk20a_channel_worker {
1010 struct task_struct *poll_task;
1011 atomic_t put;
1012 wait_queue_head_t wq;
1013 struct list_head items;
1014 struct nvgpu_spinlock items_lock;
1015 } channel_worker;
1016
1011 struct devfreq *devfreq; 1017 struct devfreq *devfreq;
1012 1018
1013 struct gk20a_scale_profile *scale_profile; 1019 struct gk20a_scale_profile *scale_profile;