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