@@ -271,8 +271,8 @@ static struct mpp_task_msgs *get_task_msgs(struct mpp_session *session)
271
271
session -> msgs_cnt ++ ;
272
272
spin_unlock_irqrestore (& session -> lock_msgs , flags );
273
273
274
- mpp_debug_func (DEBUG_TASK_INFO , "session %p :%d msgs cnt %d\n" ,
275
- session , session -> index , session -> msgs_cnt );
274
+ mpp_debug_func (DEBUG_TASK_INFO , "session %d :%d msgs cnt %d\n" ,
275
+ session -> pid , session -> index , session -> msgs_cnt );
276
276
277
277
return msgs ;
278
278
}
@@ -319,8 +319,7 @@ static void clear_task_msgs(struct mpp_session *session)
319
319
kfree (msgs );
320
320
}
321
321
322
- static int mpp_session_clear (struct mpp_dev * mpp ,
323
- struct mpp_session * session )
322
+ static void mpp_session_clear_pending (struct mpp_session * session )
324
323
{
325
324
struct mpp_task * task = NULL , * n ;
326
325
@@ -335,8 +334,49 @@ static int mpp_session_clear(struct mpp_dev *mpp,
335
334
kref_put (& task -> ref , mpp_free_task );
336
335
}
337
336
mutex_unlock (& session -> pending_lock );
337
+ }
338
338
339
- return 0 ;
339
+ void mpp_session_cleanup_detach (struct mpp_taskqueue * queue , struct kthread_work * work )
340
+ {
341
+ struct mpp_session * session , * n ;
342
+
343
+ if (!atomic_read (& queue -> detach_count ))
344
+ return ;
345
+
346
+ mutex_lock (& queue -> session_lock );
347
+ list_for_each_entry_safe (session , n , & queue -> session_detach , session_link ) {
348
+ s32 task_count = atomic_read (& session -> task_count );
349
+
350
+ if (!task_count ) {
351
+ list_del_init (& session -> session_link );
352
+ atomic_dec (& queue -> detach_count );
353
+ }
354
+
355
+ mutex_unlock (& queue -> session_lock );
356
+
357
+ if (task_count ) {
358
+ mpp_dbg_session ("session %d:%d task not finished %d\n" ,
359
+ session -> pid , session -> index ,
360
+ atomic_read (& queue -> detach_count ));
361
+
362
+ mpp_session_clear_pending (session );
363
+ } else {
364
+ mpp_dbg_session ("queue detach %d\n" ,
365
+ atomic_read (& queue -> detach_count ));
366
+
367
+ mpp_session_deinit (session );
368
+ }
369
+
370
+ mutex_lock (& queue -> session_lock );
371
+ }
372
+ mutex_unlock (& queue -> session_lock );
373
+
374
+ if (atomic_read (& queue -> detach_count )) {
375
+ mpp_dbg_session ("queue detach %d again\n" ,
376
+ atomic_read (& queue -> detach_count ));
377
+
378
+ kthread_queue_work (& queue -> worker , work );
379
+ }
340
380
}
341
381
342
382
static struct mpp_session * mpp_session_init (void )
@@ -372,7 +412,7 @@ static void mpp_session_deinit_default(struct mpp_session *session)
372
412
if (mpp -> dev_ops -> free_session )
373
413
mpp -> dev_ops -> free_session (session );
374
414
375
- mpp_session_clear ( mpp , session );
415
+ mpp_session_clear_pending ( session );
376
416
377
417
if (session -> dma ) {
378
418
mpp_iommu_down_write (mpp -> iommu_info );
@@ -393,32 +433,25 @@ static void mpp_session_deinit_default(struct mpp_session *session)
393
433
list_del_init (& session -> session_link );
394
434
}
395
435
396
- int mpp_session_deinit (struct mpp_session * session )
436
+ void mpp_session_deinit (struct mpp_session * session )
397
437
{
398
- u32 task_count = atomic_read (& session -> task_count );
399
-
400
- mpp_dbg_session ("session %p:%d task %d release\n" ,
401
- session , session -> index , task_count );
402
- if (task_count )
403
- return -1 ;
438
+ mpp_dbg_session ("session %d:%d task %d deinit\n" , session -> pid ,
439
+ session -> index , atomic_read (& session -> task_count ));
404
440
405
441
if (likely (session -> deinit ))
406
442
session -> deinit (session );
407
443
else
408
444
pr_err ("invalid NULL session deinit function\n" );
409
445
410
- mpp_dbg_session ("session %p:%d deinit\n" , session , session -> index );
411
-
412
446
clear_task_msgs (session );
413
447
414
448
kfree (session );
415
- return 0 ;
416
449
}
417
450
418
451
static void mpp_session_attach_workqueue (struct mpp_session * session ,
419
452
struct mpp_taskqueue * queue )
420
453
{
421
- mpp_dbg_session ("session %p :%d attach\n" , session , session -> index );
454
+ mpp_dbg_session ("session %d :%d attach\n" , session -> pid , session -> index );
422
455
mutex_lock (& queue -> session_lock );
423
456
list_add_tail (& session -> session_link , & queue -> session_attach );
424
457
mutex_unlock (& queue -> session_lock );
@@ -432,14 +465,14 @@ static void mpp_session_detach_workqueue(struct mpp_session *session)
432
465
if (!session -> mpp || !session -> mpp -> queue )
433
466
return ;
434
467
435
- mpp_dbg_session ("session %p :%d detach\n" , session , session -> index );
468
+ mpp_dbg_session ("session %d :%d detach\n" , session -> pid , session -> index );
436
469
mpp = session -> mpp ;
437
470
queue = mpp -> queue ;
438
471
439
472
mutex_lock (& queue -> session_lock );
440
473
list_del_init (& session -> session_link );
441
474
list_add_tail (& session -> session_link , & queue -> session_detach );
442
- queue -> detach_count ++ ;
475
+ atomic_inc ( & queue -> detach_count ) ;
443
476
mutex_unlock (& queue -> session_lock );
444
477
445
478
mpp_taskqueue_trigger_work (mpp );
@@ -521,15 +554,18 @@ static void mpp_task_timeout_work(struct work_struct *work_s)
521
554
return ;
522
555
}
523
556
524
- mpp_err ("task %p processing time out!\n" , task );
525
557
if (!task -> session ) {
526
558
mpp_err ("task %p, task->session is null.\n" , task );
527
559
return ;
528
560
}
561
+
529
562
session = task -> session ;
563
+ mpp_err ("task %d:%d:%d processing time out!\n" , session -> pid ,
564
+ session -> index , task -> task_id );
530
565
531
566
if (!session -> mpp ) {
532
- mpp_err ("session %p, session->mpp is null.\n" , session );
567
+ mpp_err ("session %d:%d, session mpp is null.\n" , session -> pid ,
568
+ session -> index );
533
569
return ;
534
570
}
535
571
@@ -790,28 +826,7 @@ static void mpp_task_worker_default(struct kthread_work *work_s)
790
826
}
791
827
792
828
done :
793
- mutex_lock (& queue -> session_lock );
794
- while (queue -> detach_count ) {
795
- struct mpp_session * session = NULL ;
796
-
797
- session = list_first_entry_or_null (& queue -> session_detach , struct mpp_session ,
798
- session_link );
799
- if (session ) {
800
- list_del_init (& session -> session_link );
801
- queue -> detach_count -- ;
802
- }
803
-
804
- mutex_unlock (& queue -> session_lock );
805
-
806
- if (session ) {
807
- mpp_dbg_session ("%s detach count %d\n" , dev_name (mpp -> dev ),
808
- queue -> detach_count );
809
- mpp_session_deinit (session );
810
- }
811
-
812
- mutex_lock (& queue -> session_lock );
813
- }
814
- mutex_unlock (& queue -> session_lock );
829
+ mpp_session_cleanup_detach (queue , work_s );
815
830
}
816
831
817
832
static int mpp_wait_result_default (struct mpp_session * session ,
@@ -823,7 +838,8 @@ static int mpp_wait_result_default(struct mpp_session *session,
823
838
824
839
task = mpp_session_get_pending_task (session );
825
840
if (!task ) {
826
- mpp_err ("session %p pending list is empty!\n" , session );
841
+ mpp_err ("session %d:%d pending list is empty!\n" ,
842
+ session -> pid , session -> index );
827
843
return - EIO ;
828
844
}
829
845
mpp = mpp_get_task_used_device (task , session );
@@ -837,8 +853,8 @@ static int mpp_wait_result_default(struct mpp_session *session,
837
853
} else {
838
854
atomic_inc (& task -> abort_request );
839
855
set_bit (TASK_STATE_ABORT , & task -> state );
840
- mpp_err ("timeout, pid %d session %p :%d count %d cur_task %p id %d\n" ,
841
- session -> pid , session , session -> index ,
856
+ mpp_err ("timeout, pid %d session %d :%d count %d cur_task %p id %d\n" ,
857
+ session -> pid , session -> pid , session -> index ,
842
858
atomic_read (& session -> task_count ), task ,
843
859
task -> task_id );
844
860
}
@@ -947,6 +963,7 @@ struct mpp_taskqueue *mpp_taskqueue_init(struct device *dev)
947
963
/* default taskqueue has max 16 task capacity */
948
964
queue -> task_capacity = MPP_MAX_TASK_CAPACITY ;
949
965
atomic_set (& queue -> reset_request , 0 );
966
+ atomic_set (& queue -> detach_count , 0 );
950
967
atomic_set (& queue -> task_id , 0 );
951
968
952
969
return queue ;
@@ -1232,7 +1249,7 @@ static int mpp_process_request(struct mpp_session *session,
1232
1249
if (!mpp )
1233
1250
return - EINVAL ;
1234
1251
1235
- mpp_session_clear ( mpp , session );
1252
+ mpp_session_clear_pending ( session );
1236
1253
mpp_iommu_down_write (mpp -> iommu_info );
1237
1254
ret = mpp_dma_session_destroy (session -> dma );
1238
1255
mpp_iommu_up_write (mpp -> iommu_info );
@@ -1435,8 +1452,8 @@ static int mpp_collect_msgs(struct list_head *head, struct mpp_session *session,
1435
1452
msgs = get_task_msgs (session );
1436
1453
1437
1454
if (!msgs ) {
1438
- pr_err ("session %p :%d failed to get task msgs" ,
1439
- session , session -> index );
1455
+ pr_err ("session %d :%d failed to get task msgs" ,
1456
+ session -> pid , session -> index );
1440
1457
return - EINVAL ;
1441
1458
}
1442
1459
@@ -1621,7 +1638,7 @@ static int mpp_dev_release(struct inode *inode, struct file *filp)
1621
1638
/* wait for task all done */
1622
1639
atomic_inc (& session -> release_request );
1623
1640
1624
- if (session -> mpp )
1641
+ if (session -> mpp || atomic_read ( & session -> task_count ) )
1625
1642
mpp_session_detach_workqueue (session );
1626
1643
else
1627
1644
mpp_session_deinit (session );
0 commit comments