提交 8e467e85 编写于 作者: T Tejun Heo 提交者: Linus Torvalds

tidspbridge: convert to idr_alloc()

idr_get_new*() and friends are about to be deprecated.  Convert to the
new idr_alloc() interface.

There are some peculiarities and possible bugs in the converted
functions.  This patch preserves those.

* drv_insert_node_res_element() returns -ENOMEM on alloc failure,
  -EFAULT if id space is exhausted.  -EFAULT is at best misleading.

* drv_proc_insert_strm_res_element() is even weirder.  It returns
  -EFAULT if kzalloc() fails, -ENOMEM if idr preloading fails and
  -EPERM if id space is exhausted.  What's going on here?

* drv_proc_insert_strm_res_element() doesn't free *pstrm_res after
  failure.

Only compile tested.
Signed-off-by: NTejun Heo <tj@kernel.org>
Acked-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Víctor Manuel Jáquez Leal <vjaquez@igalia.com>
Cc: Rene Sapiens <rene.sapiens@ti.com>
Cc: Armando Uribe <x0095078@ti.com>
Cc: Omar Ramirez Luna <omar.ramirez@ti.com>
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 a37c3010
...@@ -76,37 +76,28 @@ int drv_insert_node_res_element(void *hnode, void *node_resource, ...@@ -76,37 +76,28 @@ int drv_insert_node_res_element(void *hnode, void *node_resource,
struct node_res_object **node_res_obj = struct node_res_object **node_res_obj =
(struct node_res_object **)node_resource; (struct node_res_object **)node_resource;
struct process_context *ctxt = (struct process_context *)process_ctxt; struct process_context *ctxt = (struct process_context *)process_ctxt;
int status = 0;
int retval; int retval;
*node_res_obj = kzalloc(sizeof(struct node_res_object), GFP_KERNEL); *node_res_obj = kzalloc(sizeof(struct node_res_object), GFP_KERNEL);
if (!*node_res_obj) { if (!*node_res_obj)
status = -ENOMEM; return -ENOMEM;
goto func_end;
}
(*node_res_obj)->node = hnode; (*node_res_obj)->node = hnode;
retval = idr_get_new(ctxt->node_id, *node_res_obj, retval = idr_alloc(ctxt->node_id, *node_res_obj, 0, 0, GFP_KERNEL);
&(*node_res_obj)->id); if (retval >= 0) {
if (retval == -EAGAIN) { (*node_res_obj)->id = retval;
if (!idr_pre_get(ctxt->node_id, GFP_KERNEL)) { return 0;
pr_err("%s: OUT OF MEMORY\n", __func__);
status = -ENOMEM;
goto func_end;
}
retval = idr_get_new(ctxt->node_id, *node_res_obj,
&(*node_res_obj)->id);
} }
if (retval) {
kfree(*node_res_obj);
if (retval == -ENOSPC) {
pr_err("%s: FAILED, IDR is FULL\n", __func__); pr_err("%s: FAILED, IDR is FULL\n", __func__);
status = -EFAULT; return -EFAULT;
} else {
pr_err("%s: OUT OF MEMORY\n", __func__);
return -ENOMEM;
} }
func_end:
if (status)
kfree(*node_res_obj);
return status;
} }
/* Release all Node resources and its context /* Release all Node resources and its context
...@@ -201,35 +192,26 @@ int drv_proc_insert_strm_res_element(void *stream_obj, ...@@ -201,35 +192,26 @@ int drv_proc_insert_strm_res_element(void *stream_obj,
struct strm_res_object **pstrm_res = struct strm_res_object **pstrm_res =
(struct strm_res_object **)strm_res; (struct strm_res_object **)strm_res;
struct process_context *ctxt = (struct process_context *)process_ctxt; struct process_context *ctxt = (struct process_context *)process_ctxt;
int status = 0;
int retval; int retval;
*pstrm_res = kzalloc(sizeof(struct strm_res_object), GFP_KERNEL); *pstrm_res = kzalloc(sizeof(struct strm_res_object), GFP_KERNEL);
if (*pstrm_res == NULL) { if (*pstrm_res == NULL)
status = -EFAULT; return -EFAULT;
goto func_end;
}
(*pstrm_res)->stream = stream_obj; (*pstrm_res)->stream = stream_obj;
retval = idr_get_new(ctxt->stream_id, *pstrm_res, retval = idr_alloc(ctxt->stream_id, *pstrm_res, 0, 0, GFP_KERNEL);
&(*pstrm_res)->id); if (retval >= 0) {
if (retval == -EAGAIN) { (*pstrm_res)->id = retval;
if (!idr_pre_get(ctxt->stream_id, GFP_KERNEL)) { return 0;
pr_err("%s: OUT OF MEMORY\n", __func__);
status = -ENOMEM;
goto func_end;
}
retval = idr_get_new(ctxt->stream_id, *pstrm_res,
&(*pstrm_res)->id);
} }
if (retval) {
if (retval == -ENOSPC) {
pr_err("%s: FAILED, IDR is FULL\n", __func__); pr_err("%s: FAILED, IDR is FULL\n", __func__);
status = -EPERM; return -EPERM;
} else {
pr_err("%s: OUT OF MEMORY\n", __func__);
return -ENOMEM;
} }
func_end:
return status;
} }
static int drv_proc_free_strm_res(int id, void *p, void *process_ctxt) static int drv_proc_free_strm_res(int id, void *p, void *process_ctxt)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册