summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/vgpu/fifo_vgpu.c
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/vgpu/fifo_vgpu.c
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/vgpu/fifo_vgpu.c')
-rw-r--r--drivers/gpu/nvgpu/vgpu/fifo_vgpu.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/vgpu/fifo_vgpu.c b/drivers/gpu/nvgpu/vgpu/fifo_vgpu.c
index 7b6ed322..027a92fc 100644
--- a/drivers/gpu/nvgpu/vgpu/fifo_vgpu.c
+++ b/drivers/gpu/nvgpu/vgpu/fifo_vgpu.c
@@ -308,6 +308,10 @@ static int vgpu_init_fifo_setup_sw(struct gk20a *g)
308 } 308 }
309 nvgpu_mutex_init(&f->tsg_inuse_mutex); 309 nvgpu_mutex_init(&f->tsg_inuse_mutex);
310 310
311 err = nvgpu_channel_worker_init(g);
312 if (err)
313 goto clean_up;
314
311 f->deferred_reset_pending = false; 315 f->deferred_reset_pending = false;
312 nvgpu_mutex_init(&f->deferred_reset_mutex); 316 nvgpu_mutex_init(&f->deferred_reset_mutex);
313 317