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: Tejun Heo <tj@kernel.org> Acked-by: Greg 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: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Родитель
a37c301000
Коммит
8e467e855c
|
@ -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_resource;
|
||||
struct process_context *ctxt = (struct process_context *)process_ctxt;
|
||||
int status = 0;
|
||||
int retval;
|
||||
|
||||
*node_res_obj = kzalloc(sizeof(struct node_res_object), GFP_KERNEL);
|
||||
if (!*node_res_obj) {
|
||||
status = -ENOMEM;
|
||||
goto func_end;
|
||||
}
|
||||
if (!*node_res_obj)
|
||||
return -ENOMEM;
|
||||
|
||||
(*node_res_obj)->node = hnode;
|
||||
retval = idr_get_new(ctxt->node_id, *node_res_obj,
|
||||
&(*node_res_obj)->id);
|
||||
if (retval == -EAGAIN) {
|
||||
if (!idr_pre_get(ctxt->node_id, GFP_KERNEL)) {
|
||||
pr_err("%s: OUT OF MEMORY\n", __func__);
|
||||
status = -ENOMEM;
|
||||
goto func_end;
|
||||
retval = idr_alloc(ctxt->node_id, *node_res_obj, 0, 0, GFP_KERNEL);
|
||||
if (retval >= 0) {
|
||||
(*node_res_obj)->id = retval;
|
||||
return 0;
|
||||
}
|
||||
|
||||
retval = idr_get_new(ctxt->node_id, *node_res_obj,
|
||||
&(*node_res_obj)->id);
|
||||
}
|
||||
if (retval) {
|
||||
pr_err("%s: FAILED, IDR is FULL\n", __func__);
|
||||
status = -EFAULT;
|
||||
}
|
||||
func_end:
|
||||
if (status)
|
||||
kfree(*node_res_obj);
|
||||
|
||||
return status;
|
||||
if (retval == -ENOSPC) {
|
||||
pr_err("%s: FAILED, IDR is FULL\n", __func__);
|
||||
return -EFAULT;
|
||||
} else {
|
||||
pr_err("%s: OUT OF MEMORY\n", __func__);
|
||||
return -ENOMEM;
|
||||
}
|
||||
}
|
||||
|
||||
/* Release all Node resources and its context
|
||||
|
@ -201,35 +192,26 @@ int drv_proc_insert_strm_res_element(void *stream_obj,
|
|||
struct strm_res_object **pstrm_res =
|
||||
(struct strm_res_object **)strm_res;
|
||||
struct process_context *ctxt = (struct process_context *)process_ctxt;
|
||||
int status = 0;
|
||||
int retval;
|
||||
|
||||
*pstrm_res = kzalloc(sizeof(struct strm_res_object), GFP_KERNEL);
|
||||
if (*pstrm_res == NULL) {
|
||||
status = -EFAULT;
|
||||
goto func_end;
|
||||
}
|
||||
if (*pstrm_res == NULL)
|
||||
return -EFAULT;
|
||||
|
||||
(*pstrm_res)->stream = stream_obj;
|
||||
retval = idr_get_new(ctxt->stream_id, *pstrm_res,
|
||||
&(*pstrm_res)->id);
|
||||
if (retval == -EAGAIN) {
|
||||
if (!idr_pre_get(ctxt->stream_id, GFP_KERNEL)) {
|
||||
pr_err("%s: OUT OF MEMORY\n", __func__);
|
||||
status = -ENOMEM;
|
||||
goto func_end;
|
||||
retval = idr_alloc(ctxt->stream_id, *pstrm_res, 0, 0, GFP_KERNEL);
|
||||
if (retval >= 0) {
|
||||
(*pstrm_res)->id = retval;
|
||||
return 0;
|
||||
}
|
||||
|
||||
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__);
|
||||
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)
|
||||
|
|
Загрузка…
Ссылка в новой задаче