hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/video/rockchip/rga3/rga_job.c
....@@ -13,6 +13,7 @@
1313 #include "rga_mm.h"
1414 #include "rga_iommu.h"
1515 #include "rga_debugger.h"
16
+#include "rga_common.h"
1617
1718 static void rga_job_free(struct rga_job *job)
1819 {
....@@ -40,11 +41,12 @@
4041
4142 static int rga_job_cleanup(struct rga_job *job)
4243 {
43
- if (DEBUGGER_EN(TIME))
44
- pr_err("(pid:%d) job clean use time = %lld\n", job->pid,
45
- ktime_us_delta(ktime_get(), job->timestamp));
46
-
4744 rga_job_put(job);
45
+
46
+ if (DEBUGGER_EN(TIME))
47
+ pr_info("request[%d], job cleanup total cost time %lld us\n",
48
+ job->request_id,
49
+ ktime_us_delta(ktime_get(), job->timestamp));
4850
4951 return 0;
5052 }
....@@ -272,11 +274,11 @@
272274 if (DEBUGGER_EN(DUMP_IMAGE))
273275 rga_dump_job_image(job);
274276
275
- if (DEBUGGER_EN(TIME)) {
276
- pr_info("hw use time = %lld\n", ktime_us_delta(now, job->hw_running_time));
277
- pr_info("(pid:%d) job done use time = %lld\n", job->pid,
278
- ktime_us_delta(now, job->timestamp));
279
- }
277
+ if (DEBUGGER_EN(TIME))
278
+ pr_info("request[%d], hardware[%s] cost time %lld us\n",
279
+ job->request_id,
280
+ rga_get_core_name(scheduler->core),
281
+ ktime_us_delta(now, job->hw_running_time));
280282
281283 rga_mm_unmap_job_info(job);
282284
....@@ -492,7 +494,7 @@
492494 return false;
493495 }
494496
495
-static int rga_request_get_current_mm(struct rga_request *request)
497
+static struct mm_struct *rga_request_get_current_mm(struct rga_request *request)
496498 {
497499 int i;
498500
....@@ -500,23 +502,21 @@
500502 if (rga_is_need_current_mm(&(request->task_list[i]))) {
501503 mmgrab(current->mm);
502504 mmget(current->mm);
503
- request->current_mm = current->mm;
504505
505
- break;
506
+ return current->mm;
506507 }
507508 }
508509
509
- return 0;
510
+ return NULL;
510511 }
511512
512
-static void rga_request_put_current_mm(struct rga_request *request)
513
+static void rga_request_put_current_mm(struct mm_struct *mm)
513514 {
514
- if (request->current_mm == NULL)
515
+ if (mm == NULL)
515516 return;
516517
517
- mmput(request->current_mm);
518
- mmdrop(request->current_mm);
519
- request->current_mm = NULL;
518
+ mmput(mm);
519
+ mmdrop(mm);
520520 }
521521
522522 static int rga_request_add_acquire_fence_callback(int acquire_fence_fd,
....@@ -693,6 +693,7 @@
693693 static void rga_request_release_abort(struct rga_request *request, int err_code)
694694 {
695695 unsigned long flags;
696
+ struct mm_struct *current_mm;
696697 struct rga_pending_request_manager *request_manager = rga_drvdata->pend_request_manager;
697698
698699 if (rga_request_scheduler_job_abort(request) > 0)
....@@ -707,10 +708,12 @@
707708
708709 request->is_running = false;
709710 request->is_done = false;
710
-
711
- rga_request_put_current_mm(request);
711
+ current_mm = request->current_mm;
712
+ request->current_mm = NULL;
712713
713714 spin_unlock_irqrestore(&request->lock, flags);
715
+
716
+ rga_request_put_current_mm(current_mm);
714717
715718 rga_dma_fence_signal(request->release_fence, err_code);
716719
....@@ -820,7 +823,14 @@
820823 struct rga_job *job;
821824
822825 for (i = 0; i < request->task_count; i++) {
823
- job = rga_job_commit(&(request->task_list[i]), request);
826
+ struct rga_req *req = &(request->task_list[i]);
827
+
828
+ if (DEBUGGER_EN(MSG)) {
829
+ pr_info("commit request[%d] task[%d]:\n", request->id, i);
830
+ rga_cmd_print_debug_info(req);
831
+ }
832
+
833
+ job = rga_job_commit(req, request);
824834 if (IS_ERR(job)) {
825835 pr_err("request[%d] task[%d] job_commit failed.\n", request->id, i);
826836 rga_request_release_abort(request, PTR_ERR(job));
....@@ -841,12 +851,34 @@
841851 static void rga_request_acquire_fence_signaled_cb(struct dma_fence *fence,
842852 struct dma_fence_cb *_waiter)
843853 {
854
+ int ret;
855
+ unsigned long flags;
856
+ struct mm_struct *current_mm;
844857 struct rga_fence_waiter *waiter = (struct rga_fence_waiter *)_waiter;
845858 struct rga_request *request = (struct rga_request *)waiter->private;
846859 struct rga_pending_request_manager *request_manager = rga_drvdata->pend_request_manager;
847860
848
- if (rga_request_commit(request))
849
- pr_err("rga request[%d] commit failed!\n", request->id);
861
+ ret = rga_request_commit(request);
862
+ if (ret < 0) {
863
+ pr_err("acquire_fence callback: rga request[%d] commit failed!\n", request->id);
864
+
865
+ spin_lock_irqsave(&request->lock, flags);
866
+
867
+ request->is_running = false;
868
+ current_mm = request->current_mm;
869
+ request->current_mm = NULL;
870
+
871
+ spin_unlock_irqrestore(&request->lock, flags);
872
+
873
+ rga_request_put_current_mm(current_mm);
874
+
875
+ /*
876
+ * Since the callback is called while holding &dma_fence.lock,
877
+ * the _locked API is used here.
878
+ */
879
+ if (dma_fence_get_status_locked(request->release_fence) == 0)
880
+ dma_fence_signal_locked(request->release_fence);
881
+ }
850882
851883 mutex_lock(&request_manager->lock);
852884 rga_request_put(request);
....@@ -859,6 +891,7 @@
859891 {
860892 struct rga_pending_request_manager *request_manager;
861893 struct rga_request *request;
894
+ struct mm_struct *current_mm;
862895 int finished_count, failed_count;
863896 bool is_finished = false;
864897 unsigned long flags;
....@@ -895,17 +928,17 @@
895928
896929 spin_unlock_irqrestore(&request->lock, flags);
897930
898
- rga_job_cleanup(job);
899
-
900931 if ((failed_count + finished_count) >= request->task_count) {
901932 spin_lock_irqsave(&request->lock, flags);
902933
903934 request->is_running = false;
904935 request->is_done = true;
905
-
906
- rga_request_put_current_mm(request);
936
+ current_mm = request->current_mm;
937
+ request->current_mm = NULL;
907938
908939 spin_unlock_irqrestore(&request->lock, flags);
940
+
941
+ rga_request_put_current_mm(current_mm);
909942
910943 rga_dma_fence_signal(request->release_fence, request->ret);
911944
....@@ -929,6 +962,13 @@
929962 rga_request_put(request);
930963
931964 mutex_unlock(&request_manager->lock);
965
+
966
+ if (DEBUGGER_EN(TIME))
967
+ pr_info("request[%d], job done total cost time %lld us\n",
968
+ job->request_id,
969
+ ktime_us_delta(ktime_get(), job->timestamp));
970
+
971
+ rga_job_cleanup(job);
932972
933973 return 0;
934974 }
....@@ -1059,6 +1099,9 @@
10591099 int ret = 0;
10601100 unsigned long flags;
10611101 struct dma_fence *release_fence;
1102
+ struct mm_struct *current_mm;
1103
+
1104
+ current_mm = rga_request_get_current_mm(request);
10621105
10631106 spin_lock_irqsave(&request->lock, flags);
10641107
....@@ -1066,14 +1109,16 @@
10661109 spin_unlock_irqrestore(&request->lock, flags);
10671110
10681111 pr_err("can not re-config when request is running\n");
1069
- return -EFAULT;
1112
+ ret = -EFAULT;
1113
+ goto err_put_current_mm;
10701114 }
10711115
10721116 if (request->task_list == NULL) {
10731117 spin_unlock_irqrestore(&request->lock, flags);
10741118
10751119 pr_err("can not find task list from id[%d]\n", request->id);
1076
- return -EINVAL;
1120
+ ret = -EINVAL;
1121
+ goto err_put_current_mm;
10771122 }
10781123
10791124 /* Reset */
....@@ -1081,8 +1126,7 @@
10811126 request->is_done = false;
10821127 request->finished_task_count = 0;
10831128 request->failed_task_count = 0;
1084
-
1085
- rga_request_get_current_mm(request);
1129
+ request->current_mm = current_mm;
10861130
10871131 /* Unlock after ensuring that the current request will not be resubmitted. */
10881132 spin_unlock_irqrestore(&request->lock, flags);
....@@ -1092,7 +1136,7 @@
10921136 if (IS_ERR(release_fence)) {
10931137 pr_err("Can not alloc release fence!\n");
10941138 ret = IS_ERR(release_fence);
1095
- goto error_put_current_mm;
1139
+ goto err_reset_request;
10961140 }
10971141 request->release_fence = release_fence;
10981142
....@@ -1141,13 +1185,16 @@
11411185 request->release_fence = NULL;
11421186 }
11431187
1144
-error_put_current_mm:
1188
+err_reset_request:
11451189 spin_lock_irqsave(&request->lock, flags);
11461190
1147
- rga_request_put_current_mm(request);
1191
+ request->current_mm = NULL;
11481192 request->is_running = false;
11491193
11501194 spin_unlock_irqrestore(&request->lock, flags);
1195
+
1196
+err_put_current_mm:
1197
+ rga_request_put_current_mm(current_mm);
11511198
11521199 return ret;
11531200 }
....@@ -1237,6 +1284,7 @@
12371284 static void rga_request_kref_release(struct kref *ref)
12381285 {
12391286 struct rga_request *request;
1287
+ struct mm_struct *current_mm;
12401288 unsigned long flags;
12411289
12421290 request = container_of(ref, struct rga_request, refcount);
....@@ -1246,16 +1294,22 @@
12461294
12471295 spin_lock_irqsave(&request->lock, flags);
12481296
1249
- rga_request_put_current_mm(request);
12501297 rga_dma_fence_put(request->release_fence);
1298
+ current_mm = request->current_mm;
1299
+ request->current_mm = NULL;
12511300
12521301 if (!request->is_running || request->is_done) {
12531302 spin_unlock_irqrestore(&request->lock, flags);
1303
+
1304
+ rga_request_put_current_mm(current_mm);
1305
+
12541306 goto free_request;
12551307 }
12561308
12571309 spin_unlock_irqrestore(&request->lock, flags);
12581310
1311
+ rga_request_put_current_mm(current_mm);
1312
+
12591313 rga_request_scheduler_job_abort(request);
12601314
12611315 free_request: