From b7cda70045112583c033229a522dc0a28195c3c9 Mon Sep 17 00:00:00 2001 From: Yu Qiaowei Date: Mon, 24 Oct 2022 11:59:36 +0800 Subject: [PATCH] video: rockchip: rga3: modify the process of session exit When the session exits, there is no need to operate the rga_job directly. Update driver version to 1.2.21 Signed-off-by: Yu Qiaowei Change-Id: I0369dce427dc749795803eae064dc80e33747a7e --- drivers/video/rockchip/rga3/include/rga_drv.h | 2 +- drivers/video/rockchip/rga3/include/rga_job.h | 3 +- drivers/video/rockchip/rga3/rga_drv.c | 24 +------- drivers/video/rockchip/rga3/rga_job.c | 57 +++++++++---------- 4 files changed, 30 insertions(+), 56 deletions(-) diff --git a/drivers/video/rockchip/rga3/include/rga_drv.h b/drivers/video/rockchip/rga3/include/rga_drv.h index 872362c34c97..deee46dc1aad 100644 --- a/drivers/video/rockchip/rga3/include/rga_drv.h +++ b/drivers/video/rockchip/rga3/include/rga_drv.h @@ -87,7 +87,7 @@ #define DRIVER_MAJOR_VERISON 1 #define DRIVER_MINOR_VERSION 2 -#define DRIVER_REVISION_VERSION 20 +#define DRIVER_REVISION_VERSION 21 #define DRIVER_PATCH_VERSION #define DRIVER_VERSION (STR(DRIVER_MAJOR_VERISON) "." STR(DRIVER_MINOR_VERSION) \ diff --git a/drivers/video/rockchip/rga3/include/rga_job.h b/drivers/video/rockchip/rga3/include/rga_job.h index cbbfbd6b54c0..fcb7ddb1f885 100644 --- a/drivers/video/rockchip/rga3/include/rga_job.h +++ b/drivers/video/rockchip/rga3/include/rga_job.h @@ -21,8 +21,6 @@ enum job_flags { RGA_JOB_UNSUPPORT_RGA_MMU = 1 << 4, }; -void rga_job_session_destroy(struct rga_session *session); - void rga_job_scheduler_dump_info(struct rga_scheduler_t *scheduler); void rga_job_done(struct rga_scheduler_t *scheduler, int ret); struct rga_job *rga_job_commit(struct rga_req *rga_command_base, struct rga_request *request); @@ -36,6 +34,7 @@ struct rga_request *rga_request_lookup(struct rga_pending_request_manager *reque uint32_t id); int rga_request_commit(struct rga_request *user_request); +void rga_request_session_destroy_abort(struct rga_session *session); int rga_request_put(struct rga_request *request); void rga_request_get(struct rga_request *request); int rga_request_free(struct rga_request *request); diff --git a/drivers/video/rockchip/rga3/rga_drv.c b/drivers/video/rockchip/rga3/rga_drv.c index 1be32727a2f5..25f757d6dde0 100644 --- a/drivers/video/rockchip/rga3/rga_drv.c +++ b/drivers/video/rockchip/rga3/rga_drv.c @@ -604,29 +604,7 @@ static struct rga_session *rga_session_init(void) static int rga_session_deinit(struct rga_session *session) { - pid_t pid; - int request_id; - struct rga_pending_request_manager *request_manager; - struct rga_request *request; - - pid = current->pid; - - request_manager = rga_drvdata->pend_request_manager; - - mutex_lock(&request_manager->lock); - - idr_for_each_entry(&request_manager->request_idr, request, request_id) { - - if (session == request->session) { - pr_err("[pid:%d] destroy request[%d] when the user exits", - pid, request->id); - rga_request_put(request); - } - } - - mutex_unlock(&request_manager->lock); - - rga_job_session_destroy(session); + rga_request_session_destroy_abort(session); rga_mm_session_release_buffer(session); rga_session_free_remove_idr(session); diff --git a/drivers/video/rockchip/rga3/rga_job.c b/drivers/video/rockchip/rga3/rga_job.c index 6e1d334f3fbb..e9245151709b 100644 --- a/drivers/video/rockchip/rga3/rga_job.c +++ b/drivers/video/rockchip/rga3/rga_job.c @@ -49,35 +49,6 @@ static int rga_job_cleanup(struct rga_job *job) return 0; } -void rga_job_session_destroy(struct rga_session *session) -{ - struct rga_scheduler_t *scheduler = NULL; - struct rga_job *job_pos, *job_q; - int i; - - unsigned long flags; - - for (i = 0; i < rga_drvdata->num_of_scheduler; i++) { - scheduler = rga_drvdata->scheduler[i]; - - spin_lock_irqsave(&scheduler->irq_lock, flags); - - list_for_each_entry_safe(job_pos, job_q, &scheduler->todo_list, head) { - if (session == job_pos->session) { - list_del(&job_pos->head); - - spin_unlock_irqrestore(&scheduler->irq_lock, flags); - - rga_job_cleanup(job_pos); - - spin_lock_irqsave(&scheduler->irq_lock, flags); - } - } - - spin_unlock_irqrestore(&scheduler->irq_lock, flags); - } -} - static int rga_job_judgment_support_core(struct rga_job *job) { int ret = 0; @@ -731,6 +702,31 @@ static void rga_request_release_abort(struct rga_request *request, int err_code) mutex_unlock(&request_manager->lock); } +void rga_request_session_destroy_abort(struct rga_session *session) +{ + int request_id; + struct rga_request *request; + struct rga_pending_request_manager *request_manager; + + request_manager = rga_drvdata->pend_request_manager; + if (request_manager == NULL) { + pr_err("rga_pending_request_manager is null!\n"); + return; + } + + mutex_lock(&request_manager->lock); + + idr_for_each_entry(&request_manager->request_idr, request, request_id) { + if (session == request->session) { + pr_err("[tgid:%d pid:%d] destroy request[%d] when the user exits", + session->tgid, current->pid, request->id); + rga_request_put(request); + } + } + + mutex_unlock(&request_manager->lock); +} + static int rga_request_wait(struct rga_request *request) { int left_time; @@ -1148,10 +1144,11 @@ static void rga_request_kref_release(struct kref *ref) request = container_of(ref, struct rga_request, refcount); if (rga_dma_fence_get_status(request->release_fence) == 0) - rga_dma_fence_signal(request->release_fence, -EEXIST); + rga_dma_fence_signal(request->release_fence, -EFAULT); spin_lock_irqsave(&request->lock, flags); + rga_request_put_current_mm(request); rga_dma_fence_put(request->release_fence); if (!request->is_running || request->is_done) {