mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-09 12:17:12 +09:00
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:
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user