summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAngela Stegmaier <angelabaker@ti.com>2010-06-22 18:13:38 -0500
committerRicardo Perez Olivares <x0081762@ti.com>2010-07-16 17:41:48 -0500
commit96dcd8f5b8c9523f5e4333c0e7bd4ae2e5fc1928 (patch)
tree7bf297c5acc08c1a4f48c7b6f49f9f00f5a9ea4d
parent8dd42a3aaf0902dab320d8f4b748ce72af6cf942 (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.h2
-rw-r--r--drivers/dsp/syslink/multicore_ipc/ipc_ioctl.c2
-rw-r--r--drivers/dsp/syslink/multicore_ipc/listmp_ioctl.c170
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;
}