diff options
author | Angela Stegmaier <angelabaker@ti.com> | 2010-06-22 18:13:38 -0500 |
---|---|---|
committer | Ricardo Perez Olivares <x0081762@ti.com> | 2010-07-16 17:41:48 -0500 |
commit | 96dcd8f5b8c9523f5e4333c0e7bd4ae2e5fc1928 (patch) | |
tree | 7bf297c5acc08c1a4f48c7b6f49f9f00f5a9ea4d | |
parent | 8dd42a3aaf0902dab320d8f4b748ce72af6cf942 (diff) |
SYSLINK: ipc- resource cleanup listmp changes
Changes to listmp for resource cleanup.
Signed-off-by: Angela Stegmaier <angelabaker@ti.com>
-rw-r--r-- | arch/arm/plat-omap/include/syslink/listmp_ioctl.h | 2 | ||||
-rw-r--r-- | drivers/dsp/syslink/multicore_ipc/ipc_ioctl.c | 2 | ||||
-rw-r--r-- | drivers/dsp/syslink/multicore_ipc/listmp_ioctl.c | 170 |
3 files changed, 127 insertions, 47 deletions
diff --git a/arch/arm/plat-omap/include/syslink/listmp_ioctl.h b/arch/arm/plat-omap/include/syslink/listmp_ioctl.h index bb0825efcef3..e4fba2409bc3 100644 --- a/arch/arm/plat-omap/include/syslink/listmp_ioctl.h +++ b/arch/arm/plat-omap/include/syslink/listmp_ioctl.h @@ -263,6 +263,6 @@ struct listmp_cmd_args { */ /* ioctl interface function for listmp */ int listmp_ioctl(struct inode *inode, struct file *filp, - unsigned int cmd, unsigned long args); + unsigned int cmd, unsigned long args, bool user); #endif /* _LISTMP_IOCTL_H_ */ diff --git a/drivers/dsp/syslink/multicore_ipc/ipc_ioctl.c b/drivers/dsp/syslink/multicore_ipc/ipc_ioctl.c index ef6e59281a82..3c49a94c71c5 100644 --- a/drivers/dsp/syslink/multicore_ipc/ipc_ioctl.c +++ b/drivers/dsp/syslink/multicore_ipc/ipc_ioctl.c @@ -81,7 +81,7 @@ int ipc_ioc_router(u32 cmd, ulong arg, struct file *filp, bool user) else if (ioc_nr >= GATEMP_BASE_CMD && ioc_nr <= GATEMP_END_CMD) retval = gatemp_ioctl(NULL, filp, cmd, arg, user); else if (ioc_nr >= LISTMP_BASE_CMD && ioc_nr <= LISTMP_END_CMD) - retval = listmp_ioctl(NULL, filp, cmd, arg); + retval = listmp_ioctl(NULL, filp, cmd, arg, user); else if (ioc_nr >= MESSAGEQ_BASE_CMD && ioc_nr <= MESSAGEQ_END_CMD) retval = messageq_ioctl(NULL, filp, cmd, arg); else if (ioc_nr >= IPC_BASE_CMD && ioc_nr <= IPC_END_CMD) diff --git a/drivers/dsp/syslink/multicore_ipc/listmp_ioctl.c b/drivers/dsp/syslink/multicore_ipc/listmp_ioctl.c index 7b2b50e4200f..d220f6f72e8a 100644 --- a/drivers/dsp/syslink/multicore_ipc/listmp_ioctl.c +++ b/drivers/dsp/syslink/multicore_ipc/listmp_ioctl.c @@ -32,6 +32,52 @@ #include <listmp_ioctl.h> #include <sharedregion.h> +static struct resource_info *find_listmp_resource( + struct ipc_process_context *pr_ctxt, + unsigned int cmd, + struct listmp_cmd_args *cargs) +{ + struct resource_info *info = NULL; + bool found = false; + + spin_lock(&pr_ctxt->res_lock); + + list_for_each_entry(info, &pr_ctxt->resources, res) { + struct listmp_cmd_args *args = + (struct listmp_cmd_args *)info->data; + void *handle = NULL; + void *thandle = NULL; + if (cargs != NULL && args != NULL) { + handle = args->args.delete_instance.listmp_handle; + thandle = cargs->args.delete_instance.listmp_handle; + } + if (info->cmd == cmd) { + switch (cmd) { + case CMD_LISTMP_DELETE: + { + if (thandle == handle) + found = true; + break; + } + case CMD_LISTMP_DESTROY: + { + found = true; + break; + } + } + if (found == true) + break; + } + } + + spin_unlock(&pr_ctxt->res_lock); + + if (found == false) + info = NULL; + + return info; +} + /* ioctl interface to listmp_get_config function */ static inline int listmp_ioctl_get_config(struct listmp_cmd_args *cargs) { @@ -441,124 +487,158 @@ exit: /* ioctl interface function for listmp module */ int listmp_ioctl(struct inode *inode, struct file *filp, - unsigned int cmd, unsigned long args) + unsigned int cmd, unsigned long args, bool user) { - int os_status = 0; + int status = 0; struct listmp_cmd_args __user *uarg = (struct listmp_cmd_args __user *)args; struct listmp_cmd_args cargs; unsigned long size; + struct ipc_process_context *pr_ctxt = + (struct ipc_process_context *)filp->private_data; + + if (user == true) { + if (_IOC_DIR(cmd) & _IOC_READ) + status = !access_ok(VERIFY_WRITE, uarg, _IOC_SIZE(cmd)); + else if (_IOC_DIR(cmd) & _IOC_WRITE) + status = !access_ok(VERIFY_READ, uarg, _IOC_SIZE(cmd)); + if (status) { + status = -EFAULT; + goto exit; + } - if (_IOC_DIR(cmd) & _IOC_READ) - os_status = !access_ok(VERIFY_WRITE, uarg, _IOC_SIZE(cmd)); - else if (_IOC_DIR(cmd) & _IOC_WRITE) - os_status = !access_ok(VERIFY_READ, uarg, _IOC_SIZE(cmd)); - if (os_status) { - os_status = -EFAULT; - goto exit; - } - - /* Copy the full args from user-side */ - size = copy_from_user(&cargs, uarg, sizeof(struct listmp_cmd_args)); - if (size) { - os_status = -EFAULT; - goto exit; + /* Copy the full args from user-side */ + size = copy_from_user(&cargs, uarg, + sizeof(struct listmp_cmd_args)); + if (size) { + status = -EFAULT; + goto exit; + } + } else { + if (args != 0) + memcpy(&cargs, (void *)args, + sizeof(struct listmp_cmd_args)); } switch (cmd) { case CMD_LISTMP_GETCONFIG: - os_status = listmp_ioctl_get_config(&cargs); + status = listmp_ioctl_get_config(&cargs); break; case CMD_LISTMP_SETUP: - os_status = listmp_ioctl_setup(&cargs); + status = listmp_ioctl_setup(&cargs); + if (status >= 0) + add_pr_res(pr_ctxt, CMD_LISTMP_DESTROY, NULL); break; case CMD_LISTMP_DESTROY: - os_status = listmp_ioctl_destroy(&cargs); + { + struct resource_info *info = NULL; + info = find_listmp_resource(pr_ctxt, CMD_LISTMP_DESTROY, + &cargs); + status = listmp_ioctl_destroy(&cargs); + remove_pr_res(pr_ctxt, info); break; + } case CMD_LISTMP_PARAMS_INIT: - os_status = listmp_ioctl_params_init(&cargs); + status = listmp_ioctl_params_init(&cargs); break; case CMD_LISTMP_CREATE: - os_status = listmp_ioctl_create(&cargs); + status = listmp_ioctl_create(&cargs); + if (status >= 0) { + struct listmp_cmd_args *temp = kmalloc( + sizeof(struct listmp_cmd_args), + GFP_KERNEL); + temp->args.delete_instance.listmp_handle = + cargs.args.create.listmp_handle; + add_pr_res(pr_ctxt, CMD_LISTMP_DELETE, (void *)temp); + } break; case CMD_LISTMP_DELETE: - os_status = listmp_ioctl_delete(&cargs); + { + struct resource_info *info = NULL; + info = find_listmp_resource(pr_ctxt, CMD_LISTMP_DELETE, + &cargs); + status = listmp_ioctl_delete(&cargs); + remove_pr_res(pr_ctxt, info); break; + } case CMD_LISTMP_OPEN: - os_status = listmp_ioctl_open(&cargs); + status = listmp_ioctl_open(&cargs); break; case CMD_LISTMP_CLOSE: - os_status = listmp_ioctl_close(&cargs); + status = listmp_ioctl_close(&cargs); break; case CMD_LISTMP_ISEMPTY: - os_status = listmp_ioctl_isempty(&cargs); + status = listmp_ioctl_isempty(&cargs); break; case CMD_LISTMP_GETHEAD: - os_status = listmp_ioctl_get_head(&cargs); + status = listmp_ioctl_get_head(&cargs); break; case CMD_LISTMP_GETTAIL: - os_status = listmp_ioctl_get_tail(&cargs); + status = listmp_ioctl_get_tail(&cargs); break; case CMD_LISTMP_PUTHEAD: - os_status = listmp_ioctl_put_head(&cargs); + status = listmp_ioctl_put_head(&cargs); break; case CMD_LISTMP_PUTTAIL: - os_status = listmp_ioctl_put_tail(&cargs); + status = listmp_ioctl_put_tail(&cargs); break; case CMD_LISTMP_INSERT: - os_status = listmp_ioctl_insert(&cargs); + status = listmp_ioctl_insert(&cargs); break; case CMD_LISTMP_REMOVE: - os_status = listmp_ioctl_remove(&cargs); + status = listmp_ioctl_remove(&cargs); break; case CMD_LISTMP_NEXT: - os_status = listmp_ioctl_next(&cargs); + status = listmp_ioctl_next(&cargs); break; case CMD_LISTMP_PREV: - os_status = listmp_ioctl_prev(&cargs); + status = listmp_ioctl_prev(&cargs); break; case CMD_LISTMP_SHAREDMEMREQ: - os_status = listmp_ioctl_shared_mem_req(&cargs); + status = listmp_ioctl_shared_mem_req(&cargs); break; case CMD_LISTMP_OPENBYADDR: - os_status = listmp_ioctl_open_by_addr(&cargs); + status = listmp_ioctl_open_by_addr(&cargs); break; default: WARN_ON(cmd); - os_status = -ENOTTY; + status = -ENOTTY; break; } - if (os_status < 0) + if (status < 0) goto exit; - /* Copy the full args to the user-side. */ - size = copy_to_user(uarg, &cargs, sizeof(struct listmp_cmd_args)); - if (size) { - os_status = -EFAULT; - goto exit; + if (user == true) { + /* Copy the full args to the user-side. */ + size = copy_to_user(uarg, &cargs, + sizeof(struct listmp_cmd_args)); + if (size) { + status = -EFAULT; + goto exit; + } } - return os_status; + return status; exit: - printk(KERN_ERR "listmp_ioctl failed: status = 0x%x\n", os_status); - return os_status; + printk(KERN_ERR "listmp_ioctl failed: status = 0x%x\n", status); + return status; } |