From 3fd340d98872c25050945f8ed854a343d360be00 Mon Sep 17 00:00:00 2001 From: Yu Qiaowei Date: Thu, 19 Dec 2024 10:45:01 +0800 Subject: [PATCH] video: rockchip: rga3: avoid multiple drop 'current->mm' Change-Id: I57fbb8800bf3af320a931b54b85a8a53094e6194 Signed-off-by: Yu Qiaowei --- drivers/video/rockchip/rga3/include/rga_job.h | 2 +- drivers/video/rockchip/rga3/rga_job.c | 95 +++++++++---------- 2 files changed, 45 insertions(+), 52 deletions(-) diff --git a/drivers/video/rockchip/rga3/include/rga_job.h b/drivers/video/rockchip/rga3/include/rga_job.h index bdd9ab9ed74a..28bf35bacc55 100644 --- a/drivers/video/rockchip/rga3/include/rga_job.h +++ b/drivers/video/rockchip/rga3/include/rga_job.h @@ -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); diff --git a/drivers/video/rockchip/rga3/rga_job.c b/drivers/video/rockchip/rga3/rga_job.c index 2acbb9d9596d..fd254b587fde 100644 --- a/drivers/video/rockchip/rga3/rga_job.c +++ b/drivers/video/rockchip/rga3/rga_job.c @@ -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)