@@ -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)
54365443error_close_mmu :
54375444 kgsl_mmu_close (device );
54385445error_pwrctrl_close :
5446+ if (!IS_ERR (device -> events_worker ))
5447+ kthread_destroy_worker (device -> events_worker );
5448+
54395449 kgsl_pwrctrl_close (device );
54405450error :
54415451 kgsl_device_debugfs_close (device );
@@ -5446,7 +5456,7 @@ EXPORT_SYMBOL(kgsl_device_platform_probe);
54465456
54475457void 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
54825492static 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 );
0 commit comments