video: rockchip: rga3: avoid multiple drop 'current->mm'

Change-Id: I57fbb8800bf3af320a931b54b85a8a53094e6194
Signed-off-by: Yu Qiaowei <cerf.yu@rock-chips.com>
This commit is contained in:
Yu Qiaowei
2024-12-19 10:45:01 +08:00
parent 6c5d0a72ce
commit 3fd340d988
2 changed files with 45 additions and 52 deletions

View File

@@ -27,7 +27,7 @@ enum job_flags {
void rga_job_scheduler_dump_info(struct rga_scheduler_t *scheduler);
void rga_job_next(struct rga_scheduler_t *scheduler);
struct rga_job *rga_job_done(struct rga_scheduler_t *scheduler);
struct rga_job *rga_job_commit(struct rga_req *rga_command_base, struct rga_request *request);
int rga_job_commit(struct rga_req *rga_command_base, struct rga_request *request);
int rga_job_mpi_commit(struct rga_req *rga_command_base, struct rga_request *request);
int rga_job_assign(struct rga_job *job);

View File

@@ -403,7 +403,7 @@ static struct rga_scheduler_t *rga_job_schedule(struct rga_job *job)
return scheduler;
}
struct rga_job *rga_job_commit(struct rga_req *rga_command_base, struct rga_request *request)
int rga_job_commit(struct rga_req *rga_command_base, struct rga_request *request)
{
int ret;
struct rga_job *job = NULL;
@@ -412,7 +412,7 @@ struct rga_job *rga_job_commit(struct rga_req *rga_command_base, struct rga_requ
job = rga_job_alloc(rga_command_base);
if (!job) {
rga_err("failed to alloc rga job!\n");
return ERR_PTR(-ENOMEM);
return -ENOMEM;
}
job->use_batch_mode = request->use_batch_mode;
@@ -458,7 +458,7 @@ struct rga_job *rga_job_commit(struct rga_req *rga_command_base, struct rga_requ
rga_power_disable(scheduler);
return job;
return 0;
err_unmap_job_info:
rga_mm_unmap_job_info(job);
@@ -472,9 +472,9 @@ err_free_cmd_buf:
err_free_job:
ret = job->ret;
rga_request_release_signal(scheduler, job);
rga_job_free(job);
return ERR_PTR(ret);
return ret;
}
static bool rga_is_need_current_mm(struct rga_req *req)
@@ -908,20 +908,15 @@ static int rga_request_wait(struct rga_request *request)
switch (left_time) {
case 0:
ret = rga_request_timeout_query_state(request);
goto err_request_abort;
break;
case -ERESTARTSYS:
ret = -ERESTARTSYS;
goto err_request_abort;
break;
default:
ret = request->ret;
break;
}
return ret;
err_request_abort:
rga_request_release_abort(request, ret);
return ret;
}
@@ -929,7 +924,6 @@ int rga_request_commit(struct rga_request *request)
{
int ret;
int i = 0;
struct rga_job *job;
if (DEBUGGER_EN(MSG))
rga_req_log(request, "commit process: %s\n", request->session->pname);
@@ -942,12 +936,11 @@ int rga_request_commit(struct rga_request *request)
rga_dump_req(request, req);
}
job = rga_job_commit(req, request);
if (IS_ERR(job)) {
ret = rga_job_commit(req, request);
if (ret < 0) {
rga_req_err(request, "task[%d] job_commit failed.\n", i);
rga_request_release_abort(request, PTR_ERR(job));
return PTR_ERR(job);
return ret;
}
}
@@ -1220,9 +1213,6 @@ int rga_request_submit(struct rga_request *request)
int ret = 0;
unsigned long flags;
struct dma_fence *release_fence;
struct mm_struct *current_mm;
current_mm = rga_request_get_current_mm(request);
spin_lock_irqsave(&request->lock, flags);
@@ -1231,7 +1221,7 @@ int rga_request_submit(struct rga_request *request)
rga_req_err(request, "can not re-config when request is running\n");
ret = -EFAULT;
goto err_put_current_mm;
goto err_abort_request;
}
if (request->task_list == NULL) {
@@ -1239,7 +1229,7 @@ int rga_request_submit(struct rga_request *request)
rga_req_err(request, "can not find task list\n");
ret = -EINVAL;
goto err_put_current_mm;
goto err_abort_request;
}
/* Reset */
@@ -1248,7 +1238,6 @@ int rga_request_submit(struct rga_request *request)
request->finished_task_count = 0;
request->failed_task_count = 0;
request->ret = 0;
request->current_mm = current_mm;
/* Unlock after ensuring that the current request will not be resubmitted. */
spin_unlock_irqrestore(&request->lock, flags);
@@ -1258,8 +1247,10 @@ int rga_request_submit(struct rga_request *request)
if (IS_ERR_OR_NULL(release_fence)) {
rga_req_err(request, "Can not alloc release fence!\n");
ret = IS_ERR(release_fence) ? PTR_ERR(release_fence) : -EINVAL;
goto err_reset_request;
goto err_abort_request;
}
request->current_mm = rga_request_get_current_mm(request);
request->release_fence = release_fence;
if (request->acquire_fence_fd > 0) {
@@ -1276,16 +1267,22 @@ int rga_request_submit(struct rga_request *request)
} else {
rga_req_err(request, "Failed to add callback with acquire fence fd[%d]!\n",
request->acquire_fence_fd);
goto err_put_release_fence;
rga_dma_fence_put(request->release_fence);
request->release_fence = NULL;
goto err_put_current_mm;
}
}
} else {
request->current_mm = rga_request_get_current_mm(request);
request->release_fence = NULL;
}
request_commit:
ret = rga_request_commit(request);
if (ret < 0) {
rga_req_err(request, "request commit failed!\n");
goto err_put_release_fence;
goto err_put_current_mm;
}
export_release_fence_fd:
@@ -1293,8 +1290,7 @@ export_release_fence_fd:
ret = rga_dma_fence_get_fd(request->release_fence);
if (ret < 0) {
rga_req_err(request, "Failed to alloc release fence fd!\n");
rga_request_release_abort(request, ret);
return ret;
goto err_put_current_mm;
}
request->release_fence_fd = ret;
@@ -1302,22 +1298,12 @@ export_release_fence_fd:
return 0;
err_put_release_fence:
if (request->release_fence != NULL) {
rga_dma_fence_put(request->release_fence);
request->release_fence = NULL;
}
err_reset_request:
spin_lock_irqsave(&request->lock, flags);
request->current_mm = NULL;
request->is_running = false;
spin_unlock_irqrestore(&request->lock, flags);
err_put_current_mm:
rga_request_put_current_mm(current_mm);
rga_request_put_current_mm(request->current_mm);
request->current_mm = NULL;
err_abort_request:
rga_request_release_abort(request, ret);
return ret;
}
@@ -1325,7 +1311,6 @@ err_put_current_mm:
int rga_request_mpi_submit(struct rga_req *req, struct rga_request *request)
{
int ret = 0;
struct rga_job *job = NULL;
unsigned long flags;
struct rga_pending_request_manager *request_manager;
@@ -1333,7 +1318,8 @@ int rga_request_mpi_submit(struct rga_req *req, struct rga_request *request)
if (request->sync_mode == RGA_BLIT_ASYNC) {
rga_req_err(request, "mpi unsupported async mode!\n");
return -EINVAL;
ret = -EINVAL;
goto err_abort_request;
}
spin_lock_irqsave(&request->lock, flags);
@@ -1341,13 +1327,15 @@ int rga_request_mpi_submit(struct rga_req *req, struct rga_request *request)
if (request->is_running) {
rga_req_err(request, "can not re-config when request is running");
spin_unlock_irqrestore(&request->lock, flags);
return -EFAULT;
ret = -EFAULT;
goto err_abort_request;
}
if (request->task_list == NULL) {
rga_req_err(request, "can not find task list");
spin_unlock_irqrestore(&request->lock, flags);
return -EINVAL;
ret = -EINVAL;
goto err_abort_request;
}
/* Reset */
@@ -1367,17 +1355,22 @@ int rga_request_mpi_submit(struct rga_req *req, struct rga_request *request)
rga_request_get(request);
mutex_unlock(&request_manager->lock);
job = rga_job_commit(req, request);
if (IS_ERR_OR_NULL(job)) {
ret = rga_job_commit(req, request);
if (ret < 0) {
rga_req_err(request, "failed to commit job!\n");
return job ? PTR_ERR(job) : -EFAULT;
goto err_abort_request;
}
ret = rga_request_wait(request);
if (ret < 0)
return ret;
goto err_abort_request;
return 0;
err_abort_request:
rga_request_release_abort(request, ret);
return ret;
}
int rga_request_free(struct rga_request *request)