From 7ab31ceb53206cd2b4738a93a597ce59794d01fc Mon Sep 17 00:00:00 2001 From: Yu Qiaowei Date: Tue, 18 Oct 2022 09:35:30 +0800 Subject: [PATCH] video: rockchip: rga3: modify idr 1. idr_alloc uses GFP_NOWAIT. 2. replace idr_alloc with idr_alloc_cyclic. Signed-off-by: Yu Qiaowei Change-Id: I52b7d4580462aa7843113777aa09a79091db4502 --- drivers/video/rockchip/rga3/rga_drv.c | 34 ++++++++++++++++++++------- drivers/video/rockchip/rga3/rga_job.c | 11 +++++---- drivers/video/rockchip/rga3/rga_mm.c | 9 +++++-- 3 files changed, 38 insertions(+), 16 deletions(-) diff --git a/drivers/video/rockchip/rga3/rga_drv.c b/drivers/video/rockchip/rga3/rga_drv.c index 576b460f91f3..1be32727a2f5 100644 --- a/drivers/video/rockchip/rga3/rga_drv.c +++ b/drivers/video/rockchip/rga3/rga_drv.c @@ -270,8 +270,8 @@ int rga_kernel_commit(struct rga_req *cmd) struct rga_pending_request_manager *request_manager = rga_drvdata->pend_request_manager; session = rga_session_init(); - if (!session) - return -ENOMEM; + if (IS_ERR(session)) + return PTR_ERR(session); request_id = rga_request_alloc(0, session); if (request_id < 0) { @@ -561,22 +561,38 @@ static int rga_session_manager_remove(struct rga_session_manager **session_manag static struct rga_session *rga_session_init(void) { + int new_id; + struct rga_session_manager *session_manager = NULL; - struct rga_session *session = kzalloc(sizeof(*session), GFP_KERNEL); + struct rga_session *session = NULL; session_manager = rga_drvdata->session_manager; if (session_manager == NULL) { pr_err("rga_session_manager is null!\n"); - kfree(session); - return NULL; + return ERR_PTR(-EFAULT); + } + + session = kzalloc(sizeof(*session), GFP_KERNEL); + if (!session) { + pr_err("rga_session alloc failed\n"); + return ERR_PTR(-ENOMEM); } mutex_lock(&session_manager->lock); idr_preload(GFP_KERNEL); - session->id = idr_alloc(&session_manager->ctx_id_idr, session, 1, 0, GFP_ATOMIC); - session_manager->session_cnt++; + new_id = idr_alloc_cyclic(&session_manager->ctx_id_idr, session, 1, 0, GFP_NOWAIT); idr_preload_end(); + if (new_id < 0) { + mutex_unlock(&session_manager->lock); + + pr_err("rga_session alloc id failed!\n"); + kfree(session); + return ERR_PTR(new_id); + } + + session->id = new_id; + session_manager->session_cnt++; mutex_unlock(&session_manager->lock); @@ -1140,8 +1156,8 @@ static int rga_open(struct inode *inode, struct file *file) struct rga_session *session = NULL; session = rga_session_init(); - if (!session) - return -ENOMEM; + if (IS_ERR(session)) + return PTR_ERR(session); file->private_data = (void *)session; diff --git a/drivers/video/rockchip/rga3/rga_job.c b/drivers/video/rockchip/rga3/rga_job.c index a89b465e3585..729b46138f9f 100644 --- a/drivers/video/rockchip/rga3/rga_job.c +++ b/drivers/video/rockchip/rga3/rga_job.c @@ -1188,6 +1188,7 @@ static int rga_request_free_cb(int id, void *ptr, void *data) int rga_request_alloc(uint32_t flags, struct rga_session *session) { + int new_id; struct rga_pending_request_manager *request_manager; struct rga_request *request; @@ -1218,17 +1219,17 @@ int rga_request_alloc(uint32_t flags, struct rga_session *session) mutex_lock(&request_manager->lock); idr_preload(GFP_KERNEL); - request->id = idr_alloc(&request_manager->request_idr, request, 1, 0, GFP_KERNEL); + new_id = idr_alloc_cyclic(&request_manager->request_idr, request, 1, 0, GFP_NOWAIT); idr_preload_end(); - - if (request->id <= 0) { - pr_err("alloc request_id failed!\n"); + if (new_id < 0) { + pr_err("request alloc id failed!\n"); mutex_unlock(&request_manager->lock); kfree(request); - return -EFAULT; + return new_id; } + request->id = new_id; request_manager->request_count++; mutex_unlock(&request_manager->lock); diff --git a/drivers/video/rockchip/rga3/rga_mm.c b/drivers/video/rockchip/rga3/rga_mm.c index 7d59472d0888..6183aa11db47 100644 --- a/drivers/video/rockchip/rga3/rga_mm.c +++ b/drivers/video/rockchip/rga3/rga_mm.c @@ -1869,7 +1869,7 @@ void rga_mm_unmap_job_info(struct rga_job *job) uint32_t rga_mm_import_buffer(struct rga_external_buffer *external_buffer, struct rga_session *session) { - int ret = 0; + int ret = 0, new_id; struct rga_mm *mm; struct rga_internal_buffer *internal_buffer; @@ -1911,9 +1911,14 @@ uint32_t rga_mm_import_buffer(struct rga_external_buffer *external_buffer, * allocation under our spinlock. */ idr_preload(GFP_KERNEL); - internal_buffer->handle = idr_alloc(&mm->memory_idr, internal_buffer, 1, 0, GFP_KERNEL); + new_id = idr_alloc_cyclic(&mm->memory_idr, internal_buffer, 1, 0, GFP_NOWAIT); idr_preload_end(); + if (new_id < 0) { + pr_err("internal_buffer alloc id failed!\n"); + goto FREE_INTERNAL_BUFFER; + } + internal_buffer->handle = new_id; mm->buffer_count++; if (DEBUGGER_EN(MM)) {