video: rockchip: rga3: modify idr

1. idr_alloc uses GFP_NOWAIT.
2. replace idr_alloc with idr_alloc_cyclic.

Signed-off-by: Yu Qiaowei <cerf.yu@rock-chips.com>
Change-Id: I52b7d4580462aa7843113777aa09a79091db4502
This commit is contained in:
Yu Qiaowei
2022-10-18 09:35:30 +08:00
parent c2af7fd006
commit 7ab31ceb53
3 changed files with 38 additions and 16 deletions

View File

@@ -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;

View File

@@ -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);

View File

@@ -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)) {